@@ -9,7 +9,7 @@ use std::collections::HashMap;
99use std:: convert:: TryInto ;
1010use std:: default:: Default ;
1111use std:: path:: PathBuf ;
12- use std:: sync:: { Arc , Mutex , Once , RwLock } ;
12+ use std:: sync:: { Arc , Mutex , Once , RwLock , Weak } ;
1313use std:: time:: SystemTime ;
1414use std:: { fmt, fs} ;
1515
@@ -19,6 +19,7 @@ use bitcoin::bip32::{ChildNumber, Xpriv};
1919use bitcoin:: key:: Secp256k1 ;
2020use bitcoin:: secp256k1:: PublicKey ;
2121use bitcoin:: { BlockHash , Network } ;
22+ use bitcoin_payment_instructions:: dns_resolver:: DNSHrnResolver ;
2223use bitcoin_payment_instructions:: onion_message_resolver:: LDKOnionMessageDNSSECHrnResolver ;
2324use lightning:: chain:: { chainmonitor, BestBlock } ;
2425use lightning:: ln:: channelmanager:: { self , ChainParameters , ChannelManagerReadArgs } ;
@@ -47,7 +48,7 @@ use vss_client::headers::VssHeaderProvider;
4748use crate :: chain:: ChainSource ;
4849use 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} ;
5354use crate :: connection:: ConnectionManager ;
@@ -77,9 +78,9 @@ use crate::peer_store::PeerStore;
7778use crate :: runtime:: { Runtime , RuntimeSpawner } ;
7879use crate :: tx_broadcaster:: TransactionBroadcaster ;
7980use 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} ;
8485use crate :: wallet:: persist:: KVStoreWalletPersister ;
8586use crate :: wallet:: Wallet ;
@@ -234,12 +235,6 @@ impl fmt::Display for BuildError {
234235
235236impl 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 } )
0 commit comments