Skip to content

Commit ec435ce

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 bd668f6 commit ec435ce

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
@@ -40,6 +40,7 @@ lightning-block-sync = { version = "0.2.0-rc1", features = ["rest-client", "rpc-
4040
lightning-transaction-sync = { version = "0.2.0-rc1", features = ["esplora-async-https", "time", "electrum-rustls-ring"] }
4141
lightning-liquidity = { version = "0.2.0-rc1", features = ["std"] }
4242
lightning-macros = { version = "0.2.0-rc1" }
43+
lightning-dns-resolver = { version = "0.3.0-rc1" }
4344

4445
#lightning = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main", features = ["std"] }
4546
#lightning-types = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main" }
@@ -52,6 +53,7 @@ lightning-macros = { version = "0.2.0-rc1" }
5253
#lightning-transaction-sync = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main", features = ["esplora-async-https", "electrum-rustls-ring", "time"] }
5354
#lightning-liquidity = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main" }
5455
#lightning-macros = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main" }
56+
#lightning-dns-resolver = { git = "https://github.com/lightningdevkit/rust-lightning", branch = "main" }
5557

5658
#lightning = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03", features = ["std"] }
5759
#lightning-types = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03" }
@@ -64,6 +66,7 @@ lightning-macros = { version = "0.2.0-rc1" }
6466
#lightning-transaction-sync = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03", features = ["esplora-async-https", "electrum-rustls-ring", "time"] }
6567
#lightning-liquidity = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03" }
6668
#lightning-macros = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03" }
69+
#lightning-dns-resolver = { git = "https://github.com/lightningdevkit/rust-lightning", rev = "21e9a9c0ef80021d0669f2a366f55d08ba8d9b03" }
6770

6871
#lightning = { path = "../rust-lightning/lightning", features = ["std"] }
6972
#lightning-types = { path = "../rust-lightning/lightning-types" }
@@ -76,6 +79,7 @@ lightning-macros = { version = "0.2.0-rc1" }
7679
#lightning-transaction-sync = { path = "../rust-lightning/lightning-transaction-sync", features = ["esplora-async-https", "electrum-rustls-ring", "time"] }
7780
#lightning-liquidity = { path = "../rust-lightning/lightning-liquidity", features = ["std"] }
7881
#lightning-macros = { path = "../rust-lightning/lightning-macros" }
82+
#lightning-dns-resolver = { path = "../rust-lightning/lightning-dns-resolvers" }
7983

8084
bdk_chain = { version = "0.23.0", default-features = false, features = ["std"] }
8185
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
@@ -324,6 +324,7 @@ enum NodeError {
324324
"InvalidBlindedPaths",
325325
"AsyncPaymentServicesDisabled",
326326
"HrnParsingFailed",
327+
"HrnResolverNotConfigured",
327328
};
328329

329330
dictionary NodeStatus {
@@ -361,6 +362,7 @@ enum BuildError {
361362
"LoggerSetupFailed",
362363
"NetworkMismatch",
363364
"AsyncPaymentsConfigMismatch",
365+
"DNSResolverSetupFailed",
364366
};
365367

366368
[Trait]

src/builder.rs

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use lightning::ln::channelmanager::{self, ChainParameters, ChannelManagerReadArg
2626
use lightning::ln::msgs::{RoutingMessageHandler, SocketAddress};
2727
use lightning::ln::peer_handler::{IgnoringMessageHandler, MessageHandler};
2828
use lightning::log_trace;
29+
use lightning::onion_message::dns_resolution::DNSResolverMessageHandler;
2930
use lightning::routing::gossip::NodeAlias;
3031
use lightning::routing::router::DefaultRouter;
3132
use lightning::routing::scoring::{
@@ -39,6 +40,7 @@ use lightning::util::persist::{
3940
};
4041
use lightning::util::ser::ReadableArgs;
4142
use lightning::util::sweep::OutputSweeper;
43+
use lightning_dns_resolver::OMDomainResolver;
4244
use lightning_persister::fs_store::FilesystemStore;
4345
use vss_client::headers::{FixedHeaders, LnurlAuthToJwtProvider, VssHeaderProvider};
4446

@@ -70,8 +72,8 @@ use crate::peer_store::PeerStore;
7072
use crate::runtime::Runtime;
7173
use crate::tx_broadcaster::TransactionBroadcaster;
7274
use crate::types::{
73-
ChainMonitor, ChannelManager, DynStore, GossipSync, Graph, KeysManager, MessageRouter,
74-
OnionMessenger, PaymentStore, PeerManager, Persister,
75+
ChainMonitor, ChannelManager, DomainResolver, DynStore, GossipSync, Graph, HRNResolver,
76+
KeysManager, MessageRouter, OnionMessenger, PaymentStore, PeerManager, Persister,
7577
};
7678
use crate::wallet::persist::KVStoreWalletPersister;
7779
use crate::wallet::Wallet;
@@ -196,6 +198,8 @@ pub enum BuildError {
196198
NetworkMismatch,
197199
/// The role of the node in an asynchronous payments context is not compatible with the current configuration.
198200
AsyncPaymentsConfigMismatch,
201+
/// An attempt to setup a DNS Resolver failed.
202+
DNSResolverSetupFailed,
199203
}
200204

201205
impl fmt::Display for BuildError {
@@ -230,12 +234,20 @@ impl fmt::Display for BuildError {
230234
"The async payments role is not compatible with the current configuration."
231235
)
232236
},
237+
Self::DNSResolverSetupFailed => {
238+
write!(f, "An attempt to setup a DNS resolver has failed.")
239+
},
233240
}
234241
}
235242
}
236243

237244
impl std::error::Error for BuildError {}
238245

246+
enum Resolver {
247+
HRN(Arc<HRNResolver>),
248+
DNS(Arc<DomainResolver>),
249+
}
250+
239251
/// A builder for an [`Node`] instance, allowing to set some configuration and module choices from
240252
/// the getgo.
241253
///
@@ -1537,7 +1549,22 @@ fn build_with_store_internal(
15371549
})?;
15381550
}
15391551

