Skip to content

Commit b463279

Browse files
committed
Pass HRNResolver or DomainResolver into OnionMessenger
This commit allows us to enable our node to either be able to send HRN resolution requests or acts as a resolver for 3rd party nodes We also pass HRNResolver as an optional parameter to Node
1 parent 2b9b526 commit b463279

File tree

7 files changed

+80
-26
lines changed

7 files changed

+80
-26
lines changed

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ lightning-block-sync = { version = "0.2.0-beta1", features = ["rest-client", "rp
3939
lightning-transaction-sync = { version = "0.2.0-beta1", features = ["esplora-async-https", "time", "electrum-rustls-ring"] }
4040
lightning-liquidity = { version = "0.2.0-beta1", features = ["std"] }
4141
lightning-macros = { version = "0.2.0-beta1" }
42+
lightning-dns-resolver = { version = "0.3.0-beta1" }
4243

4344
#lightning = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main", features = ["std"] }
4445
#lightning-types = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main" }
@@ -51,6 +52,7 @@ lightning-macros = { version = "0.2.0-beta1" }
5152
#lightning-transaction-sync = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main", features = ["esplora-async-https", "electrum-rustls-ring", "time"] }
5253
#lightning-liquidity = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main" }
5354
#lightning-macros = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main" }
55+
#lightning-dns-resolver = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main" }
5456

5557
#lightning = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03", features = ["std"] }
5658
#lightning-types = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03" }
@@ -63,6 +65,7 @@ lightning-macros = { version = "0.2.0-beta1" }
6365
#lightning-transaction-sync = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03", features = ["esplora-async-https", "electrum-rustls-ring", "time"] }
6466
#lightning-liquidity = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03" }
6567
#lightning-macros = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03" }
68+
#lightning-dns-resolver = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03" }
6669

6770
#lightning = { path = "../rust-lightning/lightning", features = ["std"] }
6871
#lightning-types = { path = "../rust-lightning/lightning-types" }
@@ -75,6 +78,7 @@ lightning-macros = { version = "0.2.0-beta1" }
7578
#lightning-transaction-sync = { path = "../rust-lightning/lightning-transaction-sync", features = ["esplora-async-https", "electrum-rustls-ring", "time"] }
7679
#lightning-liquidity = { path = "../rust-lightning/lightning-liquidity", features = ["std"] }
7780
#lightning-macros = { path = "../rust-lightning/lightning-macros" }
81+
#lightning-dns-resolver = { path = "../rust-lightning/lightning-dns-resolvers" }
7882

7983
bdk_chain = { version = "0.23.0", default-features = false, features = ["std"] }
8084
bdk_esplora = { version = "0.22.0", default-features = false, features = ["async-https-rustls", "tokio"]}

bindings/ldk_node.udl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ enum NodeError {
323323
"InvalidBlindedPaths",
324324
"AsyncPaymentServicesDisabled",
325325
"HrnParsingFailed",
326+
"HrnResolverNotConfigured",
326327
};
327328

328329
dictionary NodeStatus {
@@ -359,6 +360,7 @@ enum BuildError {
359360
"LoggerSetupFailed",
360361
"NetworkMismatch",
361362
"AsyncPaymentsConfigMismatch",
363+
"DNSResolverSetupFailed",
362364
};
363365

364366
[Trait]

src/builder.rs

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use lightning::io::Cursor;
2525
use lightning::ln::channelmanager::{self, ChainParameters, ChannelManagerReadArgs};
2626
use lightning::ln::msgs::{RoutingMessageHandler, SocketAddress};
2727
use lightning::ln::peer_handler::{IgnoringMessageHandler, MessageHandler};
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::{
@@ -37,6 +38,7 @@ use lightning::util::persist::{
3738
};
3839
use lightning::util::ser::ReadableArgs;
3940
use lightning::util::sweep::OutputSweeper;
41+
use lightning_dns_resolver::OMDomainResolver;
4042
use lightning_persister::fs_store::FilesystemStore;
4143
use vss_client::headers::{FixedHeaders, LnurlAuthToJwtProvider, VssHeaderProvider};
4244

@@ -66,8 +68,8 @@ use crate::peer_store::PeerStore;
6668
use crate::runtime::Runtime;
6769
use crate::tx_broadcaster::TransactionBroadcaster;
6870
use crate::types::{
69-
ChainMonitor, ChannelManager, DynStore, GossipSync, Graph, KeysManager, MessageRouter,
70-
OnionMessenger, PaymentStore, PeerManager, Persister,
71+
ChainMonitor, ChannelManager, DomainResolver, DynStore, GossipSync, Graph, HRNResolver,
72+
KeysManager, MessageRouter, OnionMessenger, PaymentStore, PeerManager, Persister
7173
};
7274
use crate::wallet::persist::KVStoreWalletPersister;
7375
use crate::wallet::Wallet;
@@ -187,6 +189,8 @@ pub enum BuildError {
187189
NetworkMismatch,
188190
/// The role of the node in an asynchronous payments context is not compatible with the current configuration.
189191
AsyncPaymentsConfigMismatch,
192+
/// An attempt to setup a DNS Resolver failed.
193+
DNSResolverSetupFailed,
190194
}
191195

192196
impl fmt::Display for BuildError {
@@ -221,12 +225,20 @@ impl fmt::Display for BuildError {
221225
"The async payments role is not compatible with the current configuration."
222226
)
223227
},
228+
Self::DNSResolverSetupFailed => {
229+
write!(f, "An attempt to setup a DNS resolver has failed.")
230+
},
224231
}
225232
}
226233
}
227234

228235
impl std::error::Error for BuildError {}
229236

237+
enum Resolver {
238+
HRN(Arc<HRNResolver>),
239+
DNS(Arc<DomainResolver>),
240+
}
241+
230242
/// A builder for an [`Node`] instance, allowing to set some configuration and module choices from
231243
/// the getgo.
232244
///
@@ -1491,7 +1503,22 @@ fn build_with_store_internal(
14911503
})?;
14921504
}
14931505

