Skip to content

Commit 2272d2f

Browse files
committed
Pass ForwardNode when creating BlindedPath
Instead of passing Vec<PublicKey> to MessageRouter::crate_blinded_path, pass Vec<ForwardNode>. This way callers can include a short_channel_id for a more compact BlindedPath encoding.
1 parent 15a7189 commit 2272d2f

File tree

7 files changed

+31
-21
lines changed

7 files changed

+31
-21
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ use bitcoin::hashes::sha256d::Hash as Sha256dHash;
3131
use bitcoin::hash_types::{BlockHash, WPubkeyHash};
3232

3333
use lightning::blinded_path::BlindedPath;
34+
use lightning::blinded_path::message::ForwardNode;
3435
use lightning::blinded_path::payment::ReceiveTlvs;
3536
use lightning::chain;
3637
use lightning::chain::{BestBlock, ChannelMonitorUpdateStatus, chainmonitor, channelmonitor, Confirm, Watch};
@@ -119,7 +120,7 @@ impl MessageRouter for FuzzRouter {
119120
}
120121

121122
fn create_blinded_paths<T: secp256k1::Signing + secp256k1::Verification>(
122-
&self, _recipient: PublicKey, _peers: Vec<PublicKey>, _secp_ctx: &Secp256k1<T>,
123+
&self, _recipient: PublicKey, _peers: Vec<ForwardNode>, _secp_ctx: &Secp256k1<T>,
123124
) -> Result<Vec<BlindedPath>, ()> {
124125
unreachable!()
125126
}

fuzz/src/full_stack.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ use bitcoin::hashes::sha256d::Hash as Sha256dHash;
2828
use bitcoin::hash_types::{Txid, BlockHash, WPubkeyHash};
2929

3030
use lightning::blinded_path::BlindedPath;
31+
use lightning::blinded_path::message::ForwardNode;
3132
use lightning::blinded_path::payment::ReceiveTlvs;
3233
use lightning::chain;
3334
use lightning::chain::{BestBlock, ChannelMonitorUpdateStatus, Confirm, Listen};
@@ -157,7 +158,7 @@ impl MessageRouter for FuzzRouter {
157158
}
158159

159160
fn create_blinded_paths<T: secp256k1::Signing + secp256k1::Verification>(
160-
&self, _recipient: PublicKey, _peers: Vec<PublicKey>, _secp_ctx: &Secp256k1<T>,
161+
&self, _recipient: PublicKey, _peers: Vec<ForwardNode>, _secp_ctx: &Secp256k1<T>,
161162
) -> Result<Vec<BlindedPath>, ()> {
162163
unreachable!()
163164
}

fuzz/src/onion_message.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use bitcoin::secp256k1::ecdsa::RecoverableSignature;
77
use bitcoin::secp256k1::schnorr;
88

99
use lightning::blinded_path::{BlindedPath, EmptyNodeIdLookUp};
10+
use lightning::blinded_path::message::ForwardNode;
1011
use lightning::ln::features::InitFeatures;
1112
use lightning::ln::msgs::{self, DecodeError, OnionMessageHandler};
1213
use lightning::ln::script::ShutdownScript;
@@ -88,7 +89,7 @@ impl MessageRouter for TestMessageRouter {
8889
}
8990

9091
fn create_blinded_paths<T: secp256k1::Signing + secp256k1::Verification>(
91-
&self, _recipient: PublicKey, _peers: Vec<PublicKey>, _secp_ctx: &Secp256k1<T>,
92+
&self, _recipient: PublicKey, _peers: Vec<ForwardNode>, _secp_ctx: &Secp256k1<T>,
9293
) -> Result<Vec<BlindedPath>, ()> {
9394
unreachable!()
9495
}

lightning/src/ln/channelmanager.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use bitcoin::secp256k1::Secp256k1;
3232
use bitcoin::{secp256k1, Sequence};
3333

3434
use crate::blinded_path::{BlindedPath, NodeIdLookUp};
35+
use crate::blinded_path::message::ForwardNode;
3536
use crate::blinded_path::payment::{Bolt12OfferContext, Bolt12RefundContext, PaymentConstraints, PaymentContext, ReceiveTlvs};
3637
use crate::chain;
3738
use crate::chain::{Confirm, ChannelMonitorUpdateStatus, Watch, BestBlock};
@@ -8985,8 +8986,15 @@ where
89858986

89868987
let peers = self.per_peer_state.read().unwrap()
89878988
.iter()
8988-
.filter(|(_, peer)| peer.lock().unwrap().latest_features.supports_onion_messages())
8989-
.map(|(node_id, _)| *node_id)
8989+
.map(|(node_id, peer_state)| (node_id, peer_state.lock().unwrap()))
8990+
.filter(|(_, peer)| peer.latest_features.supports_onion_messages())
8991+
.map(|(node_id, peer)| ForwardNode {
8992+
node_id: *node_id,
8993+
short_channel_id: peer.channel_by_id
8994+
.iter()
8995+
.find(|(_, channel)| channel.context().is_usable())
8996+
.and_then(|(_, channel)| channel.context().get_short_channel_id()),
8997+
})
89908998
.collect::<Vec<_>>();
89918999

89929000
self.router

lightning/src/onion_message/messenger.rs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ pub trait MessageRouter {
294294
fn create_blinded_paths<
295295
T: secp256k1::Signing + secp256k1::Verification
296296
>(
297-
&self, recipient: PublicKey, peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
297+
&self, recipient: PublicKey, peers: Vec<ForwardNode>, secp_ctx: &Secp256k1<T>,
298298
) -> Result<Vec<BlindedPath>, ()>;
299299
}
300300