1540-
let hrn_resolver = Arc::new(LDKOnionMessageDNSSECHrnResolver::new(Arc::clone(&network_graph)));
1552+
let resolver = if config.is_hrn_resolver {
1553+
Resolver::DNS(Arc::new(OMDomainResolver::ignoring_incoming_proofs(
1554+
"8.8.8.8:53".parse().map_err(|_| BuildError::DNSResolverSetupFailed)?,
1555+
)))
1556+
} else {
1557+
Resolver::HRN(Arc::new(LDKOnionMessageDNSSECHrnResolver::new(Arc::clone(&network_graph))))
1558+
};
1559+
1560+
let om_resolver = match resolver {
1561+
Resolver::DNS(ref dns_resolver) => {
1562+
Arc::clone(dns_resolver) as Arc<dyn DNSResolverMessageHandler + Send + Sync>
1563+
},
1564+
Resolver::HRN(ref hrn_resolver) => {
1565+
Arc::clone(hrn_resolver) as Arc<dyn DNSResolverMessageHandler + Send + Sync>
1566+
},
1567+
};
15411568

15421569
// Initialize the PeerManager
15431570
let onion_messenger: Arc<OnionMessenger> =
@@ -1550,7 +1577,7 @@ fn build_with_store_internal(
15501577
message_router,
15511578
Arc::clone(&channel_manager),
15521579
Arc::clone(&channel_manager),
1553-
Arc::clone(&hrn_resolver),
1580+
Arc::clone(&om_resolver),
15541581
IgnoringMessageHandler {},
15551582
))
15561583
} else {
@@ -1562,7 +1589,7 @@ fn build_with_store_internal(
15621589
message_router,
15631590
Arc::clone(&channel_manager),
15641591
Arc::clone(&channel_manager),
1565-
Arc::clone(&hrn_resolver),
1592+
Arc::clone(&om_resolver),
15661593
IgnoringMessageHandler {},
15671594
))
15681595
};
@@ -1696,9 +1723,15 @@ fn build_with_store_internal(
16961723

16971724
let peer_manager_clone = Arc::clone(&peer_manager);
16981725

1699-
hrn_resolver.register_post_queue_action(Box::new(move || {
1700-
peer_manager_clone.process_events();
1701-
}));
1726+
let hrn_resolver = match resolver {
1727+
Resolver::DNS(_) => None,
1728+
Resolver::HRN(ref hrn_resolver) => {
1729+
hrn_resolver.register_post_queue_action(Box::new(move || {
1730+
peer_manager_clone.process_events();
1731+
}));
1732+
Some(hrn_resolver)
1733+
},
1734+
};
17021735

17031736
liquidity_source.as_ref().map(|l| l.set_peer_manager(Arc::clone(&peer_manager)));
17041737

@@ -1806,7 +1839,7 @@ fn build_with_store_internal(
18061839
node_metrics,
18071840
om_mailbox,
18081841
async_payments_role,
1809-
hrn_resolver,
1842+
hrn_resolver: hrn_resolver.cloned(),
18101843
})
18111844
}
18121845

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
@@ -200,7 +200,7 @@ pub struct Node {
200200
node_metrics: Arc<RwLock<NodeMetrics>>,
201201
om_mailbox: Option<Arc<OnionMessageMailbox>>,
202202
async_payments_role: Option<AsyncPaymentsRole>,
203-
hrn_resolver: Arc<HRNResolver>,
203+
hrn_resolver: Option<Arc<HRNResolver>>,
204204
}
205205

206206
impl Node {
@@ -942,7 +942,7 @@ impl Node {
942942
self.bolt12_payment().into(),
943943
Arc::clone(&self.config),
944944
Arc::clone(&self.logger),
945-
Arc::clone(&self.hrn_resolver),
945+
Arc::new(self.hrn_resolver.clone()),
946946
)
947947
}
948948

@@ -963,7 +963,7 @@ impl Node {
963963
self.bolt12_payment(),
964964
Arc::clone(&self.config),
965965
Arc::clone(&self.logger),
966-
Arc::clone(&self.hrn_resolver),
966+
Arc::new(self.hrn_resolver.clone()),
967967
))
968968
}
969969

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::CombinedScorer;
@@ -24,6 +25,7 @@ use lightning::util::persist::{KVStore, KVStoreSync, MonitorUpdatingPersister};
2425
use lightning::util::ser::{Readable, Writeable, Writer};
2526
use lightning::util::sweep::OutputSweeper;
2627
use lightning_block_sync::gossip::{GossipVerifier, UtxoSource};
28+
use lightning_dns_resolver::OMDomainResolver;
2729
use lightning_liquidity::utils::time::DefaultTimeProvider;
2830
use lightning_net_tokio::SocketDescriptor;
2931

@@ -144,12 +146,14 @@ pub(crate) type OnionMessenger = lightning::onion_message::messenger::OnionMesse
144146
Arc<MessageRouter>,
145147
Arc<ChannelManager>,
146148
Arc<ChannelManager>,
147-
Arc<HRNResolver>,
149+
Arc<dyn DNSResolverMessageHandler + Sync + Send>,
148150
IgnoringMessageHandler,
149151
>;
150152

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

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

0 commit comments

Comments
 (0)