Skip to content

Commit 6068c1c

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 7973b8c commit 6068c1c

File tree

6 files changed

+76
-25
lines changed

6 files changed

+76
-25
lines changed

bindings/ldk_node.udl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ enum NodeError {
312312
"InsufficientFunds",
313313
"LiquiditySourceUnavailable",
314314
"LiquidityFeeTooHigh",
315+
"HrnResolverNotConfigured",
315316
};
316317

317318
dictionary NodeStatus {
@@ -348,6 +349,7 @@ enum BuildError {
348349
"WalletSetupFailed",
349350
"LoggerSetupFailed",
350351
"NetworkMismatch",
352+
"DNSResolverSetupFailed",
351353
};
352354

353355
[Trait]

src/builder.rs

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ use crate::peer_store::PeerStore;
3131
use crate::runtime::Runtime;
3232
use crate::tx_broadcaster::TransactionBroadcaster;
3333
use crate::types::{
34-
ChainMonitor, ChannelManager, DynStore, GossipSync, Graph, KeysManager, MessageRouter,
35-
OnionMessenger, PaymentStore, PeerManager,
34+
ChainMonitor, ChannelManager, DomainResolver, DynStore, GossipSync, Graph, HRNResolver,
35+
KeysManager, MessageRouter, OnionMessenger, PaymentStore, PeerManager,
3636
};
3737
use crate::wallet::persist::KVStoreWalletPersister;
3838
use crate::wallet::Wallet;
@@ -43,6 +43,7 @@ use lightning::io::Cursor;
4343
use lightning::ln::channelmanager::{self, ChainParameters, ChannelManagerReadArgs};
4444
use lightning::ln::msgs::{RoutingMessageHandler, SocketAddress};
4545
use lightning::ln::peer_handler::{IgnoringMessageHandler, MessageHandler};
46+
use lightning::onion_message::dns_resolution::DNSResolverMessageHandler;
4647
use lightning::routing::gossip::NodeAlias;
4748
use lightning::routing::router::DefaultRouter;
4849
use lightning::routing::scoring::{
@@ -59,6 +60,8 @@ use lightning::util::sweep::OutputSweeper;
5960

6061
use lightning_persister::fs_store::FilesystemStore;
6162

63+
use lightning_dns_resolver::OMDomainResolver;
64+
6265
use bdk_wallet::template::Bip84;
6366
use bdk_wallet::KeychainKind;
6467
use bdk_wallet::Wallet as BdkWallet;
@@ -193,6 +196,8 @@ pub enum BuildError {
193196
LoggerSetupFailed,
194197
/// The given network does not match the node's previously configured network.
195198
NetworkMismatch,
199+
/// An attempt to setup a DNS Resolver failed.
200+
DNSResolverSetupFailed,
196201
}
197202

198203
impl fmt::Display for BuildError {
@@ -221,12 +226,20 @@ impl fmt::Display for BuildError {
221226
Self::NetworkMismatch => {
222227
write!(f, "Given network does not match the node's previously configured network.")
223228
},
229+
Self::DNSResolverSetupFailed => {
230+
write!(f, "An attempt to setup a DNS resolver has failed.")
231+
},
224232
}
225233
}
226234
}
227235

228236
impl std::error::Error for BuildError {}
229237

238+
enum Resolver {
239+
HRN(Arc<HRNResolver>),
240+
DNS(Arc<DomainResolver>),
241+
}
242+
230243
/// A builder for an [`Node`] instance, allowing to set some configuration and module choices from
231244
/// the getgo.
232245
///
@@ -1456,7 +1469,22 @@ fn build_with_store_internal(
14561469
})?;
14571470
}
14581471

1459-
let hrn_resolver = Arc::new(LDKOnionMessageDNSSECHrnResolver::new(Arc::clone(&network_graph)));
1472+
let resolver = if config.is_hrn_resolver {
1473+
Resolver::DNS(Arc::new(OMDomainResolver::ignoring_incoming_proofs(
1474+
"8.8.8.8:53".parse().map_err(|_| BuildError::DNSResolverSetupFailed)?,
1475+
)))
1476+
} else {
1477+
Resolver::HRN(Arc::new(LDKOnionMessageDNSSECHrnResolver::new(Arc::clone(&network_graph))))
1478+
};
1479+
1480+
let om_resolver = match resolver {
1481+
Resolver::DNS(ref dns_resolver) => {
1482+
Arc::clone(dns_resolver) as Arc<dyn DNSResolverMessageHandler + Send + Sync>
1483+
},
1484+
Resolver::HRN(ref hrn_resolver) => {
1485+
Arc::clone(hrn_resolver) as Arc<dyn DNSResolverMessageHandler + Send + Sync>
1486+
},
1487+
};
14601488

