Skip to content

Commit 9fabcd0

Browse files
committed
fixup! Pass HRNResolver or DomainResolver into OnionMessenger
Use DNSHrnResolver for local resolution when node is a bLIP-32 service. node can be a bLIP-32 service only if it can be announced.
1 parent 3ccf481 commit 9fabcd0

3 files changed

Lines changed: 114 additions & 59 deletions

File tree

src/builder.rs

Lines changed: 72 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use std::collections::HashMap;
99
use std::convert::TryInto;
1010
use std::default::Default;
1111
use std::path::PathBuf;
12-
use std::sync::{Arc, Mutex, Once, RwLock};
12+
use std::sync::{Arc, Mutex, Once, RwLock, Weak};
1313
use std::time::SystemTime;
1414
use std::{fmt, fs};
1515

@@ -19,6 +19,7 @@ use bitcoin::bip32::{ChildNumber, Xpriv};
1919
use bitcoin::key::Secp256k1;
2020
use bitcoin::secp256k1::PublicKey;
2121
use bitcoin::{BlockHash, Network};
22+
use bitcoin_payment_instructions::dns_resolver::DNSHrnResolver;
2223
use bitcoin_payment_instructions::onion_message_resolver::LDKOnionMessageDNSSECHrnResolver;
2324
use lightning::chain::{chainmonitor, BestBlock};
2425
use lightning::ln::channelmanager::{self, ChainParameters, ChannelManagerReadArgs};
@@ -47,7 +48,7 @@ use vss_client::headers::VssHeaderProvider;
4748
use crate::chain::ChainSource;
4849
use crate::config::{
4950
default_user_config, may_announce_channel, AnnounceError, AsyncPaymentsRole,
50-
BitcoindRestClientConfig, Config, ElectrumSyncConfig, EsploraSyncConfig,
51+
BitcoindRestClientConfig, Config, ElectrumSyncConfig, EsploraSyncConfig, HRNResolverConfig,
5152
DEFAULT_ESPLORA_SERVER_URL, DEFAULT_LOG_FILENAME, DEFAULT_LOG_LEVEL,
5253
};
5354
use crate::connection::ConnectionManager;
@@ -77,9 +78,9 @@ use crate::peer_store::PeerStore;
7778
use crate::runtime::{Runtime, RuntimeSpawner};
7879
use crate::tx_broadcaster::TransactionBroadcaster;
7980
use crate::types::{
80-
AsyncPersister, ChainMonitor, ChannelManager, DomainResolver, DynStore, DynStoreWrapper,
81-
GossipSync, Graph, HRNResolver, KeysManager, MessageRouter, OnionMessenger, PaymentStore,
82-
PeerManager, PendingPaymentStore, Persister, SyncAndAsyncKVStore,
81+
AsyncPersister, ChainMonitor, ChannelManager, DynStore, DynStoreWrapper, GossipSync, Graph,
82+
HRNResolver, KeysManager, MessageRouter, OnionMessenger, PaymentStore, PeerManager,
83+
PendingPaymentStore, Persister, SyncAndAsyncKVStore,
8384
};
8485
use crate::wallet::persist::KVStoreWalletPersister;
8586
use crate::wallet::Wallet;
@@ -234,12 +235,6 @@ impl fmt::Display for BuildError {
234235

235236
impl std::error::Error for BuildError {}
236237

237-
enum Resolver {
238-
HRN(Arc<HRNResolver>),
239-
DNS(Arc<DomainResolver>),
240-
Ignore(Arc<IgnoringMessageHandler>),
241-
}
242-
243238
/// A builder for an [`Node`] instance, allowing to set some configuration and module choices from
244239
/// the getgo.
245240
///
@@ -1530,32 +1525,66 @@ fn build_with_store_internal(
15301525
})?;
15311526
}
15321527

