Skip to content

Commit a841e6b

Browse files
committed
Onion message routing to immediate peers.
DefaultMessageRouter always fails. Update it so that it can route to a directly connected peer. This is needed for an Offers minimum viable product.
1 parent 681f898 commit a841e6b

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7325,6 +7325,11 @@ where
73257325
/// the node must be announced. Otherwise, there is no way to find a path to the introduction
73267326
/// node in order to send the [`InvoiceRequest`].
73277327
///
7328+
/// # Limitations
7329+
///
7330+
/// Requires a direct connection to the introduction node in the responding [`InvoiceRequest`]'s
7331+
/// reply path.
7332+
///
73287333
/// [`Offer`]: crate::offers::offer::Offer
73297334
/// [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest
73307335
pub fn create_offer_builder(
@@ -7365,13 +7370,19 @@ where
73657370
/// node must be announced. Otherwise, there is no way to find a path to the introduction node
73667371
/// in order to send the [`Bolt12Invoice`].
73677372
///
7373+
/// # Limitations
7374+
///
7375+
/// Requires a direct connection to an introduction node in the responding
7376+
/// [`Bolt12Invoice::payment_paths`].
7377+
///
73687378
/// # Errors
73697379
///
73707380
/// Errors if a duplicate `payment_id` is provided given the caveats in the aforementioned link
73717381
/// or if `amount_msats` is invalid.
73727382
///
73737383
/// [`Refund`]: crate::offers::refund::Refund
73747384
/// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
7385+
/// [`Bolt12Invoice::payment_paths`]: crate::offers::invoice::Bolt12Invoice::payment_paths
73757386
pub fn create_refund_builder(
73767387
&self, description: String, amount_msats: u64, absolute_expiry: Duration,
73777388
payment_id: PaymentId, retry_strategy: Retry, max_total_routing_fee_msat: Option<u64>
@@ -7428,6 +7439,12 @@ where
74287439
/// node must be announced. Otherwise, there is no way to find a path to the introduction node
74297440
/// in order to send the [`Bolt12Invoice`].
74307441
///
7442+
/// # Limitations
7443+
///
7444+
/// Requires a direct connection to an introduction node in [`Offer::paths`] or to
7445+
/// [`Offer::signing_pubkey`], if empty. A similar restriction applies to the responding
7446+
/// [`Bolt12Invoice::payment_paths`].
7447+
///
74317448
/// # Errors
74327449
///
74337450
/// Errors if a duplicate `payment_id` is provided given the caveats in the aforementioned link
@@ -7438,6 +7455,7 @@ where
74387455
/// [`InvoiceRequest::payer_note`]: crate::offers::invoice_request::InvoiceRequest::payer_note
74397456
/// [`InvoiceRequestBuilder`]: crate::offers::invoice_request::InvoiceRequestBuilder
74407457
/// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
7458+
/// [`Bolt12Invoice::payment_paths`]: crate::offers::invoice::Bolt12Invoice::payment_paths
74417459
/// [Avoiding Duplicate Payments]: #avoiding-duplicate-payments
74427460
pub fn pay_for_offer(
74437461
&self, offer: &Offer, quantity: Option<u64>, amount_msats: Option<u64>,
@@ -7507,6 +7525,11 @@ where
75077525
/// [`BlindedPath`] containing the [`PaymentSecret`] needed to reconstruct the corresponding
75087526
/// [`PaymentPreimage`].
75097527
///
7528+
/// # Limitations
7529+
///
7530+
/// Requires a direct connection to an introduction node in [`Refund::paths`] or to
7531+
/// [`Refund::payer_id`], if empty.
7532+
///
75107533
/// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice
75117534
pub fn request_refund_payment(&self, refund: &Refund) -> Result<(), Bolt12SemanticError> {
75127535
let expanded_key = &self.inbound_payment_key;

lightning/src/onion_message/messenger.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,18 @@ pub trait MessageRouter {
177177
) -> Result<OnionMessagePath, ()>;
178178
}
179179

180-
/// A [`MessageRouter`] that always fails.
180+
/// A [`MessageRouter`] that can only route to a directly connected [`Destination`].
181181
pub struct DefaultMessageRouter;
182182

183183
impl MessageRouter for DefaultMessageRouter {
184184
fn find_path(
185-
&self, _sender: PublicKey, _peers: Vec<PublicKey>, _destination: Destination
185+
&self, _sender: PublicKey, peers: Vec<PublicKey>, destination: Destination
186186
) -> Result<OnionMessagePath, ()> {
187-
Err(())
187+
if peers.contains(&destination.first_node()) {
188+
Ok(OnionMessagePath { intermediate_nodes: vec![], destination })
189+
} else {
190+
Err(())
191+
}
188192
}
189193
}
190194

@@ -214,6 +218,13 @@ impl Destination {
214218
Destination::BlindedPath(BlindedPath { blinded_hops, .. }) => blinded_hops.len(),
215219
}
216220
}
221+
222+
fn first_node(&self) -> PublicKey {
223+
match self {
224+
Destination::Node(node_id) => *node_id,
225+
Destination::BlindedPath(BlindedPath { introduction_node_id: node_id, .. }) => *node_id,
226+
}
227+
}
217228
}
218229

219230
/// Errors that may occur when [sending an onion message].

0 commit comments

Comments
 (0)