@@ -25,6 +25,7 @@ use lightning::ln::channelmanager::{self, ChainParameters, ChannelManagerReadArg
2525use lightning:: ln:: msgs:: { RoutingMessageHandler , SocketAddress } ;
2626use lightning:: ln:: peer_handler:: { IgnoringMessageHandler , MessageHandler } ;
2727use 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:: {
@@ -38,6 +39,7 @@ use lightning::util::persist::{
3839} ;
3940use lightning:: util:: ser:: ReadableArgs ;
4041use lightning:: util:: sweep:: OutputSweeper ;
42+ use lightning_dns_resolver:: OMDomainResolver ;
4143use lightning_persister:: fs_store:: FilesystemStore ;
4244use vss_client:: headers:: VssHeaderProvider ;
4345
@@ -72,8 +74,9 @@ use crate::peer_store::PeerStore;
7274use crate :: runtime:: Runtime ;
7375use crate :: tx_broadcaster:: TransactionBroadcaster ;
7476use crate :: types:: {
75- ChainMonitor , ChannelManager , DynStore , DynStoreWrapper , GossipSync , Graph , KeysManager ,
76- MessageRouter , OnionMessenger , PaymentStore , PeerManager , Persister , SyncAndAsyncKVStore ,
77+ ChainMonitor , ChannelManager , DomainResolver , DynStore , DynStoreWrapper , GossipSync , Graph ,
78+ HRNResolver , KeysManager , MessageRouter , OnionMessenger , PaymentStore , PeerManager , Persister ,
79+ SyncAndAsyncKVStore ,
7780} ;
7881use crate :: wallet:: persist:: KVStoreWalletPersister ;
7982use crate :: wallet:: Wallet ;
@@ -185,6 +188,8 @@ pub enum BuildError {
185188 NetworkMismatch ,
186189 /// The role of the node in an asynchronous payments context is not compatible with the current configuration.
187190 AsyncPaymentsConfigMismatch ,
191+ /// An attempt to setup a DNS Resolver failed.
192+ DNSResolverSetupFailed ,
188193}
189194
190195impl fmt:: Display for BuildError {
@@ -217,12 +222,21 @@ impl fmt::Display for BuildError {
217222 "The async payments role is not compatible with the current configuration."
218223 )
219224 } ,
225+ Self :: DNSResolverSetupFailed => {
226+ write ! ( f, "An attempt to setup a DNS resolver has failed." )
227+ } ,
220228 }
221229 }
222230}
223231
224232impl std:: error:: Error for BuildError { }
225233
234+ enum Resolver {
235+ HRN ( Arc < HRNResolver > ) ,
236+ DNS ( Arc < DomainResolver > ) ,
237+ Ignore ( Arc < IgnoringMessageHandler > ) ,
238+ }
239+
226240/// A builder for an [`Node`] instance, allowing to set some configuration and module choices from
227241/// the getgo.
228242///
@@ -1444,7 +1458,34 @@ fn build_with_store_internal(
14441458 } ) ?;
14451459 }
14461460
1447- let hrn_resolver = Arc :: new ( LDKOnionMessageDNSSECHrnResolver :: new ( Arc :: clone ( & network_graph) ) ) ;
1461+ let resolver = if let Some ( hrn_config) = & config. hrn_config {
1462+ if hrn_config. is_hrn_resolver {
1463+ let dns_addr = hrn_config. dns_server_address . as_str ( ) ;
1464+
1465+ Resolver :: DNS ( Arc :: new ( OMDomainResolver :: ignoring_incoming_proofs (
1466+ dns_addr. parse ( ) . map_err ( |_| BuildError :: DNSResolverSetupFailed ) ?,
1467+ ) ) )
1468+ } else {
1469+ Resolver :: HRN ( Arc :: new ( LDKOnionMessageDNSSECHrnResolver :: new ( Arc :: clone (
1470+ & network_graph,
1471+ ) ) ) )
1472+ }
1473+ } else {
1474+ // hrn_config is None, default to the IgnoringMessaageHandler.
1475+ Resolver :: Ignore ( Arc :: new ( IgnoringMessageHandler { } ) )
1476+ } ;
1477+
1478+ let om_resolver = match resolver {
1479+ Resolver :: DNS ( ref dns_resolver) => {
1480+ Arc :: clone ( dns_resolver) as Arc < dyn DNSResolverMessageHandler + Send + Sync >
1481+ } ,
1482+ Resolver :: HRN ( ref hrn_resolver) => {
1483+ Arc :: clone ( hrn_resolver) as Arc < dyn DNSResolverMessageHandler + Send + Sync >
1484+ } ,
1485+ Resolver :: Ignore ( ref ignoring_handler) => {
1486+ Arc :: clone ( ignoring_handler) as Arc < dyn DNSResolverMessageHandler + Send + Sync >
1487+ } ,
1488+ } ;
14481489
14491490 // Initialize the PeerManager
14501491 let onion_messenger: Arc < OnionMessenger > =
@@ -1457,7 +1498,7 @@ fn build_with_store_internal(
14571498 message_router,
14581499 Arc :: clone ( & channel_manager) ,
14591500 Arc :: clone ( & channel_manager) ,
1460- Arc :: clone ( & hrn_resolver ) ,
1501+ Arc :: clone ( & om_resolver ) ,
14611502 IgnoringMessageHandler { } ,
14621503 ) )
14631504 } else {
@@ -1469,7 +1510,7 @@ fn build_with_store_internal(
14691510 message_router,
14701511 Arc :: clone ( & channel_manager) ,
14711512 Arc :: clone ( & channel_manager) ,
1472- Arc :: clone ( & hrn_resolver ) ,
1513+ Arc :: clone ( & om_resolver ) ,
14731514 IgnoringMessageHandler { } ,
14741515 ) )
14751516 } ;
@@ -1599,9 +1640,16 @@ fn build_with_store_internal(
15991640
16001641 let peer_manager_clone = Arc :: clone ( & peer_manager) ;
16011642
1602- hrn_resolver. register_post_queue_action ( Box :: new ( move || {
1603- peer_manager_clone. process_events ( ) ;
1604- } ) ) ;
1643+ let hrn_resolver = match resolver {
1644+ Resolver :: DNS ( _) => None ,
1645+ Resolver :: HRN ( ref hrn_resolver) => {
1646+ hrn_resolver. register_post_queue_action ( Box :: new ( move || {
1647+ peer_manager_clone. process_events ( ) ;
1648+ } ) ) ;
1649+ Some ( hrn_resolver)
1650+ } ,
1651+ Resolver :: Ignore ( _) => None ,
1652+ } ;
16051653
16061654 liquidity_source. as_ref ( ) . map ( |l| l. set_peer_manager ( Arc :: clone ( & peer_manager) ) ) ;
16071655
@@ -1716,7 +1764,7 @@ fn build_with_store_internal(
17161764 node_metrics,
17171765 om_mailbox,
17181766 async_payments_role,
1719- hrn_resolver,
1767+ hrn_resolver : hrn_resolver . cloned ( ) ,
17201768 } )
17211769}
17221770
0 commit comments