Skip to content

Commit 23d9b2f

Browse files
committed
Pass HRNResolver or DomainResolver into OnionMessenger
Inject specialized resolution capabilities into OnionMessenger to support outbound payments and third-party resolution services. This change refines the previous resolution logic by allowing the node to act as a robust BIP 353 participant. If configured as a service provider, the node utilizes a Domain Resolver to handle requests for other participants. Otherwise, it uses an HRN Resolver specifically for initiating its own outbound payments. Providing these as optional parameters in the Node constructor ensures the logic matches the node's designated role in the ecosystem.
1 parent 9ba57d7 commit 23d9b2f

File tree

7 files changed

+84
-15
lines changed

7 files changed

+84
-15
lines changed

Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ default = []
3838
#lightning-transaction-sync = { version = "0.2.0", features = ["esplora-async-https", "time", "electrum-rustls-ring"] }
3939
#lightning-liquidity = { version = "0.2.0", features = ["std"] }
4040
#lightning-macros = { version = "0.2.0" }
41+
#lightning-dns-resolver = { version = "0.3.0" }
4142

4243
lightning = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "1c730c8a16e28cc8e0c4817717ee63c97abcf4b0", features = ["std"] }
4344
lightning-types = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "1c730c8a16e28cc8e0c4817717ee63c97abcf4b0" }
@@ -50,6 +51,7 @@ lightning-block-sync = { git = "https://github.com/lightningdevkit/rust-lightnin
5051
lightning-transaction-sync = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "1c730c8a16e28cc8e0c4817717ee63c97abcf4b0", features = ["esplora-async-https", "time", "electrum-rustls-ring"] }
5152
lightning-liquidity = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "1c730c8a16e28cc8e0c4817717ee63c97abcf4b0", features = ["std"] }
5253
lightning-macros = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "1c730c8a16e28cc8e0c4817717ee63c97abcf4b0" }
54+
lightning-dns-resolver = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "1c730c8a16e28cc8e0c4817717ee63c97abcf4b0" }
5355

5456
bdk_chain = { version = "0.23.0", default-features = false, features = ["std"] }
5557
bdk_esplora = { version = "0.22.0", default-features = false, features = ["async-https-rustls", "tokio"]}
@@ -140,6 +142,7 @@ harness = false
140142
#lightning-transaction-sync = { path = "../rust-lightning/lightning-transaction-sync" }
141143
#lightning-liquidity = { path = "../rust-lightning/lightning-liquidity" }
142144
#lightning-macros = { path = "../rust-lightning/lightning-macros" }
145+
#lightning-dns-resolver = { path = "../rust-lightning/lightning-dns-resolver" }
143146

144147
#lightning = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main" }
145148
#lightning-types = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main" }
@@ -152,6 +155,7 @@ harness = false
152155
#lightning-transaction-sync = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main" }
153156
#lightning-liquidity = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main" }
154157
#lightning-macros = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main" }
158+
#lightning-dns-resolver = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main" }
155159

156160
#lightning = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03" }
157161
#lightning-types = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03" }
@@ -164,6 +168,7 @@ harness = false
164168
#lightning-transaction-sync = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03" }
165169
#lightning-liquidity = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03" }
166170
#lightning-macros = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03" }
171+
#lightning-dns-resolver = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03" }
167172

168173
#vss-client-ng = { path = "../vss-client" }
169174
#vss-client-ng = { git = "https://github.com/lightningdevkit/vss-client", branch = "main" }

bindings/ldk_node.udl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ enum NodeError {
349349
"InvalidBlindedPaths",
350350
"AsyncPaymentServicesDisabled",
351351
"HrnParsingFailed",
352+
"HrnResolverNotConfigured",
352353
};
353354