1494-
let hrn_resolver = Arc::new(LDKOnionMessageDNSSECHrnResolver::new(Arc::clone(&network_graph)));
1506+
let resolver = if config.is_hrn_resolver {
1507+
Resolver::DNS(Arc::new(OMDomainResolver::ignoring_incoming_proofs(
1508+
"8.8.8.8:53".parse().map_err(|_| BuildError::DNSResolverSetupFailed)?,
1509+
)))
1510+
} else {
1511+
Resolver::HRN(Arc::new(LDKOnionMessageDNSSECHrnResolver::new(Arc::clone(&network_graph))))
1512+
};
1513+
1514+
let om_resolver = match resolver {
1515+
Resolver::DNS(ref dns_resolver) => {
1516+
Arc::clone(dns_resolver) as Arc<dyn DNSResolverMessageHandler + Send + Sync>
1517+
},
1518+
Resolver::HRN(ref hrn_resolver) => {
1519+
Arc::clone(hrn_resolver) as Arc<dyn DNSResolverMessageHandler + Send + Sync>
1520+
},
1521+
};
14951522

14961523
// Initialize the PeerManager
14971524
let onion_messenger: Arc<OnionMessenger> =
@@ -1504,7 +1531,7 @@ fn build_with_store_internal(
15041531
message_router,
15051532
Arc::clone(&channel_manager),
15061533
Arc::clone(&channel_manager),
1507-
Arc::clone(&hrn_resolver),
1534+
Arc::clone(&om_resolver),
15081535
IgnoringMessageHandler {},
15091536
))
15101537
} else {
@@ -1516,7 +1543,7 @@ fn build_with_store_internal(
15161543
message_router,
15171544
Arc::clone(&channel_manager),
15181545
Arc::clone(&channel_manager),
1519-
Arc::clone(&hrn_resolver),
1546+
Arc::clone(&om_resolver),
15201547
IgnoringMessageHandler {},
15211548
))
15221549
};
@@ -1650,9 +1677,15 @@ fn build_with_store_internal(
16501677

16511678
let peer_manager_clone = Arc::clone(&peer_manager);
16521679

1653-
hrn_resolver.register_post_queue_action(Box::new(move || {
1654-
peer_manager_clone.process_events();
1655-
}));
1680+
let hrn_resolver = match resolver {
1681+
Resolver::DNS(_) => None,
1682+
Resolver::HRN(ref hrn_resolver) => {
1683+
hrn_resolver.register_post_queue_action(Box::new(move || {
1684+
peer_manager_clone.process_events();
1685+
}));
1686+
Some(hrn_resolver)
1687+
},
1688+
};
16561689

16571690
liquidity_source.as_ref().map(|l| l.set_peer_manager(Arc::clone(&peer_manager)));
16581691

@@ -1754,7 +1787,7 @@ fn build_with_store_internal(
17541787
node_metrics,
17551788
om_mailbox,
17561789
async_payments_role,
1757-
hrn_resolver,
1790+
hrn_resolver: hrn_resolver.cloned(),
17581791
})
17591792
}
17601793

