@@ -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,12 +19,13 @@ 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 } ;
2526use lightning:: ln:: msgs:: { RoutingMessageHandler , SocketAddress } ;
2627use lightning:: ln:: peer_handler:: { IgnoringMessageHandler , MessageHandler } ;
27- use lightning:: log_trace ;
28+ use lightning:: onion_message :: dns_resolution :: DNSResolverMessageHandler ;
2829use lightning:: routing:: gossip:: NodeAlias ;
2930use lightning:: routing:: router:: DefaultRouter ;
3031use lightning:: routing:: scoring:: {
@@ -39,13 +40,15 @@ use lightning::util::persist::{
3940} ;
4041use lightning:: util:: ser:: ReadableArgs ;
4142use lightning:: util:: sweep:: OutputSweeper ;
43+ use lightning:: { log_trace, log_warn} ;
44+ use lightning_dns_resolver:: OMDomainResolver ;
4245use lightning_persister:: fs_store:: FilesystemStore ;
4346use vss_client:: headers:: VssHeaderProvider ;
4447
4548use crate :: chain:: ChainSource ;
4649use crate :: config:: {
4750 default_user_config, may_announce_channel, AnnounceError , AsyncPaymentsRole ,
48- BitcoindRestClientConfig , Config , ElectrumSyncConfig , EsploraSyncConfig ,
51+ BitcoindRestClientConfig , Config , ElectrumSyncConfig , EsploraSyncConfig , HRNResolverConfig ,
4952 DEFAULT_ESPLORA_SERVER_URL , DEFAULT_LOG_FILENAME , DEFAULT_LOG_LEVEL ,
5053} ;
5154use crate :: connection:: ConnectionManager ;
@@ -76,8 +79,8 @@ use crate::runtime::{Runtime, RuntimeSpawner};
7679use crate :: tx_broadcaster:: TransactionBroadcaster ;
7780use crate :: types:: {
7881 AsyncPersister , ChainMonitor , ChannelManager , DynStore , DynStoreWrapper , GossipSync , Graph ,
79- KeysManager , MessageRouter , OnionMessenger , PaymentStore , PeerManager , PendingPaymentStore ,
80- Persister , SyncAndAsyncKVStore ,
82+ HRNResolver , KeysManager , MessageRouter , OnionMessenger , PaymentStore , PeerManager ,
83+ PendingPaymentStore , Persister , SyncAndAsyncKVStore ,
8184} ;
8285use crate :: wallet:: persist:: KVStoreWalletPersister ;
8386use crate :: wallet:: Wallet ;
@@ -189,6 +192,10 @@ pub enum BuildError {
189192 NetworkMismatch ,
190193 /// The role of the node in an asynchronous payments context is not compatible with the current configuration.
191194 AsyncPaymentsConfigMismatch ,
195+ /// An attempt to setup a DNS Resolver failed.
196+ DNSResolverSetupFailed ,
197+ /// Failed to set up the peer manager.
198+ PeerManagerSetupFailed ,
192199}
193200
194201impl fmt:: Display for BuildError {
@@ -221,6 +228,12 @@ impl fmt::Display for BuildError {
221228 "The async payments role is not compatible with the current configuration."
222229 )
223230 } ,
231+ Self :: DNSResolverSetupFailed => {
232+ write ! ( f, "An attempt to setup a DNS resolver has failed." )
233+ } ,
234+ Self :: PeerManagerSetupFailed => {
235+ write ! ( f, "Failed to set up the peer manager." )
236+ } ,
224237 }
225238 }
226239}
@@ -1545,7 +1558,74 @@ fn build_with_store_internal(
15451558 } ) ?;
15461559 }
15471560
1548- let hrn_resolver = Arc :: new ( LDKOnionMessageDNSSECHrnResolver :: new ( Arc :: clone ( & network_graph) ) ) ;
1561+ let peer_manager_hook: Arc < Mutex < Option < Weak < PeerManager > > > > = Arc :: new ( Mutex :: new ( None ) ) ;
1562+ let mut hrn_resolver_out = None ;
1563+
1564+ let om_resolver: Arc < dyn DNSResolverMessageHandler + Send + Sync > = match & config. hrn_config {
1565+ None => Arc :: new ( IgnoringMessageHandler { } ) ,
1566+ Some ( hrn_config) => {
1567+ let runtime_handle = runtime. handle ( ) ;
1568+
1569+ let client_resolver: Arc < dyn DNSResolverMessageHandler + Send + Sync > =
1570+ match & hrn_config. resolution_config {
1571+ HRNResolverConfig :: Blip32 => {
1572+ let hrn_res = Arc :: new ( LDKOnionMessageDNSSECHrnResolver :: new ( Arc :: clone (
1573+ & network_graph,
1574+ ) ) ) ;
1575+ hrn_resolver_out = Some ( Arc :: new ( HRNResolver :: Onion ( Arc :: clone ( & hrn_res) ) ) ) ;
1576+
1577+ let pm_hook_clone = Arc :: clone ( & peer_manager_hook) ;
1578+ hrn_res. register_post_queue_action ( Box :: new ( move || {
1579+ if let Ok ( guard) = pm_hook_clone. lock ( ) {
1580+ if let Some ( pm) = guard. as_ref ( ) . and_then ( |weak| weak. upgrade ( ) ) {
1581+ pm. process_events ( ) ;
1582+ }
1583+ }
1584+ } ) ) ;
1585+ hrn_res as Arc < dyn DNSResolverMessageHandler + Send + Sync >
1586+ } ,
1587+ HRNResolverConfig :: Dns { dns_server_address, .. } => {
1588+ let addr = dns_server_address
1589+ . parse ( )
1590+ . map_err ( |_| BuildError :: DNSResolverSetupFailed ) ?;
1591+ let hrn_res = Arc :: new ( DNSHrnResolver ( addr) ) ;
1592+ hrn_resolver_out = Some ( Arc :: new ( HRNResolver :: Local ( hrn_res) ) ) ;
1593+
1594+ let resolver =
1595+ Arc :: new ( OMDomainResolver :: < IgnoringMessageHandler > :: with_runtime (
1596+ addr,
1597+ None ,
1598+ Some ( runtime_handle. clone ( ) ) ,
1599+ ) ) ;
1600+ resolver as Arc < dyn DNSResolverMessageHandler + Send + Sync >
1601+ } ,
1602+ } ;
1603+
1604+ if let HRNResolverConfig :: Dns {
1605+ enable_hrn_resolution_service : true ,
1606+ ref dns_server_address,
1607+ ..
1608+ } = hrn_config. resolution_config
1609+ {
1610+ if may_announce_channel ( & config) . is_ok ( ) {
1611+ let service_dns_addr = dns_server_address
1612+ . parse ( )
1613+ . map_err ( |_| BuildError :: DNSResolverSetupFailed ) ?;
1614+
1615+ Arc :: new ( OMDomainResolver :: with_runtime (
1616+ service_dns_addr,
1617+ Some ( client_resolver) ,
1618+ Some ( runtime_handle. clone ( ) ) ,
1619+ ) ) as Arc < dyn DNSResolverMessageHandler + Send + Sync >
1620+ } else {
1621+ log_warn ! ( logger, "Unable to act as an HRN resolution service. To act as an HRN resolution service, the node must be configured to announce channels." ) ;
1622+ client_resolver
1623+ }
1624+ } else {
1625+ client_resolver
1626+ }
1627+ } ,
1628+ } ;
15491629
15501630 // Initialize the PeerManager
15511631 let onion_messenger: Arc < OnionMessenger > =
@@ -1558,7 +1638,7 @@ fn build_with_store_internal(
15581638 message_router,
15591639 Arc :: clone ( & channel_manager) ,
15601640 Arc :: clone ( & channel_manager) ,
1561- Arc :: clone ( & hrn_resolver ) ,
1641+ Arc :: clone ( & om_resolver ) ,
15621642 IgnoringMessageHandler { } ,
15631643 ) )
15641644 } else {
@@ -1570,7 +1650,7 @@ fn build_with_store_internal(
15701650 message_router,
15711651 Arc :: clone ( & channel_manager) ,
15721652 Arc :: clone ( & channel_manager) ,
1573- Arc :: clone ( & hrn_resolver ) ,
1653+ Arc :: clone ( & om_resolver ) ,
15741654 IgnoringMessageHandler { } ,
15751655 ) )
15761656 } ;
@@ -1691,7 +1771,7 @@ fn build_with_store_internal(
16911771 BuildError :: InvalidSystemTime
16921772 } ) ?;
16931773
1694- let peer_manager = Arc :: new ( PeerManager :: new (
1774+ let peer_manager: Arc < PeerManager > = Arc :: new ( PeerManager :: new (
16951775 msg_handler,
16961776 cur_time. as_secs ( ) . try_into ( ) . map_err ( |e| {
16971777 log_error ! ( logger, "Failed to get current time: {}" , e) ;
@@ -1702,12 +1782,11 @@ fn build_with_store_internal(
17021782 Arc :: clone ( & keys_manager) ,
17031783 ) ) ;
17041784
1705- let peer_manager_clone = Arc :: downgrade ( & peer_manager) ;
1706- hrn_resolver. register_post_queue_action ( Box :: new ( move || {
1707- if let Some ( upgraded_pointer) = peer_manager_clone. upgrade ( ) {
1708- upgraded_pointer. process_events ( ) ;
1709- }
1710- } ) ) ;
1785+ if let Ok ( mut guard) = peer_manager_hook. lock ( ) {
1786+ * guard = Some ( Arc :: downgrade ( & peer_manager) ) ;
1787+ } else {
1788+ return Err ( BuildError :: PeerManagerSetupFailed ) ;
1789+ }
17111790
17121791 liquidity_source. as_ref ( ) . map ( |l| l. set_peer_manager ( Arc :: downgrade ( & peer_manager) ) ) ;
17131792
@@ -1814,7 +1893,7 @@ fn build_with_store_internal(
18141893 node_metrics,
18151894 om_mailbox,
18161895 async_payments_role,
1817- hrn_resolver,
1896+ hrn_resolver : Arc :: new ( hrn_resolver_out ) ,
18181897 #[ cfg( cycle_tests) ]
18191898 _leak_checker,
18201899 } )
0 commit comments