354355
dictionary NodeStatus {
@@ -383,6 +384,7 @@ enum BuildError {
383384
"LoggerSetupFailed",
384385
"NetworkMismatch",
385386
"AsyncPaymentsConfigMismatch",
387+
"DNSResolverSetupFailed",
386388
};
387389

388390
[Trait]

src/builder.rs

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use lightning::ln::channelmanager::{self, ChainParameters, ChannelManagerReadArg
2525
use lightning::ln::msgs::{RoutingMessageHandler, SocketAddress};
2626
use lightning::ln::peer_handler::{IgnoringMessageHandler, MessageHandler};
2727
use lightning::log_trace;
28+
use lightning::onion_message::dns_resolution::DNSResolverMessageHandler;
2829
use lightning::routing::gossip::NodeAlias;
2930
use lightning::routing::router::DefaultRouter;
3031
use lightning::routing::scoring::{
@@ -38,6 +39,7 @@ use lightning::util::persist::{
3839
};
3940
use lightning::util::ser::ReadableArgs;
4041
use lightning::util::sweep::OutputSweeper;
42+
use lightning_dns_resolver::OMDomainResolver;
4143
use lightning_persister::fs_store::FilesystemStore;
4244
use vss_client::headers::VssHeaderProvider;
4345

@@ -72,8 +74,9 @@ use crate::peer_store::PeerStore;
7274
use crate::runtime::Runtime;
7375
use crate::tx_broadcaster::TransactionBroadcaster;
7476
use 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
};
7881
use crate::wallet::persist::KVStoreWalletPersister;
7982
use 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

190195
impl 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

224232
impl 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

src/error.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ pub enum Error {
131131
AsyncPaymentServicesDisabled,
132132
/// Parsing a Human-Readable Name has failed.
133133
HrnParsingFailed,
134+
/// A HRN resolver was not configured
135+
HrnResolverNotConfigured,
134136
}
135137

136138
impl fmt::Display for Error {
@@ -213,6 +215,9 @@ impl fmt::Display for Error {
213215
Self::HrnParsingFailed => {
214216
write!(f, "Failed to parse a human-readable name.")
215217
},
218+
Self::HrnResolverNotConfigured => {
219+
write!(f, "A HRN resolver was not configured.")
220+
},
216221
}
217222
}
218223
}

src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ pub struct Node {
207207
node_metrics: Arc<RwLock<NodeMetrics>>,
208208
om_mailbox: Option<Arc<OnionMessageMailbox>>,
209209
async_payments_role: Option<AsyncPaymentsRole>,
210-
hrn_resolver: Arc<HRNResolver>,
210+
hrn_resolver: Option<Arc<HRNResolver>>,
211211
}
212212

213213
impl Node {
@@ -958,7 +958,7 @@ impl Node {
958958
self.bolt12_payment().into(),
959959
Arc::clone(&self.config),
960960
Arc::clone(&self.logger),
961-
Arc::clone(&self.hrn_resolver),
961+
Arc::new(self.hrn_resolver.clone()),
962962
)
963963
}
964964

@@ -979,7 +979,7 @@ impl Node {
979979
self.bolt12_payment(),
980980
Arc::clone(&self.config),
981981
Arc::clone(&self.logger),
982-
Arc::clone(&self.hrn_resolver),
982+
Arc::new(self.hrn_resolver.clone()),
983983
))
984984
}
985985

src/payment/unified.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,14 @@ pub struct UnifiedPayment {
6464
bolt12_payment: Arc<Bolt12Payment>,
6565
config: Arc<Config>,
6666
logger: Arc<Logger>,
67-
hrn_resolver: Arc<HRNResolver>,
67+
hrn_resolver: Arc<Option<Arc<HRNResolver>>>,
6868
}
6969

7070
impl UnifiedPayment {
7171
pub(crate) fn new(
7272
onchain_payment: Arc<OnchainPayment>, bolt11_invoice: Arc<Bolt11Payment>,
7373
bolt12_payment: Arc<Bolt12Payment>, config: Arc<Config>, logger: Arc<Logger>,
74-
hrn_resolver: Arc<HRNResolver>,
74+
hrn_resolver: Arc<Option<Arc<HRNResolver>>>,
7575
) -> Self {
7676
Self { onchain_payment, bolt11_invoice, bolt12_payment, config, logger, hrn_resolver }
7777
}
@@ -161,6 +161,11 @@ impl UnifiedPayment {
161161
&self, uri_str: &str, amount_msat: Option<u64>,
162162
route_parameters: Option<RouteParametersConfig>,
163163
) -> Result<UnifiedPaymentResult, Error> {
164+
let resolver = self.hrn_resolver.as_ref().clone().ok_or_else(|| {
165+
log_error!(self.logger, "No HRN resolver configured. Cannot resolve HRNs.");
166+
Error::HrnResolverNotConfigured
167+
})?;
168+
164169
let parse_fut = PaymentInstructions::parse(
165170
uri_str,
166171
self.config.network,

src/types.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use lightning::ln::channel_state::ChannelDetails as LdkChannelDetails;
1919
use lightning::ln::msgs::{RoutingMessageHandler, SocketAddress};
2020
use lightning::ln::peer_handler::IgnoringMessageHandler;
2121
use lightning::ln::types::ChannelId;
22+
use lightning::onion_message::dns_resolution::DNSResolverMessageHandler;
2223
use lightning::routing::gossip;
2324
use lightning::routing::router::DefaultRouter;
2425
use lightning::routing::scoring::{CombinedScorer, ProbabilisticScoringFeeParameters};
@@ -27,6 +28,7 @@ use lightning::util::persist::{KVStore, KVStoreSync, MonitorUpdatingPersister};
2728
use lightning::util::ser::{Readable, Writeable, Writer};
2829
use lightning::util::sweep::OutputSweeper;
2930
use lightning_block_sync::gossip::GossipVerifier;
31+
use lightning_dns_resolver::OMDomainResolver;
3032
use lightning_liquidity::utils::time::DefaultTimeProvider;
3133
use lightning_net_tokio::SocketDescriptor;
3234

@@ -277,12 +279,14 @@ pub(crate) type OnionMessenger = lightning::onion_message::messenger::OnionMesse
277279
Arc<MessageRouter>,
278280
Arc<ChannelManager>,
279281
Arc<ChannelManager>,
280-
Arc<HRNResolver>,
282+
Arc<dyn DNSResolverMessageHandler + Sync + Send>,
281283
IgnoringMessageHandler,
282284
>;
283285

284286
pub(crate) type HRNResolver = LDKOnionMessageDNSSECHrnResolver<Arc<Graph>, Arc<Logger>>;
285287

288+
pub(crate) type DomainResolver = OMDomainResolver<IgnoringMessageHandler>;
289+
286290
pub(crate) type MessageRouter = lightning::onion_message::messenger::DefaultMessageRouter<
287291
Arc<Graph>,
288292
Arc<Logger>,

0 commit comments

Comments
 (0)