src/error.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,8 @@ pub enum Error {
127127
AsyncPaymentServicesDisabled,
128128
/// Parsing a Human-Readable Name has failed.
129129
HrnParsingFailed,
130+
/// A HRN resolver was not configured
131+
HrnResolverNotConfigured,
130132
}
131133

132134
impl fmt::Display for Error {
@@ -207,6 +209,9 @@ impl fmt::Display for Error {
207209
Self::HrnParsingFailed => {
208210
write!(f, "Failed to parse a human-readable name.")
209211
},
212+
Self::HrnResolverNotConfigured => {
213+
write!(f, "A HRN resolver was not configured.")
214+
},
210215
}
211216
}
212217
}

src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ pub struct Node {
195195
node_metrics: Arc<RwLock<NodeMetrics>>,
196196
om_mailbox: Option<Arc<OnionMessageMailbox>>,
197197
async_payments_role: Option<AsyncPaymentsRole>,
198-
hrn_resolver: Arc<HRNResolver>,
198+
hrn_resolver: Option<Arc<HRNResolver>>,
199199
}
200200

201201
impl Node {
@@ -920,7 +920,7 @@ impl Node {
920920
self.bolt12_payment().into(),
921921
Arc::clone(&self.config),
922922
Arc::clone(&self.logger),
923-
Arc::clone(&self.hrn_resolver),
923+
Arc::new(self.hrn_resolver.clone()),
924924
)
925925
}
926926

@@ -941,7 +941,7 @@ impl Node {
941941
self.bolt12_payment(),
942942
Arc::clone(&self.config),
943943
Arc::clone(&self.logger),
944-
Arc::clone(&self.hrn_resolver),
944+
Arc::new(self.hrn_resolver.clone()),
945945
))
946946
}
947947

src/payment/unified.rs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,14 @@ pub struct UnifiedPayment {
6262
bolt12_payment: Arc<Bolt12Payment>,
6363
config: Arc<Config>,
6464
logger: Arc<Logger>,
65-
hrn_resolver: Arc<HRNResolver>,
65+
hrn_resolver: Arc<Option<Arc<HRNResolver>>>,
6666
}
6767

