Skip to content

Commit 318b72e

Browse files
committed
Introduce params Field in create_blinded_paths
1. Added a `params` field to the `create_blinded_paths` function, allowing users to specify Blinded Path Parameters directly. 2. This change simplifies the back-end by eliminating the need for multiple `create_blinded_path` variants tailored to different types of blinded paths. 3. In upcoming commits, the `create_blinded_path_using_absolute_expiry` and `create_compact_blinded_path` functions will be removed as they become redundant.
1 parent 2356ce0 commit 318b72e

File tree

7 files changed

+65
-41
lines changed

7 files changed

+65
-41
lines changed

fuzz/src/chanmon_consistency.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ impl MessageRouter for FuzzRouter {
139139
}
140140

141141
fn create_blinded_paths<T: secp256k1::Signing + secp256k1::Verification>(
142-
&self, _recipient: PublicKey, _context: MessageContext, _peers: Vec<PublicKey>,
142+
&self, _params: BlindedPathParams, _recipient: PublicKey, _context: MessageContext, _peers: Vec<PublicKey>,
143143
_secp_ctx: &Secp256k1<T>,
144144
) -> Result<Vec<BlindedMessagePath>, ()> {
145145
unreachable!()

fuzz/src/full_stack.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ impl MessageRouter for FuzzRouter {
176176
}
177177

178178
fn create_blinded_paths<T: secp256k1::Signing + secp256k1::Verification>(
179-
&self, _recipient: PublicKey, _context: MessageContext, _peers: Vec<PublicKey>,
179+
&self, _params: BlindedPathParams, _recipient: PublicKey, _context: MessageContext, _peers: Vec<PublicKey>,
180180
_secp_ctx: &Secp256k1<T>,
181181
) -> Result<Vec<BlindedMessagePath>, ()> {
182182
unreachable!()

fuzz/src/onion_message.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ impl MessageRouter for TestMessageRouter {
9696
}
9797

9898
fn create_blinded_paths<T: secp256k1::Signing + secp256k1::Verification>(
99-
&self, _recipient: PublicKey, _context: MessageContext, _peers: Vec<PublicKey>,
99+
&self, _params: BlindedPathParams _recipient: PublicKey, _context: MessageContext, _peers: Vec<PublicKey>,
100100
_secp_ctx: &Secp256k1<T>,
101101
) -> Result<Vec<BlindedMessagePath>, ()> {
102102
unreachable!()

lightning/src/ln/channelmanager.rs

+23-11
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ use crate::offers::parse::Bolt12SemanticError;
7070
use crate::offers::refund::{Refund, RefundBuilder};
7171
use crate::offers::signer;
7272
use crate::onion_message::async_payments::{AsyncPaymentsMessage, HeldHtlcAvailable, ReleaseHeldHtlc, AsyncPaymentsMessageHandler};
73-
use crate::onion_message::messenger::{new_pending_onion_message, Destination, MessageRouter, PendingOnionMessage, Responder, ResponseInstruction};
73+
use crate::onion_message::messenger::{new_pending_onion_message, BlindedPathParams, Destination, MessageRouter, PendingOnionMessage, Responder, ResponseInstruction, PATHS_PLACEHOLDER};
7474
use crate::onion_message::offers::{OffersMessage, OffersMessageHandler};
7575
use crate::sign::{EntropySource, NodeSigner, Recipient, SignerProvider};
7676
use crate::sign::ecdsa::EcdsaChannelSigner;
@@ -8818,12 +8818,12 @@ macro_rules! create_offer_builder { ($self: ident, $builder: ty) => {
88188818
let nonce = Nonce::from_entropy_source(entropy);
88198819
let context = OffersContext::InvoiceRequest { nonce };
88208820
let path = $self.create_blinded_paths_using_absolute_expiry(context, absolute_expiry)
8821-
.and_then(|paths| paths.into_iter().next().ok_or(()))
8822-
.map_err(|_| Bolt12SemanticError::MissingPaths)?;
8821+
.and_then(|paths| paths.into_iter().next().ok_or(()))
8822+
.map_err(|_| Bolt12SemanticError::MissingPaths)?;
88238823
let builder = OfferBuilder::deriving_signing_pubkey(node_id, expanded_key, nonce, secp_ctx)
88248824
.chain_hash($self.chain_hash)
88258825
.path(path);
8826-
8826+
88278827
let builder = match absolute_expiry {
88288828
None => builder,
88298829
Some(absolute_expiry) => builder.absolute_expiry(absolute_expiry),
@@ -8890,10 +8890,10 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => {
88908890

88918891
let nonce = Nonce::from_entropy_source(entropy);
88928892
let context = OffersContext::OutboundPayment { payment_id, nonce, hmac: None };
8893+
88938894
let path = $self.create_blinded_paths_using_absolute_expiry(context, Some(absolute_expiry))
88948895
.and_then(|paths| paths.into_iter().next().ok_or(()))
88958896
.map_err(|_| Bolt12SemanticError::MissingPaths)?;
8896-
88978897
let builder = RefundBuilder::deriving_payer_id(
88988898
node_id, expanded_key, nonce, secp_ctx, amount_msats, payment_id
88998899
)?
@@ -9025,8 +9025,12 @@ where
90259025
let invoice_request = builder.build_and_sign()?;
90269026

90279027
let hmac = signer::hmac_for_payment_id(payment_id, nonce, expanded_key);
9028+
let params = BlindedPathParams {
9029+
paths: PATHS_PLACEHOLDER,
9030+
is_compact: false,
9031+
};
90289032
let context = OffersContext::OutboundPayment { payment_id, nonce, hmac: Some(hmac) };
9029-
let reply_paths = self.create_blinded_paths(context)
9033+
let reply_paths = self.create_blinded_paths(params, context)
90309034
.map_err(|_| Bolt12SemanticError::MissingPaths)?;
90319035

90329036
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self);
@@ -9129,11 +9133,15 @@ where
91299133
)?;
91309134
let builder: InvoiceBuilder<DerivedSigningPubkey> = builder.into();
91319135
let invoice = builder.allow_mpp().build_and_sign(secp_ctx)?;
9132-
9136+
9137+
let params = BlindedPathParams {
9138+
paths: PATHS_PLACEHOLDER,
9139+
is_compact: false,
9140+
};
91339141
let context = OffersContext::InboundPayment {
91349142
payment_hash: invoice.payment_hash(),
91359143
};
9136-
let reply_paths = self.create_blinded_paths(context)
9144+
let reply_paths = self.create_blinded_paths(params, context)
91379145
.map_err(|_| Bolt12SemanticError::MissingPaths)?;
91389146

91399147
let mut pending_offers_messages = self.pending_offers_messages.lock().unwrap();
@@ -9280,7 +9288,11 @@ where
92809288
if absolute_expiry.unwrap_or(Duration::MAX) <= max_short_lived_absolute_expiry {
92819289
self.create_compact_blinded_paths(context)
92829290
} else {
9283-
self.create_blinded_paths(context)
9291+
let params = BlindedPathParams {
9292+
paths: PATHS_PLACEHOLDER,
9293+
is_compact: false
9294+
};
9295+
self.create_blinded_paths(params, context)
92849296
}
92859297
}
92869298

@@ -9301,7 +9313,7 @@ where
93019313
/// [`MessageRouter::create_blinded_paths`].
93029314
///
93039315
/// Errors if the `MessageRouter` errors.
9304-
fn create_blinded_paths(&self, context: OffersContext) -> Result<Vec<BlindedMessagePath>, ()> {
9316+
fn create_blinded_paths(&self, params: BlindedPathParams, context: OffersContext) -> Result<Vec<BlindedMessagePath>, ()> {
93059317
let recipient = self.get_our_node_id();
93069318
let secp_ctx = &self.secp_ctx;
93079319

@@ -9314,7 +9326,7 @@ where
93149326
.collect::<Vec<_>>();
93159327

93169328
self.router
9317-
.create_blinded_paths(recipient, MessageContext::Offers(context), peers, secp_ctx)
9329+
.create_blinded_paths(params, recipient, MessageContext::Offers(context), peers, secp_ctx)
93189330
.and_then(|paths| (!paths.is_empty()).then(|| paths).ok_or(()))
93199331
}
93209332

lightning/src/onion_message/messenger.rs

+31-20
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ for OnionMessenger<ES, NS, L, NL, MR, OMH, APH, CMH> where
151151
/// # use lightning::blinded_path::message::{BlindedMessagePath, ForwardNode, MessageContext};
152152
/// # use lightning::sign::{EntropySource, KeysManager};
153153
/// # use lightning::ln::peer_handler::IgnoringMessageHandler;
154-
/// # use lightning::onion_message::messenger::{Destination, MessageRouter, OnionMessagePath, OnionMessenger};
154+
/// # use lightning::onion_message::messenger::{BlindedPathParams, Destination, MessageRouter, OnionMessagePath, OnionMessenger};
155155
/// # use lightning::onion_message::packet::OnionMessageContents;
156156
/// # use lightning::util::logger::{Logger, Record};
157157
/// # use lightning::util::ser::{Writeable, Writer};
@@ -175,7 +175,7 @@ for OnionMessenger<ES, NS, L, NL, MR, OMH, APH, CMH> where
175175
/// # })
176176
/// # }
177177
/// # fn create_blinded_paths<T: secp256k1::Signing + secp256k1::Verification>(
178-
/// # &self, _recipient: PublicKey, _context: MessageContext, _peers: Vec<PublicKey>, _secp_ctx: &Secp256k1<T>
178+
/// # &self, _params: BlindedPathParams, _recipient: PublicKey, _context: MessageContext, _peers: Vec<PublicKey>, _secp_ctx: &Secp256k1<T>
179179
/// # ) -> Result<Vec<BlindedMessagePath>, ()> {
180180
/// # unreachable!()
181181
/// # }
@@ -421,7 +421,7 @@ pub struct PendingOnionMessage<T: OnionMessageContents> {
421421
///
422422
/// PATHS_PLACEHOLDER` is temporarily used as a default value in situations
423423
/// where a path index is required but has not yet been assigned or initialized.
424-
pub const PATHS_PLACEHOLDER: usize = 0;
424+
pub const PATHS_PLACEHOLDER: usize = 3;
425425

426426
/// Represents the types of [`BlindedPath`] that can be created.
427427
///
@@ -461,7 +461,7 @@ pub trait MessageRouter {
461461
fn create_blinded_paths<
462462
T: secp256k1::Signing + secp256k1::Verification
463463
>(
464-
&self, recipient: PublicKey, context: MessageContext, peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
464+
&self, params: BlindedPathParams, recipient: PublicKey, context: MessageContext, peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
465465
) -> Result<Vec<BlindedMessagePath>, ()>;
466466

467467
/// Creates compact [`BlindedMessagePath`]s to the `recipient` node. The nodes in `peers` are
@@ -487,7 +487,13 @@ pub trait MessageRouter {
487487
.into_iter()
488488
.map(|ForwardNode { node_id, short_channel_id: _ }| node_id)
489489
.collect();
490-
self.create_blinded_paths(recipient, context, peers, secp_ctx)
490+
491+
// This parameter is a placeholder. This function is removed in the subsequent commits.
492+
let params = BlindedPathParams {
493+
paths: PATHS_PLACEHOLDER,
494+
is_compact: true,
495+
};
496+
self.create_blinded_paths(params, recipient, context, peers, secp_ctx)
491497
}
492498
}
493499

@@ -522,12 +528,9 @@ where
522528
I: ExactSizeIterator<Item = ForwardNode>,
523529
T: secp256k1::Signing + secp256k1::Verification
524530
>(
525-
network_graph: &G, recipient: PublicKey, context: MessageContext, peers: I,
526-
entropy_source: &ES, secp_ctx: &Secp256k1<T>, compact_paths: bool,
531+
params: BlindedPathParams, network_graph: &G, recipient: PublicKey, context: MessageContext, peers: I,
532+
entropy_source: &ES, secp_ctx: &Secp256k1<T>
527533
) -> Result<Vec<BlindedMessagePath>, ()> {
528-
// Limit the number of blinded paths that are computed.
529-
const MAX_PATHS: usize = 3;
530-
531534
// Ensure peers have at least three channels so that it is more difficult to infer the
532535
// recipient's node_id.
533536
const MIN_PEER_CHANNELS: usize = 3;
@@ -564,7 +567,7 @@ where
564567
.map(|(peer, _, _)| {
565568
BlindedMessagePath::new(&[peer], recipient, context.clone(), &**entropy_source, secp_ctx)
566569
})
567-
.take(MAX_PATHS)
570+
.take(params.paths)
568571
.collect::<Result<Vec<_>, _>>();
569572

570573
let mut paths = match paths {
@@ -579,7 +582,7 @@ where
579582
},
580583
}?;
581584

582-
if compact_paths {
585+
if params.is_compact {
583586
for path in &mut paths {
584587
path.use_compact_introduction_node(&network_graph);
585588
}
@@ -624,13 +627,13 @@ where
624627
pub(crate) fn create_blinded_paths<
625628
T: secp256k1::Signing + secp256k1::Verification
626629
>(
627-
network_graph: &G, recipient: PublicKey, context: MessageContext,
630+
params: BlindedPathParams, network_graph: &G, recipient: PublicKey, context: MessageContext,
628631
peers: Vec<PublicKey>, entropy_source: &ES, secp_ctx: &Secp256k1<T>,
629632
) -> Result<Vec<BlindedMessagePath>, ()> {
630633
let peers = peers
631634
.into_iter()
632635
.map(|node_id| ForwardNode { node_id, short_channel_id: None });
633-
Self::create_blinded_paths_from_iter(network_graph, recipient, context, peers.into_iter(), entropy_source, secp_ctx, false)
636+
Self::create_blinded_paths_from_iter(params, network_graph, recipient, context, peers.into_iter(), entropy_source, secp_ctx)
634637
}
635638

636639
pub(crate) fn create_compact_blinded_paths<
@@ -639,7 +642,11 @@ where
639642
network_graph: &G, recipient: PublicKey, context: MessageContext,
640643
peers: Vec<ForwardNode>, entropy_source: &ES, secp_ctx: &Secp256k1<T>,
641644
) -> Result<Vec<BlindedMessagePath>, ()> {
642-
Self::create_blinded_paths_from_iter(network_graph, recipient, context, peers.into_iter(), entropy_source, secp_ctx, true)
645+
let params = BlindedPathParams {
646+
paths: PATHS_PLACEHOLDER,
647+
is_compact: true,
648+
};
649+
Self::create_blinded_paths_from_iter(params, network_graph, recipient, context, peers.into_iter(), entropy_source, secp_ctx)
643650
}
644651
}
645652

@@ -657,9 +664,9 @@ where
657664
fn create_blinded_paths<
658665
T: secp256k1::Signing + secp256k1::Verification
659666
>(
660-
&self, recipient: PublicKey, context: MessageContext, peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
667+
&self, params: BlindedPathParams, recipient: PublicKey, context: MessageContext, peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
661668
) -> Result<Vec<BlindedMessagePath>, ()> {
662-
Self::create_blinded_paths(&self.network_graph, recipient, context, peers, &self.entropy_source, secp_ctx)
669+
Self::create_blinded_paths(params, &self.network_graph, recipient, context, peers, &self.entropy_source, secp_ctx)
663670
}
664671

665672
fn create_compact_blinded_paths<
@@ -1235,7 +1242,7 @@ where
12351242
.map_err(|_| SendError::PathNotFound)
12361243
}
12371244

1238-
fn create_blinded_path(&self, context: MessageContext) -> Result<BlindedMessagePath, SendError> {
1245+
fn create_blinded_path(&self, params: BlindedPathParams, context: MessageContext) -> Result<BlindedMessagePath, SendError> {
12391246
let recipient = self.node_signer
12401247
.get_node_id(Recipient::Node)
12411248
.map_err(|_| SendError::GetNodeIdFailed)?;
@@ -1248,7 +1255,7 @@ where
12481255
.collect::<Vec<_>>();
12491256

12501257
self.message_router
1251-
.create_blinded_paths(recipient, context, peers, secp_ctx)
1258+
.create_blinded_paths(params, recipient, context, peers, secp_ctx)
12521259
.and_then(|paths| paths.into_iter().next().ok_or(()))
12531260
.map_err(|_| SendError::PathNotFound)
12541261
}
@@ -1346,7 +1353,11 @@ where
13461353

13471354
let message_type = response.message.msg_type();
13481355
let reply_path = if let Some(context) = context {
1349-
match self.create_blinded_path(context) {
1356+
let params = BlindedPathParams {
1357+
paths: PATHS_PLACEHOLDER,
1358+
is_compact: false,
1359+
};
1360+
match self.create_blinded_path(params, context) {
13501361
Ok(reply_path) => Some(reply_path),
13511362
Err(err) => {
13521363
log_trace!(

lightning/src/routing/router.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use crate::ln::features::{BlindedHopFeatures, Bolt11InvoiceFeatures, Bolt12Invoi
2121
use crate::ln::msgs::{DecodeError, ErrorAction, LightningError, MAX_VALUE_MSAT};
2222
use crate::ln::onion_utils;
2323
use crate::offers::invoice::{BlindedPayInfo, Bolt12Invoice};
24-
use crate::onion_message::messenger::{DefaultMessageRouter, Destination, MessageRouter, OnionMessagePath};
24+
use crate::onion_message::messenger::{BlindedPathParams, DefaultMessageRouter, Destination, MessageRouter, OnionMessagePath};
2525
use crate::routing::gossip::{DirectedChannelInfo, EffectiveCapacity, ReadOnlyNetworkGraph, NetworkGraph, NodeId};
2626
use crate::routing::scoring::{ChannelUsage, LockableScore, ScoreLookUp};
2727
use crate::sign::EntropySource;
@@ -196,9 +196,9 @@ impl< G: Deref<Target = NetworkGraph<L>>, L: Deref, ES: Deref, S: Deref, SP: Siz
196196
fn create_blinded_paths<
197197
T: secp256k1::Signing + secp256k1::Verification
198198
> (
199-
&self, recipient: PublicKey, context: MessageContext, peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
199+
&self, params: BlindedPathParams, recipient: PublicKey, context: MessageContext, peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
200200
) -> Result<Vec<BlindedMessagePath>, ()> {
201-
DefaultMessageRouter::create_blinded_paths(&self.network_graph, recipient, context, peers, &self.entropy_source, secp_ctx)
201+
DefaultMessageRouter::create_blinded_paths(params, &self.network_graph, recipient, context, peers, &self.entropy_source, secp_ctx)
202202
}
203203

204204
fn create_compact_blinded_paths<

lightning/src/util/test_utils.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use crate::chain::chainmonitor;
2020
use crate::chain::channelmonitor;
2121
use crate::chain::channelmonitor::MonitorEvent;
2222
use crate::chain::transaction::OutPoint;
23+
use crate::onion_message::messenger::BlindedPathParams;
2324
use crate::routing::router::{CandidateRouteHop, FirstHopCandidate, PublicHopCandidate, PrivateHopCandidate};
2425
use crate::sign;
2526
use crate::events;
@@ -268,10 +269,10 @@ impl<'a> MessageRouter for TestRouter<'a> {
268269
fn create_blinded_paths<
269270
T: secp256k1::Signing + secp256k1::Verification
270271
>(
271-
&self, recipient: PublicKey, context: MessageContext,
272+
&self, params: BlindedPathParams, recipient: PublicKey, context: MessageContext,
272273
peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
273274
) -> Result<Vec<BlindedMessagePath>, ()> {
274-
self.router.create_blinded_paths(recipient, context, peers, secp_ctx)
275+
self.router.create_blinded_paths(params, recipient, context, peers, secp_ctx)
275276
}
276277

277278
fn create_compact_blinded_paths<
@@ -313,10 +314,10 @@ impl<'a> MessageRouter for TestMessageRouter<'a> {
313314
}
314315

315316
fn create_blinded_paths<T: secp256k1::Signing + secp256k1::Verification>(
316-
&self, recipient: PublicKey, context: MessageContext,
317+
&self, params: BlindedPathParams, recipient: PublicKey, context: MessageContext,
317318
peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
318319
) -> Result<Vec<BlindedMessagePath>, ()> {
319-
self.inner.create_blinded_paths(recipient, context, peers, secp_ctx)
320+
self.inner.create_blinded_paths(params, recipient, context, peers, secp_ctx)
320321
}
321322

322323
fn create_compact_blinded_paths<T: secp256k1::Signing + secp256k1::Verification>(

0 commit comments

Comments
 (0)