Skip to content

Commit e4017c4

Browse files
authored
Merge pull request #3236 from TheBlueMatt/2024-08-unclonable-graph
Stop relying on a `Clone`able `NetworkGraph` ref in `DefaultRouter`
2 parents 4950f3c + 9de7c1d commit e4017c4

File tree

2 files changed

+52
-31
lines changed

2 files changed

+52
-31
lines changed

lightning/src/onion_message/messenger.rs

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -506,8 +506,8 @@ where
506506
I: ExactSizeIterator<Item = ForwardNode>,
507507
T: secp256k1::Signing + secp256k1::Verification
508508
>(
509-
&self, recipient: PublicKey, context: MessageContext, peers: I,
510-
secp_ctx: &Secp256k1<T>, compact_paths: bool
509+
network_graph: &G, recipient: PublicKey, context: MessageContext, peers: I,
510+
entropy_source: &ES, secp_ctx: &Secp256k1<T>, compact_paths: bool,
511511
) -> Result<Vec<BlindedPath>, ()> {
512512
// Limit the number of blinded paths that are computed.
513513
const MAX_PATHS: usize = 3;
@@ -516,7 +516,7 @@ where
516516
// recipient's node_id.
517517
const MIN_PEER_CHANNELS: usize = 3;
518518

519-
let network_graph = self.network_graph.deref().read_only();
519+
let network_graph = network_graph.deref().read_only();
520520
let is_recipient_announced =
521521
network_graph.nodes().contains_key(&NodeId::from_pubkey(&recipient));
522522

@@ -546,7 +546,7 @@ where
546546

547547
let paths = peer_info.into_iter()
548548
.map(|(peer, _, _)| {
549-
BlindedPath::new_for_message(&[peer], recipient, context.clone(), &*self.entropy_source, secp_ctx)
549+
BlindedPath::new_for_message(&[peer], recipient, context.clone(), &**entropy_source, secp_ctx)
550550
})
551551
.take(MAX_PATHS)
552552
.collect::<Result<Vec<_>, _>>();
@@ -555,7 +555,7 @@ where
555555
Ok(paths) if !paths.is_empty() => Ok(paths),
556556
_ => {
557557
if is_recipient_announced {
558-
BlindedPath::one_hop_for_message(recipient, context, &*self.entropy_source, secp_ctx)
558+
BlindedPath::one_hop_for_message(recipient, context, &**entropy_source, secp_ctx)
559559
.map(|path| vec![path])
560560
} else {
561561
Err(())
@@ -571,17 +571,11 @@ where
571571

572572
Ok(paths)
573573
}
574-
}
575574

576-
impl<G: Deref<Target=NetworkGraph<L>>, L: Deref, ES: Deref> MessageRouter for DefaultMessageRouter<G, L, ES>
577-
where
578-
L::Target: Logger,
579-
ES::Target: EntropySource,
580-
{
581-
fn find_path(
582-
&self, sender: PublicKey, peers: Vec<PublicKey>, mut destination: Destination
575+
pub(crate) fn find_path(
576+
network_graph: &G, sender: PublicKey, peers: Vec<PublicKey>, mut destination: Destination
583577
) -> Result<OnionMessagePath, ()> {
584-
let network_graph = self.network_graph.deref().read_only();
578+
let network_graph = network_graph.deref().read_only();
585579
destination.resolve(&network_graph);
586580

587581
let first_node = match destination.first_node() {
@@ -611,26 +605,55 @@ where
611605
}
612606
}
613607

614-
fn create_blinded_paths<
608+
pub(crate) fn create_blinded_paths<
615609
T: secp256k1::Signing + secp256k1::Verification
616610
>(
617-
&self, recipient: PublicKey, context: MessageContext,
618-
peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
611+
network_graph: &G, recipient: PublicKey, context: MessageContext,
612+
peers: Vec<PublicKey>, entropy_source: &ES, secp_ctx: &Secp256k1<T>,
619613
) -> Result<Vec<BlindedPath>, ()> {
620614
let peers = peers
621615
.into_iter()
622616
.map(|node_id| ForwardNode { node_id, short_channel_id: None });
623-
self.create_blinded_paths_from_iter(recipient, context, peers, secp_ctx, false)
617+
Self::create_blinded_paths_from_iter(network_graph, recipient, context, peers.into_iter(), entropy_source, secp_ctx, false)
618+
}
619+
620+
pub(crate) fn create_compact_blinded_paths<
621+
T: secp256k1::Signing + secp256k1::Verification
622+
>(
623+
network_graph: &G, recipient: PublicKey, context: MessageContext,
624+
peers: Vec<ForwardNode>, entropy_source: &ES, secp_ctx: &Secp256k1<T>,
625+
) -> Result<Vec<BlindedPath>, ()> {
626+
Self::create_blinded_paths_from_iter(network_graph, recipient, context, peers.into_iter(), entropy_source, secp_ctx, true)
627+
}
628+
}
629+
630+
impl<G: Deref<Target=NetworkGraph<L>>, L: Deref, ES: Deref> MessageRouter for DefaultMessageRouter<G, L, ES>
631+
where
632+
L::Target: Logger,
633+
ES::Target: EntropySource,
634+
{
635+
fn find_path(
636+
&self, sender: PublicKey, peers: Vec<PublicKey>, destination: Destination
637+
) -> Result<OnionMessagePath, ()> {
638+
Self::find_path(&self.network_graph, sender, peers, destination)
639+
}
640+
641+
fn create_blinded_paths<
642+
T: secp256k1::Signing + secp256k1::Verification
643+
>(
644+
&self, recipient: PublicKey, context: MessageContext, peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
645+
) -> Result<Vec<BlindedPath>, ()> {
646+
Self::create_blinded_paths(&self.network_graph, recipient, context, peers, &self.entropy_source, secp_ctx)
624647
}
625648

626649
fn create_compact_blinded_paths<
627650
T: secp256k1::Signing + secp256k1::Verification
628651
>(
629-
&self, recipient: PublicKey, context: MessageContext,
630-
peers: Vec<ForwardNode>, secp_ctx: &Secp256k1<T>,
652+
&self, recipient: PublicKey, context: MessageContext, peers: Vec<ForwardNode>, secp_ctx: &Secp256k1<T>,
631653
) -> Result<Vec<BlindedPath>, ()> {
632-
self.create_blinded_paths_from_iter(recipient, context, peers.into_iter(), secp_ctx, true)
654+
Self::create_compact_blinded_paths(&self.network_graph, recipient, context, peers, &self.entropy_source, secp_ctx)
633655
}
656+
634657
}
635658

636659
/// A path for sending an [`OnionMessage`].

lightning/src/routing/router.rs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ use core::ops::Deref;
4141
///
4242
/// Implements [`MessageRouter`] by delegating to [`DefaultMessageRouter`]. See those docs for
4343
/// privacy implications.
44-
pub struct DefaultRouter<G: Deref<Target = NetworkGraph<L>> + Clone, L: Deref, ES: Deref, S: Deref, SP: Sized, Sc: ScoreLookUp<ScoreParams = SP>> where
44+
pub struct DefaultRouter<G: Deref<Target = NetworkGraph<L>>, L: Deref, ES: Deref, S: Deref, SP: Sized, Sc: ScoreLookUp<ScoreParams = SP>> where
4545
L::Target: Logger,
4646
S::Target: for <'a> LockableScore<'a, ScoreLookUp = Sc>,
4747
ES::Target: EntropySource,
@@ -51,22 +51,20 @@ pub struct DefaultRouter<G: Deref<Target = NetworkGraph<L>> + Clone, L: Deref, E
5151
entropy_source: ES,
5252
scorer: S,
5353
score_params: SP,
54-
message_router: DefaultMessageRouter<G, L, ES>,
5554
}
5655

57-
impl<G: Deref<Target = NetworkGraph<L>> + Clone, L: Deref, ES: Deref + Clone, S: Deref, SP: Sized, Sc: ScoreLookUp<ScoreParams = SP>> DefaultRouter<G, L, ES, S, SP, Sc> where
56+
impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, ES: Deref, S: Deref, SP: Sized, Sc: ScoreLookUp<ScoreParams = SP>> DefaultRouter<G, L, ES, S, SP, Sc> where
5857
L::Target: Logger,
5958
S::Target: for <'a> LockableScore<'a, ScoreLookUp = Sc>,
6059
ES::Target: EntropySource,
6160
{
6261
/// Creates a new router.
6362
pub fn new(network_graph: G, logger: L, entropy_source: ES, scorer: S, score_params: SP) -> Self {
64-
let message_router = DefaultMessageRouter::new(network_graph.clone(), entropy_source.clone());
65-
Self { network_graph, logger, entropy_source, scorer, score_params, message_router }
63+
Self { network_graph, logger, entropy_source, scorer, score_params }
6664
}
6765
}
6866

69-
impl<G: Deref<Target = NetworkGraph<L>> + Clone, L: Deref, ES: Deref, S: Deref, SP: Sized, Sc: ScoreLookUp<ScoreParams = SP>> Router for DefaultRouter<G, L, ES, S, SP, Sc> where
67+
impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, ES: Deref, S: Deref, SP: Sized, Sc: ScoreLookUp<ScoreParams = SP>> Router for DefaultRouter<G, L, ES, S, SP, Sc> where
7068
L::Target: Logger,
7169
S::Target: for <'a> LockableScore<'a, ScoreLookUp = Sc>,
7270
ES::Target: EntropySource,
@@ -179,31 +177,31 @@ impl<G: Deref<Target = NetworkGraph<L>> + Clone, L: Deref, ES: Deref, S: Deref,
179177
}
180178
}
181179