@@ -361,7 +361,7 @@ where
361361
fn create_blinded_paths<
362362
T: secp256k1::Signing + secp256k1::Verification
363363
>(
364-
&self, recipient: PublicKey, peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
364+
&self, recipient: PublicKey, peers: Vec<ForwardNode>, secp_ctx: &Secp256k1<T>,
365365
) -> Result<Vec<BlindedPath>, ()> {
366366
// Limit the number of blinded paths that are computed.
367367
const MAX_PATHS: usize = 3;
@@ -374,13 +374,13 @@ where
374374
let is_recipient_announced =
375375
network_graph.nodes().contains_key(&NodeId::from_pubkey(&recipient));
376376

377-
let mut peer_info = peers.iter()
377+
let mut peer_info = peers.into_iter()
378378
// Limit to peers with announced channels
379-
.filter_map(|pubkey|
379+
.filter_map(|peer|
380380
network_graph
381-
.node(&NodeId::from_pubkey(pubkey))
381+
.node(&NodeId::from_pubkey(&peer.node_id))
382382
.filter(|info| info.channels.len() >= MIN_PEER_CHANNELS)
383-
.map(|info| (*pubkey, info.is_tor_only(), info.channels.len()))
383+
.map(|info| (peer, info.is_tor_only(), info.channels.len()))
384384
)
385385
// Exclude Tor-only nodes when the recipient is announced.
386386
.filter(|(_, is_tor_only, _)| !(*is_tor_only && is_recipient_announced))
@@ -392,11 +392,8 @@ where
392392
});
393393

394394
let paths = peer_info.into_iter()
395-
.map(|(node_id, _, _)| vec![ForwardNode { node_id, short_channel_id: None }])
396-
.map(|intermediate_nodes| {
397-
BlindedPath::new_for_message(
398-
&intermediate_nodes, recipient, &*self.entropy_source, secp_ctx
399-
)
395+
.map(|(peer, _, _)| {
396+
BlindedPath::new_for_message(&[peer], recipient, &*self.entropy_source, secp_ctx)
400397
})
401398
.take(MAX_PATHS)
402399
.collect::<Result<Vec<_>, _>>();

lightning/src/routing/router.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
use bitcoin::secp256k1::{PublicKey, Secp256k1, self};
1313

1414
use crate::blinded_path::{BlindedHop, BlindedPath, Direction, IntroductionNode};
15-
use crate::blinded_path::payment::{ForwardNode, ForwardTlvs, PaymentConstraints, PaymentRelay, ReceiveTlvs};
15+
use crate::blinded_path::message;
16+
use crate::blinded_path::payment::{ForwardTlvs, PaymentConstraints, PaymentRelay, ReceiveTlvs, self};
1617
use crate::ln::PaymentHash;
1718
use crate::ln::channelmanager::{ChannelDetails, PaymentId, MIN_FINAL_CLTV_EXPIRY_DELTA};
1819
use crate::ln::features::{BlindedHopFeatures, Bolt11InvoiceFeatures, Bolt12InvoiceFeatures, ChannelFeatures, NodeFeatures};
@@ -121,7 +122,7 @@ impl<G: Deref<Target = NetworkGraph<L>> + Clone, L: Deref, ES: Deref, S: Deref,
121122
max_cltv_expiry: tlvs.payment_constraints.max_cltv_expiry + cltv_expiry_delta,
122123
htlc_minimum_msat: details.inbound_htlc_minimum_msat.unwrap_or(0),
123124
};
124-
Some(ForwardNode {
125+
Some(payment::ForwardNode {
125126
tlvs: ForwardTlvs {
126127
short_channel_id,
127128
payment_relay,
@@ -170,7 +171,7 @@ impl< G: Deref<Target = NetworkGraph<L>> + Clone, L: Deref, ES: Deref, S: Deref,
170171
fn create_blinded_paths<
171172
T: secp256k1::Signing + secp256k1::Verification
172173
> (
173-
&self, recipient: PublicKey, peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
174+
&self, recipient: PublicKey, peers: Vec<message::ForwardNode>, secp_ctx: &Secp256k1<T>,
174175
) -> Result<Vec<BlindedPath>, ()> {
175176
self.message_router.create_blinded_paths(recipient, peers, secp_ctx)
176177
}

lightning/src/util/test_utils.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
// licenses.
99

1010
use crate::blinded_path::BlindedPath;
11+
use crate::blinded_path::message::ForwardNode;
1112
use crate::blinded_path::payment::ReceiveTlvs;
1213
use crate::chain;
1314
use crate::chain::WatchedOutput;
@@ -238,7 +239,7 @@ impl<'a> MessageRouter for TestRouter<'a> {
238239
fn create_blinded_paths<
239240
T: secp256k1::Signing + secp256k1::Verification
240241
>(
241-
&self, recipient: PublicKey, peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
242+
&self, recipient: PublicKey, peers: Vec<ForwardNode>, secp_ctx: &Secp256k1<T>,
242243
) -> Result<Vec<BlindedPath>, ()> {
243244
self.router.create_blinded_paths(recipient, peers, secp_ctx)
244245
}
@@ -273,7 +274,7 @@ impl<'a> MessageRouter for TestMessageRouter<'a> {
273274
}
274275

275276
fn create_blinded_paths<T: secp256k1::Signing + secp256k1::Verification>(
276-
&self, recipient: PublicKey, peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
277+
&self, recipient: PublicKey, peers: Vec<ForwardNode>, secp_ctx: &Secp256k1<T>,
277278
) -> Result<Vec<BlindedPath>, ()> {
278279
self.inner.create_blinded_paths(recipient, peers, secp_ctx)
279280
}

0 commit comments

Comments
 (0)