]> git.bitcoin.ninja Git - rust-lightning/commitdiff
Relax channel count check for unannounced nodes
authorJeffrey Czyz <jkczyz@gmail.com>
Mon, 17 Jun 2024 19:41:32 +0000 (14:41 -0500)
committerJeffrey Czyz <jkczyz@gmail.com>
Tue, 18 Jun 2024 14:26:29 +0000 (09:26 -0500)
When creating blinded paths, introduction nodes are limited to peers
with at least three channels to prevent easily guessing the recipient.
Relax this check when the recipient is unannounced since they won't be
in the NetworkGraph.

lightning/src/onion_message/messenger.rs
lightning/src/routing/router.rs

index d333eb2103c5ca516217518ab144dab2f84b9807..859c3f2b5b9c88fd6e7c42c23698d1402dcbee61 100644 (file)
@@ -511,7 +511,9 @@ where
                        .filter_map(|peer|
                                network_graph
                                        .node(&NodeId::from_pubkey(&peer.node_id))
-                                       .filter(|info| info.channels.len() >= MIN_PEER_CHANNELS)
+                                       .filter(|info|
+                                               !is_recipient_announced || info.channels.len() >= MIN_PEER_CHANNELS
+                                       )
                                        .map(|info| (peer, info.is_tor_only(), info.channels.len()))
                                        // Allow messages directly with the only peer when unannounced.
                                        .or_else(|| (!is_recipient_announced && has_one_peer)
index 036d6372af098a05cee3c54dde87d8aafe6321f0..28aaba0513fb45de1e9ba9b24d42b463bd548ba4 100644 (file)
@@ -119,9 +119,10 @@ impl<G: Deref<Target = NetworkGraph<L>> + Clone, L: Deref, ES: Deref, S: Deref,
                        .filter(|details| amount_msats <= details.inbound_capacity_msat)
                        .filter(|details| amount_msats >= details.inbound_htlc_minimum_msat.unwrap_or(0))
                        .filter(|details| amount_msats <= details.inbound_htlc_maximum_msat.unwrap_or(u64::MAX))
+                       // Limit to peers with announced channels unless the recipient is unannounced.
                        .filter(|details| network_graph
                                        .node(&NodeId::from_pubkey(&details.counterparty.node_id))
-                                       .map(|node_info| node_info.channels.len() >= MIN_PEER_CHANNELS)
+                                       .map(|node| !is_recipient_announced || node.channels.len() >= MIN_PEER_CHANNELS)
                                        // Allow payments directly with the only peer when unannounced.
                                        .unwrap_or(!is_recipient_announced && has_one_peer)
                        )