14611489
// Initialize the PeerManager
14621490
let onion_messenger: Arc<OnionMessenger> = Arc::new(OnionMessenger::new(
@@ -1467,7 +1495,7 @@ fn build_with_store_internal(
14671495
message_router,
14681496
Arc::clone(&channel_manager),
14691497
IgnoringMessageHandler {},
1470-
Arc::clone(&hrn_resolver),
1498+
Arc::clone(&om_resolver),
14711499
IgnoringMessageHandler {},
14721500
));
14731501
let ephemeral_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
@@ -1595,9 +1623,15 @@ fn build_with_store_internal(
15951623

15961624
let peer_manager_clone = Arc::clone(&peer_manager);
15971625

1598-
hrn_resolver.register_post_queue_action(Box::new(move || {
1599-
peer_manager_clone.process_events();
1600-
}));
1626+
let hrn_resolver = match resolver {
1627+
Resolver::DNS(_) => None,
1628+
Resolver::HRN(ref hrn_resolver) => {
1629+
hrn_resolver.register_post_queue_action(Box::new(move || {
1630+
peer_manager_clone.process_events();
1631+
}));
1632+
Some(hrn_resolver)
1633+
},
1634+
};
16011635

16021636
liquidity_source.as_ref().map(|l| l.set_peer_manager(Arc::clone(&peer_manager)));
16031637

@@ -1706,7 +1740,7 @@ fn build_with_store_internal(
17061740
is_running,
17071741
is_listening,
17081742
node_metrics,
1709-
hrn_resolver,
1743+
hrn_resolver: hrn_resolver.cloned(),
17101744
})
17111745
}
17121746

src/error.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ pub enum Error {
120120
LiquiditySourceUnavailable,
121121
/// The given operation failed due to the LSP's required opening fee being too high.
122122
LiquidityFeeTooHigh,
123+
/// A HRN resolver was not configured
124+
HrnResolverNotConfigured,
123125
}
124126

125127
impl fmt::Display for Error {
@@ -193,6 +195,9 @@ impl fmt::Display for Error {
193195
Self::LiquidityFeeTooHigh => {
194196
write!(f, "The given operation failed due to the LSP's required opening fee being too high.")
195197
},
198+
Self::HrnResolverNotConfigured => {
199+
write!(f, "A HRN resolver was not configured.")
200+
},
196201
}
197202
}
198203
}

src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ pub struct Node {
206206
is_running: Arc<RwLock<bool>>,
207207
is_listening: Arc<AtomicBool>,
208208
node_metrics: Arc<RwLock<NodeMetrics>>,
209-
hrn_resolver: Arc<HRNResolver>,
209+
hrn_resolver: Option<Arc<HRNResolver>>,
210210
}
211211

212212
impl Node {
@@ -901,7 +901,7 @@ impl Node {
901901
self.bolt12_payment().into(),
902902
Arc::clone(&self.config),
903903
Arc::clone(&self.logger),
904-
Arc::clone(&self.hrn_resolver),
904+
Arc::new(self.hrn_resolver.clone()),
905905
)
906906
}
907907

@@ -922,7 +922,7 @@ impl Node {
922922
self.bolt12_payment(),
923923
Arc::clone(&self.config),
924924
Arc::clone(&self.logger),
925-
Arc::clone(&self.hrn_resolver),
925+
Arc::new(self.hrn_resolver.clone()),
926926
))
927927
}
928928

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
@@ -21,6 +21,7 @@ use lightning::ln::msgs::RoutingMessageHandler;
2121
use lightning::ln::msgs::SocketAddress;
2222
use lightning::ln::peer_handler::IgnoringMessageHandler;
2323
use lightning::ln::types::ChannelId;
24+
use lightning::onion_message::dns_resolution::DNSResolverMessageHandler;
2425
use lightning::routing::gossip;
2526
use lightning::routing::router::DefaultRouter;
2627
use lightning::routing::scoring::{ProbabilisticScorer, ProbabilisticScoringFeeParameters};
@@ -33,6 +34,8 @@ use lightning_block_sync::gossip::{GossipVerifier, UtxoSource};
3334

3435
use lightning_net_tokio::SocketDescriptor;
3536

37+
use lightning_dns_resolver::OMDomainResolver;
38+
3639
use bitcoin::secp256k1::PublicKey;
3740
use bitcoin::OutPoint;
3841

@@ -119,11 +122,12 @@ pub(crate) type OnionMessenger = lightning::onion_message::messenger::OnionMesse
119122
Arc<MessageRouter>,
120123
Arc<ChannelManager>,
121124
IgnoringMessageHandler,
122-
Arc<HRNResolver>,
125+
Arc<dyn DNSResolverMessageHandler + Sync + Send>,
123126
IgnoringMessageHandler,
124127
>;
125128

126129
pub(crate) type HRNResolver = LDKOnionMessageDNSSECHrnResolver<Arc<Graph>, Arc<Logger>>;
130+
pub(crate) type DomainResolver = OMDomainResolver<IgnoringMessageHandler>;
127131

128132
pub(crate) type MessageRouter = lightning::onion_message::messenger::DefaultMessageRouter<
129133
Arc<Graph>,

0 commit comments

Comments
 (0)