182-
impl< G: Deref<Target = NetworkGraph<L>> + Clone, L: Deref, ES: Deref, S: Deref, SP: Sized, Sc: ScoreLookUp<ScoreParams = SP>> MessageRouter for DefaultRouter<G, L, ES, S, SP, Sc> where
180+
impl< G: Deref<Target = NetworkGraph<L>>, L: Deref, ES: Deref, S: Deref, SP: Sized, Sc: ScoreLookUp<ScoreParams = SP>> MessageRouter for DefaultRouter<G, L, ES, S, SP, Sc> where
183181
L::Target: Logger,
184182
S::Target: for <'a> LockableScore<'a, ScoreLookUp = Sc>,
185183
ES::Target: EntropySource,
186184
{
187185
fn find_path(
188186
&self, sender: PublicKey, peers: Vec<PublicKey>, destination: Destination
189187
) -> Result<OnionMessagePath, ()> {
190-
self.message_router.find_path(sender, peers, destination)
188+
DefaultMessageRouter::<_, _, ES>::find_path(&self.network_graph, sender, peers, destination)
191189
}
192190

193191
fn create_blinded_paths<
194192
T: secp256k1::Signing + secp256k1::Verification
195193
> (
196194
&self, recipient: PublicKey, context: MessageContext, peers: Vec<PublicKey>, secp_ctx: &Secp256k1<T>,
197195
) -> Result<Vec<BlindedPath>, ()> {
198-
self.message_router.create_blinded_paths(recipient, context, peers, secp_ctx)
196+
DefaultMessageRouter::create_blinded_paths(&self.network_graph, recipient, context, peers, &self.entropy_source, secp_ctx)
199197
}
200198

201199
fn create_compact_blinded_paths<
202200
T: secp256k1::Signing + secp256k1::Verification
203201
> (
204202
&self, recipient: PublicKey, context: MessageContext, peers: Vec<message::ForwardNode>, secp_ctx: &Secp256k1<T>,
205203
) -> Result<Vec<BlindedPath>, ()> {
206-
self.message_router.create_compact_blinded_paths(recipient, context, peers, secp_ctx)
204+
DefaultMessageRouter::create_compact_blinded_paths(&self.network_graph, recipient, context, peers, &self.entropy_source, secp_ctx)
207205
}
208206
}
209207

0 commit comments

Comments
 (0)