6868
impl UnifiedPayment {
6969
pub(crate) fn new(
7070
onchain_payment: Arc<OnchainPayment>, bolt11_invoice: Arc<Bolt11Payment>,
7171
bolt12_payment: Arc<Bolt12Payment>, config: Arc<Config>, logger: Arc<Logger>,
72-
hrn_resolver: Arc<HRNResolver>,
72+
hrn_resolver: Arc<Option<Arc<HRNResolver>>>,
7373
) -> Self {
7474
Self { onchain_payment, bolt11_invoice, bolt12_payment, config, logger, hrn_resolver }
7575
}
@@ -155,18 +155,24 @@ impl UnifiedPayment {
155155
pub async fn send(
156156
&self, uri_str: &str, amount_msat: Option<u64>,
157157
) -> Result<UnifiedPaymentResult, Error> {
158-
let instructions = PaymentInstructions::parse(
159-
uri_str,
160-
self.config.network,
161-
self.hrn_resolver.as_ref(),
162-
false,
163-
)
164-
.await
165-
.map_err(|e| {
166-
log_error!(self.logger, "Failed to parse payment instructions: {:?}", e);
167-
Error::UriParameterParsingFailed
158+
let resolver = self.hrn_resolver.as_ref().clone().ok_or_else(|| {
159+
log_error!(self.logger, "No HRN resolver configured. Cannot resolve HRNs.");
160+
Error::HrnResolverNotConfigured
168161
})?;
169162

163+
println!("Parsing instructions...");
164+
165+
let instructions =
166+
PaymentInstructions::parse(uri_str, self.config.network, resolver.as_ref(), false)
167+
.await
168+
.map_err(|e| {
169+
log_error!(self.logger, "Failed to parse payment instructions: {:?}", e);
170+
println!("Failed to parse payment instructions: {:?}", e);
171+
Error::UriParameterParsingFailed
172+
})?;
173+
174+
println!("Sending...");
175+
170176
let resolved = match instructions {
171177
PaymentInstructions::ConfigurableAmount(instr) => {
172178
let amount = amount_msat.ok_or_else(|| {
@@ -179,7 +185,7 @@ impl UnifiedPayment {
179185
Error::InvalidAmount
180186
})?;
181187

182-
instr.set_amount(amt, self.hrn_resolver.as_ref()).await.map_err(|e| {
188+
instr.set_amount(amt, resolver.as_ref()).await.map_err(|e| {
183189
log_error!(self.logger, "Failed to set amount: {:?}", e);
184190
Error::InvalidAmount
185191
})?

src/types.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use lightning::ln::channel_state::ChannelDetails as LdkChannelDetails;
1515
use lightning::ln::msgs::{RoutingMessageHandler, SocketAddress};
1616
use lightning::ln::peer_handler::IgnoringMessageHandler;
1717
use lightning::ln::types::ChannelId;
18+
use lightning::onion_message::dns_resolution::DNSResolverMessageHandler;
1819
use lightning::routing::gossip;
1920
use lightning::routing::router::DefaultRouter;
2021
use lightning::routing::scoring::{ProbabilisticScorer, ProbabilisticScoringFeeParameters};
@@ -23,6 +24,7 @@ use lightning::util::persist::{KVStore, KVStoreSync, MonitorUpdatingPersister};
2324
use lightning::util::ser::{Readable, Writeable, Writer};
2425
use lightning::util::sweep::OutputSweeper;
2526
use lightning_block_sync::gossip::{GossipVerifier, UtxoSource};
27+
use lightning_dns_resolver::OMDomainResolver;
2628
use lightning_liquidity::utils::time::DefaultTimeProvider;
2729
use lightning_net_tokio::SocketDescriptor;
2830

@@ -143,12 +145,14 @@ pub(crate) type OnionMessenger = lightning::onion_message::messenger::OnionMesse
143145
Arc<MessageRouter>,
144146
Arc<ChannelManager>,
145147
Arc<ChannelManager>,
146-
Arc<HRNResolver>,
148+
Arc<dyn DNSResolverMessageHandler + Sync + Send>,
147149
IgnoringMessageHandler,
148150
>;
149151

150152
pub(crate) type HRNResolver = LDKOnionMessageDNSSECHrnResolver<Arc<Graph>, Arc<Logger>>;
151153

154+
pub(crate) type DomainResolver = OMDomainResolver<IgnoringMessageHandler>;
155+
152156
pub(crate) type MessageRouter = lightning::onion_message::messenger::DefaultMessageRouter<
153157
Arc<Graph>,
154158
Arc<Logger>,

0 commit comments

Comments
 (0)