Drop Deref indirection for NodeIdLookup
What changed, and why it matters
This is a routine Rust code cleanup change. It removes an unnecessary layer of pointer-like indirection (the Deref trait) around a component called NodeIdLookUp, replacing it with a direct trait bound. The commit message and diff show no functional change intended, and no security bug is fixed or introduced.
No security action required. Treat as normal refactoring; review for compilation/API compatibility only.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch refactors generic bounds from NL: Deref where NL::Target: NodeIdLookUp to NL: NodeIdLookUp across blinded_path, outbound_payment, and onion_message modules. It also adds a blanket impl impl<T: NodeIdLookUp + ?Sized, N: Deref<Target = T>> NodeIdLookUp for N so existing smart-pointer wrappers continue to work. This is a type-system simplification with no algorithmic or cryptographic change.
Changed components
lightning/src/blinded_path/message.rslightning/src/blinded_path/mod.rslightning/src/blinded_path/payment.rslightning/src/ln/outbound_payment.rslightning/src/onion_message/messenger.rslightning-background-processor/src/lib.rslightning-dns-resolver/src/lib.rsInspect captured patch +27 / −58
diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs
index a16933f..a67657b 100644
--- a/lightning-background-processor/src/lib.rs
+++ b/lightning-background-processor/src/lib.rs
@@ -415,7 +415,6 @@ pub const NO_ONION_MESSENGER: Option<
EntropySource = &(dyn EntropySource + Send + Sync),
NodeSigner = &(dyn lightning::sign::NodeSigner + Send + Sync),
Logger = &'static (dyn Logger + Send + Sync),
- NodeIdLookUp = DynChannelManager,
NL = &'static DynChannelManager,
MessageRouter = &'static DynMessageRouter,
OffersMessageHandler = lightning::ln::peer_handler::IgnoringMessageHandler,
diff --git a/lightning-dns-resolver/src/lib.rs b/lightning-dns-resolver/src/lib.rs
index 925e658..900672d 100644
--- a/lightning-dns-resolver/src/lib.rs
+++ b/lightning-dns-resolver/src/lib.rs
@@ -203,12 +203,6 @@ mod test {
None
}
}
- impl Deref for DummyNodeLookup {
- type Target = DummyNodeLookup;
- fn deref(&self) -> &DummyNodeLookup {
- self
- }
- }
struct DirectlyConnectedRouter {}
impl MessageRouter for DirectlyConnectedRouter {
diff --git a/lightning/src/blinded_path/message.rs b/lightning/src/blinded_path/message.rs
index 68c4a60..7bcbe80 100644
--- a/lightning/src/blinded_path/message.rs
+++ b/lightning/src/blinded_path/message.rs
@@ -31,7 +31,6 @@ use crate::types::payment::PaymentHash;
use crate::util::scid_utils;
use crate::util::ser::{FixedLengthReader, LengthReadableArgs, Readable, Writeable, Writer};
-use core::ops::Deref;
use core::time::Duration;
use core::{cmp, mem};
@@ -192,11 +191,10 @@ impl BlindedMessagePath {
/// introduction node.
///
/// Will only modify `self` when returning `Ok`.
- pub fn advance_path_by_one<NS: NodeSigner, NL: Deref, T>(
+ pub fn advance_path_by_one<NS: NodeSigner, NL: NodeIdLookUp, T>(
&mut self, node_signer: &NS, node_id_lookup: &NL, secp_ctx: &Secp256k1<T>,
) -> Result<(), ()>
where
- NL::Target: NodeIdLookUp,
T: secp256k1::Signing + secp256k1::Verification,
{
let control_tlvs_ss = node_signer.ecdh(Recipient::Node, &self.0.blinding_point, None)?;
diff --git a/lightning/src/blinded_path/mod.rs b/lightning/src/blinded_path/mod.rs
index 2f9b1b9..d1f58c8 100644
--- a/lightning/src/blinded_path/mod.rs
+++ b/lightning/src/blinded_path/mod.rs
@@ -88,10 +88,9 @@ impl NodeIdLookUp for EmptyNodeIdLookUp {
}
}
-impl Deref for EmptyNodeIdLookUp {
- type Target = EmptyNodeIdLookUp;
- fn deref(&self) -> &Self {
- self
+impl<T: NodeIdLookUp + ?Sized, N: Deref<Target = T>> NodeIdLookUp for N {
+ fn next_node_id(&self, short_channel_id: u64) -> Option<PublicKey> {
+ self.deref().next_node_id(short_channel_id)
}
}
diff --git a/lightning/src/blinded_path/payment.rs b/lightning/src/blinded_path/payment.rs
index df0626e..27292ba 100644
--- a/lightning/src/blinded_path/payment.rs
+++ b/lightning/src/blinded_path/payment.rs
@@ -33,8 +33,6 @@ use crate::util::ser::{
Writeable, Writer,
};
-use core::ops::Deref;
-
#[allow(unused_imports)]
use crate::prelude::*;
@@ -230,11 +228,10 @@ impl BlindedPaymentPath {
/// introduction node.
///
/// Will only modify `self` when returning `Ok`.
- pub fn advance_path_by_one<NS: NodeSigner, NL: Deref, T>(
+ pub fn advance_path_by_one<NS: NodeSigner, NL: NodeIdLookUp, T>(
&mut self, node_signer: &NS, node_id_lookup: &NL, secp_ctx: &Secp256k1<T>,
) -> Result<(), ()>
where
- NL::Target: NodeIdLookUp,
T: secp256k1::Signing + secp256k1::Verification,
{
let (next_node_id, control_tlvs_ss) =
diff --git a/lightning/src/ln/outbound_payment.rs b/lightning/src/ln/outbound_payment.rs
index d366f46..863a4f9 100644
--- a/lightning/src/ln/outbound_payment.rs
+++ b/lightning/src/ln/outbound_payment.rs
@@ -40,7 +40,6 @@ use crate::util::ser::ReadableArgs;
use crate::util::time::Instant;
use core::fmt::{self, Display, Formatter};
-use core::ops::Deref;
use core::sync::atomic::{AtomicBool, Ordering};
use core::time::Duration;
@@ -952,7 +951,7 @@ impl OutboundPayments {
#[rustfmt::skip]
pub(super) fn send_payment_for_bolt12_invoice<
- R: Router, ES: EntropySource, NS: NodeSigner, NL: Deref, IH, SP, L: Logger,
+ R: Router, ES: EntropySource, NS: NodeSigner, NL: NodeIdLookUp, IH, SP, L: Logger,
>(
&self, invoice: &Bolt12Invoice, payment_id: PaymentId, router: &R,
first_hops: Vec<ChannelDetails>, features: Bolt12InvoiceFeatures, inflight_htlcs: IH,
@@ -962,7 +961,6 @@ impl OutboundPayments {
send_payment_along_path: SP, logger: &WithContext<L>,
) -> Result<(), Bolt12PaymentError>
where
- NL::Target: NodeIdLookUp,
IH: Fn() -> InFlightHtlcs,
SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
{
@@ -994,7 +992,7 @@ impl OutboundPayments {
#[rustfmt::skip]
fn send_payment_for_bolt12_invoice_internal<
- R: Router, ES: EntropySource, NS: NodeSigner, NL: Deref, IH, SP, L: Logger,
+ R: Router, ES: EntropySource, NS: NodeSigner, NL: NodeIdLookUp, IH, SP, L: Logger,
>(
&self, payment_id: PaymentId, payment_hash: PaymentHash,
keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>,
@@ -1006,7 +1004,6 @@ impl OutboundPayments {
send_payment_along_path: SP, logger: &WithContext<L>,
) -> Result<(), Bolt12PaymentError>
where
- NL::Target: NodeIdLookUp,
IH: Fn() -> InFlightHtlcs,
SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
{
@@ -1209,9 +1206,9 @@ impl OutboundPayments {
R: Router,
ES: EntropySource,
NS: NodeSigner,
- NL: Deref,
- IH,
- SP,
+ NL: NodeIdLookUp,
+ IH: Fn() -> InFlightHtlcs,
+ SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
L: Logger,
>(
&self, payment_id: PaymentId, hold_htlcs_at_next_hop: bool, router: &R,
@@ -1219,12 +1216,7 @@ impl OutboundPayments {
node_id_lookup: &NL, secp_ctx: &Secp256k1<secp256k1::All>, best_block_height: u32,
pending_events: &Mutex<VecDeque<(events::Event, Option<EventCompletionAction>)>>,
send_payment_along_path: SP, logger: &WithContext<L>,
- ) -> Result<(), Bolt12PaymentError>
- where
- NL::Target: NodeIdLookUp,
- IH: Fn() -> InFlightHtlcs,
- SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
- {
+ ) -> Result<(), Bolt12PaymentError> {
let (
payment_hash,
keysend_preimage,
diff --git a/lightning/src/onion_message/messenger.rs b/lightning/src/onion_message/messenger.rs
index 0aadc6d..5e2ec2d 100644
--- a/lightning/src/onion_message/messenger.rs
+++ b/lightning/src/onion_message/messenger.rs
@@ -72,9 +72,7 @@ pub trait AOnionMessenger {
/// A type implementing [`Logger`]
type Logger: Logger;
/// A type implementing [`NodeIdLookUp`]
- type NodeIdLookUp: NodeIdLookUp + ?Sized;
- /// A type that may be dereferenced to [`Self::NodeIdLookUp`]
- type NL: Deref<Target = Self::NodeIdLookUp>;
+ type NL: NodeIdLookUp;
/// A type implementing [`MessageRouter`]
type MessageRouter: MessageRouter;
/// A type implementing [`OffersMessageHandler`]
@@ -113,7 +111,7 @@ impl<
ES: EntropySource,
NS: NodeSigner,
L: Logger,
- NL: Deref,
+ NL: NodeIdLookUp,
MR: MessageRouter,
OMH: Deref,
APH: Deref,
@@ -121,7 +119,6 @@ impl<
CMH: Deref,
> AOnionMessenger for OnionMessenger<ES, NS, L, NL, MR, OMH, APH, DRH, CMH>
where
- NL::Target: NodeIdLookUp,
OMH::Target: OffersMessageHandler,
APH::Target: AsyncPaymentsMessageHandler,
DRH::Target: DNSResolverMessageHandler,
@@ -130,7 +127,6 @@ where
type EntropySource = ES;
type NodeSigner = NS;
type Logger = L;
- type NodeIdLookUp = NL::Target;
type NL = NL;
type MessageRouter = MR;
type OffersMessageHandler = OMH::Target;
@@ -271,14 +267,13 @@ pub struct OnionMessenger<
ES: EntropySource,
NS: NodeSigner,
L: Logger,
- NL: Deref,
+ NL: NodeIdLookUp,
MR: MessageRouter,
OMH: Deref,
APH: Deref,
DRH: Deref,
CMH: Deref,
> where
- NL::Target: NodeIdLookUp,
OMH::Target: OffersMessageHandler,
APH::Target: AsyncPaymentsMessageHandler,
DRH::Target: DNSResolverMessageHandler,
@@ -1037,16 +1032,13 @@ pub enum PeeledOnion<T: OnionMessageContents> {
pub fn create_onion_message_resolving_destination<
ES: EntropySource,
NS: NodeSigner,
- NL: Deref,
+ NL: NodeIdLookUp,
T: OnionMessageContents,
>(
entropy_source: &ES, node_signer: &NS, node_id_lookup: &NL,
network_graph: &ReadOnlyNetworkGraph, secp_ctx: &Secp256k1<secp256k1::All>,
mut path: OnionMessagePath, contents: T, reply_path: Option<BlindedMessagePath>,
-) -> Result<(PublicKey, OnionMessage, Vec<SocketAddress>), SendError>
-where
- NL::Target: NodeIdLookUp,
-{
+) -> Result<(PublicKey, OnionMessage, Vec<SocketAddress>), SendError> {
path.destination.resolve(network_graph);
create_onion_message(
entropy_source,
@@ -1070,14 +1062,16 @@ where
/// - unless it can be resolved by [`NodeIdLookUp::next_node_id`].
/// Use [`create_onion_message_resolving_destination`] instead to resolve the introduction node
/// first with a [`ReadOnlyNetworkGraph`].
-pub fn create_onion_message<ES: EntropySource, NS: NodeSigner, NL: Deref, T: OnionMessageContents>(
+pub fn create_onion_message<
+ ES: EntropySource,
+ NS: NodeSigner,
+ NL: NodeIdLookUp,
+ T: OnionMessageContents,
+>(
entropy_source: &ES, node_signer: &NS, node_id_lookup: &NL,
secp_ctx: &Secp256k1<secp256k1::All>, path: OnionMessagePath, contents: T,
reply_path: Option<BlindedMessagePath>,
-) -> Result<(PublicKey, OnionMessage, Vec<SocketAddress>), SendError>
-where
- NL::Target: NodeIdLookUp,
-{
+) -> Result<(PublicKey, OnionMessage, Vec<SocketAddress>), SendError> {
let OnionMessagePath { intermediate_nodes, mut destination, first_node_addresses } = path;
if let Destination::BlindedPath(ref path) = destination {
if path.blinded_hops().is_empty() {
@@ -1374,7 +1368,7 @@ impl<
ES: EntropySource,
NS: NodeSigner,
L: Logger,
- NL: Deref,
+ NL: NodeIdLookUp,
MR: MessageRouter,
OMH: Deref,
APH: Deref,
@@ -1382,7 +1376,6 @@ impl<
CMH: Deref,
> OnionMessenger<ES, NS, L, NL, MR, OMH, APH, DRH, CMH>
where
- NL::Target: NodeIdLookUp,
OMH::Target: OffersMessageHandler,
APH::Target: AsyncPaymentsMessageHandler,
DRH::Target: DNSResolverMessageHandler,
@@ -2014,7 +2007,7 @@ impl<
ES: EntropySource,
NS: NodeSigner,
L: Logger,
- NL: Deref,
+ NL: NodeIdLookUp,
MR: MessageRouter,
OMH: Deref,
APH: Deref,
@@ -2022,7 +2015,6 @@ impl<
CMH: Deref,
> EventsProvider for OnionMessenger<ES, NS, L, NL, MR, OMH, APH, DRH, CMH>
where
- NL::Target: NodeIdLookUp,
OMH::Target: OffersMessageHandler,
APH::Target: AsyncPaymentsMessageHandler,
DRH::Target: DNSResolverMessageHandler,
@@ -2131,7 +2123,7 @@ impl<
ES: EntropySource,
NS: NodeSigner,
L: Logger,
- NL: Deref,
+ NL: NodeIdLookUp,
MR: MessageRouter,
OMH: Deref,
APH: Deref,
@@ -2139,7 +2131,6 @@ impl<
CMH: Deref,
> BaseMessageHandler for OnionMessenger<ES, NS, L, NL, MR, OMH, APH, DRH, CMH>
where
- NL::Target: NodeIdLookUp,
OMH::Target: OffersMessageHandler,
APH::Target: AsyncPaymentsMessageHandler,
DRH::Target: DNSResolverMessageHandler,
@@ -2199,7 +2190,7 @@ impl<
ES: EntropySource,
NS: NodeSigner,
L: Logger,
- NL: Deref,
+ NL: NodeIdLookUp,
MR: MessageRouter,
OMH: Deref,
APH: Deref,
@@ -2207,7 +2198,6 @@ impl<
CMH: Deref,
> OnionMessageHandler for OnionMessenger<ES, NS, L, NL, MR, OMH, APH, DRH, CMH>
where
- NL::Target: NodeIdLookUp,
OMH::Target: OffersMessageHandler,
APH::Target: AsyncPaymentsMessageHandler,
DRH::Target: DNSResolverMessageHandler,
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.