1533-
let resolver = if let Some(hrn_config) = &config.hrn_config {
1534-
if hrn_config.is_hrn_resolver {
1535-
let dns_addr = hrn_config.dns_server_address.as_str();
1536-
1537-
Resolver::DNS(Arc::new(OMDomainResolver::ignoring_incoming_proofs(
1538-
dns_addr.parse().map_err(|_| BuildError::DNSResolverSetupFailed)?,
1539-
)))
1540-
} else {
1541-
Resolver::HRN(Arc::new(LDKOnionMessageDNSSECHrnResolver::new(Arc::clone(
1542-
&network_graph,
1543-
))))
1544-
}
1545-
} else {
1546-
// hrn_config is None, default to the IgnoringMessaageHandler.
1547-
Resolver::Ignore(Arc::new(IgnoringMessageHandler {}))
1548-
};
1528+
let peer_manager_hook: Arc<Mutex<Option<Weak<PeerManager>>>> = Arc::new(Mutex::new(None));
1529+
let mut hrn_resolver_out = None;
1530+
1531+
let om_resolver = match &config.hrn_config {
1532+
None => Arc::new(IgnoringMessageHandler {}),
1533+
Some(hrn_config) => {
1534+
let client_resolver: Arc<dyn DNSResolverMessageHandler + Send + Sync> =
1535+
match &hrn_config.client_resolution_config {
1536+
HRNResolverConfig::Blip32Onion => {
1537+
let hrn_res = Arc::new(LDKOnionMessageDNSSECHrnResolver::new(Arc::clone(
1538+
&network_graph,
1539+
)));
1540+
hrn_resolver_out = Some(Arc::new(HRNResolver::Onion(Arc::clone(&hrn_res))));
1541+
1542+
let pm_hook_clone = Arc::clone(&peer_manager_hook);
1543+
hrn_res.register_post_queue_action(Box::new(move || {
1544+
if let Ok(guard) = pm_hook_clone.lock() {
1545+
if let Some(weak_pm) = &*guard {
1546+
if let Some(pm) = weak_pm.upgrade() {
1547+
pm.process_events();
1548+
}
1549+
}
1550+
}
1551+
}));
1552+
1553+
hrn_res
1554+
},
1555+
HRNResolverConfig::LocalDns { dns_server_address } => {
1556+
let addr = dns_server_address
1557+
.parse()
1558+
.map_err(|_| BuildError::DNSResolverSetupFailed)?;
1559+
let hrn_res = Arc::new(DNSHrnResolver(addr));
1560+
hrn_resolver_out = Some(Arc::new(HRNResolver::Local(hrn_res)));
1561+
Arc::new(OMDomainResolver::ignoring_incoming_proofs(addr))
1562+
},
1563+
};
1564+
1565+
let should_act_as_service = if hrn_config.disable_hrn_resolution_service {
1566+
false
1567+
} else if may_announce_channel(&config).is_ok() {
1568+
true
1569+
} else {
1570+
false
1571+
};
15491572

1550-
let om_resolver = match resolver {
1551-
Resolver::DNS(ref dns_resolver) => {
1552-
Arc::clone(dns_resolver) as Arc<dyn DNSResolverMessageHandler + Send + Sync>
1553-
},
1554-
Resolver::HRN(ref hrn_resolver) => {
1555-
Arc::clone(hrn_resolver) as Arc<dyn DNSResolverMessageHandler + Send + Sync>
1556-
},
1557-
Resolver::Ignore(ref ignoring_handler) => {
1558-
Arc::clone(ignoring_handler) as Arc<dyn DNSResolverMessageHandler + Send + Sync>
1573+
if should_act_as_service {
1574+
if let HRNResolverConfig::LocalDns { dns_server_address } =
1575+
&hrn_config.client_resolution_config
1576+
{
1577+
let service_dns_addr = dns_server_address
1578+
.parse()
1579+
.map_err(|_| BuildError::DNSResolverSetupFailed)?;
1580+
Arc::new(OMDomainResolver::new(service_dns_addr, Some(client_resolver)))
1581+
} else {
1582+
log_error!(logger, "To act as an HRN resolution service, the DNS resolver must be configured to use a DNS server.");
1583+
return Err(BuildError::DNSResolverSetupFailed);
1584+
}
1585+
} else {
1586+
client_resolver
1587+
}
15591588
},
15601589
};
15611590

@@ -1703,7 +1732,7 @@ fn build_with_store_internal(
17031732
BuildError::InvalidSystemTime
17041733
})?;
17051734

1706-
let peer_manager = Arc::new(PeerManager::new(
1735+
let peer_manager: Arc<PeerManager> = Arc::new(PeerManager::new(
17071736
msg_handler,
17081737
cur_time.as_secs().try_into().map_err(|e| {
17091738
log_error!(logger, "Failed to get current time: {}", e);
@@ -1714,20 +1743,11 @@ fn build_with_store_internal(
17141743
Arc::clone(&keys_manager),
17151744
));
17161745

1717-
let peer_manager_clone = Arc::downgrade(&peer_manager);
1718-
1719-
let hrn_resolver = match resolver {
1720-
Resolver::DNS(_) => None,
1721-
Resolver::HRN(ref hrn_resolver) => {
1722-
hrn_resolver.register_post_queue_action(Box::new(move || {
1723-
if let Some(upgraded_pointer) = peer_manager_clone.upgrade() {
1724-
upgraded_pointer.process_events();
1725-
}
1726-
}));
1727-
Some(hrn_resolver)
1728-
},
1729-
Resolver::Ignore(_) => None,
1730-
};
1746+
if let Ok(mut guard) = peer_manager_hook.lock() {
1747+
*guard = Some(Arc::downgrade(&peer_manager));
1748+
} else {
1749+
return Err(BuildError::DNSResolverSetupFailed);
1750+
}
17311751

17321752
liquidity_source.as_ref().map(|l| l.set_peer_manager(Arc::downgrade(&peer_manager)));
17331753

@@ -1834,7 +1854,7 @@ fn build_with_store_internal(
18341854
node_metrics,
18351855
om_mailbox,
18361856
async_payments_role,
1837-
hrn_resolver: hrn_resolver.cloned(),
1857+
hrn_resolver: hrn_resolver_out,
18381858
#[cfg(cycle_tests)]
18391859
_leak_checker,
18401860
})

src/payment/unified.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,7 @@ impl UnifiedPayment {
195195
self.config.network
196196
};
197197

198-
let parse_fut =
199-
PaymentInstructions::parse(uri_str, target_network, resolver.as_ref(), false);
198+
let parse_fut = PaymentInstructions::parse(uri_str, target_network, &*resolver, false);
200199

201200
let instructions =
202201
tokio::time::timeout(Duration::from_secs(HRN_RESOLUTION_TIMEOUT_SECS), parse_fut)
@@ -222,7 +221,7 @@ impl UnifiedPayment {
222221
Error::InvalidAmount
223222
})?;
224223

225-
let fut = instr.set_amount(amt, resolver.as_ref());
224+
let fut = instr.set_amount(amt, &*resolver);
226225

227226
tokio::time::timeout(Duration::from_secs(HRN_RESOLUTION_TIMEOUT_SECS), fut)
228227
.await

src/types.rs

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,16 @@ use std::future::Future;
1010
use std::pin::Pin;
1111
use std::sync::{Arc, Mutex};
1212

13+
use bitcoin_payment_instructions::amount::Amount;
14+
use bitcoin_payment_instructions::dns_resolver::DNSHrnResolver;
15+
use bitcoin_payment_instructions::onion_message_resolver::LDKOnionMessageDNSSECHrnResolver;
16+
use bitcoin_payment_instructions::hrn_resolution::{
17+
HrnResolutionFuture, HrnResolver, HumanReadableName, LNURLResolutionFuture,
18+
};
19+
1320
use bitcoin::secp256k1::PublicKey;
1421
use bitcoin::{OutPoint, ScriptBuf};
15-
use bitcoin_payment_instructions::onion_message_resolver::LDKOnionMessageDNSSECHrnResolver;
22+
1623
use lightning::chain::chainmonitor;
1724
use lightning::impl_writeable_tlv_based;
1825
use lightning::ln::channel_state::ChannelDetails as LdkChannelDetails;
@@ -30,7 +37,6 @@ use lightning::util::persist::{
3037
use lightning::util::ser::{Readable, Writeable, Writer};
3138
use lightning::util::sweep::OutputSweeper;
3239
use lightning_block_sync::gossip::GossipVerifier;
33-
use lightning_dns_resolver::OMDomainResolver;
3440
use lightning_liquidity::utils::time::DefaultTimeProvider;
3541
use lightning_net_tokio::SocketDescriptor;
3642

@@ -295,9 +301,39 @@ pub(crate) type OnionMessenger = lightning::onion_message::messenger::OnionMesse
295301
IgnoringMessageHandler,
296302
>;
297303

298-
pub(crate) type HRNResolver = LDKOnionMessageDNSSECHrnResolver<Arc<Graph>, Arc<Logger>>;
304+
pub enum HRNResolver {
305+
Onion(Arc<LDKOnionMessageDNSSECHrnResolver<Arc<Graph>, Arc<Logger>>>),
306+
Local(Arc<DNSHrnResolver>),
307+
}
299308

300-
pub(crate) type DomainResolver = OMDomainResolver<IgnoringMessageHandler>;
309+
impl HrnResolver for HRNResolver {
310+
fn resolve_hrn<'a>(&'a self, hrn: &'a HumanReadableName) -> HrnResolutionFuture<'a> {
311+
match self {
312+
HRNResolver::Onion(inner) => inner.resolve_hrn(hrn),
313+
HRNResolver::Local(inner) => inner.resolve_hrn(hrn),
314+
}
315+
}
316+
317+
fn resolve_lnurl<'a>(&'a self, url: &'a str) -> HrnResolutionFuture<'a> {
318+
match self {
319+
HRNResolver::Onion(inner) => inner.resolve_lnurl(url),
320+
HRNResolver::Local(inner) => inner.resolve_lnurl(url),
321+
}
322+
}
323+
324+
fn resolve_lnurl_to_invoice<'a>(
325+
&'a self, callback_url: String, amount: Amount, expected_description_hash: [u8; 32],
326+
) -> LNURLResolutionFuture<'a> {
327+
match self {
328+
HRNResolver::Onion(inner) => {
329+
inner.resolve_lnurl_to_invoice(callback_url, amount, expected_description_hash)
330+
},
331+
HRNResolver::Local(inner) => {
332+
inner.resolve_lnurl_to_invoice(callback_url, amount, expected_description_hash)
333+
},
334+
}
335+
}
336+
}
301337

302338
pub(crate) type MessageRouter = lightning::onion_message::messenger::DefaultMessageRouter<
303339
Arc<Graph>,

0 commit comments

Comments
 (0)