Skip to content

Commit d167158

Browse files
committed
Allow nodes to be avoided during pathfinding
Users may want to - for whatever reasons - prevent payments to be routed over certain nodes. This change therefore allows to add `NodeId`s to a list of banned nodes, which then will be avoided during path finding.
1 parent abf6564 commit d167158

File tree

1 file changed

+25
-2
lines changed

1 file changed

+25
-2
lines changed

lightning/src/routing/scoring.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ where L::Target: Logger {
300300
logger: L,
301301
// TODO: Remove entries of closed channels.
302302
channel_liquidities: HashMap<u64, ChannelLiquidity<T>>,
303+
banned_nodes: HashSet<NodeId>,
303304
}
304305

305306
/// Parameters for configuring [`ProbabilisticScorer`].
@@ -399,6 +400,7 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ProbabilisticScorerU
399400
network_graph,
400401
logger,
401402
channel_liquidities: HashMap::new(),
403+
banned_nodes: HashSet::new(),
402404
}
403405
}
404406

@@ -408,6 +410,22 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ProbabilisticScorerU
408410
self
409411
}
410412

413+
/// Marks the node with the given `node_id` as banned, i.e.,
414+
/// it will be avoided during path finding.
415+
pub fn add_banned(&mut self, node_id: &NodeId) {
416+
self.banned_nodes.insert(*node_id);
417+
}
418+
419+
/// Removes the node with the given `node_id` from the list of nodes to avoid.
420+
pub fn remove_banned(&mut self, node_id: &NodeId) {
421+
self.banned_nodes.remove(node_id);
422+
}
423+
424+
/// Clears the list of nodes that are avoided during path finding.
425+
pub fn clear_banned(&mut self) {
426+
self.banned_nodes = HashSet::new();
427+
}
428+
411429
/// Dump the contents of this scorer into the configured logger.
412430
///
413431
/// Note that this writes roughly one line per channel for which we have a liquidity estimate,
@@ -655,6 +673,10 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> Score for Probabilis
655673
fn channel_penalty_msat(
656674
&self, short_channel_id: u64, source: &NodeId, target: &NodeId, usage: ChannelUsage
657675
) -> u64 {
676+
if self.banned_nodes.contains(source) || self.banned_nodes.contains(target) {
677+
return u64::max_value();
678+
}
679+
658680
if let EffectiveCapacity::ExactLiquidity { liquidity_msat } = usage.effective_capacity {
659681
if usage.amount_msat > liquidity_msat {
660682
return u64::max_value();
@@ -1055,7 +1077,7 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> Writeable for Probab
10551077
#[inline]
10561078
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
10571079
write_tlv_fields!(w, {
1058-
(0, self.channel_liquidities, required)
1080+
(0, self.channel_liquidities, required),
10591081
});
10601082
Ok(())
10611083
}
@@ -1070,13 +1092,14 @@ ReadableArgs<(ProbabilisticScoringParameters, G, L)> for ProbabilisticScorerUsin
10701092
let (params, network_graph, logger) = args;
10711093
let mut channel_liquidities = HashMap::new();
10721094
read_tlv_fields!(r, {
1073-
(0, channel_liquidities, required)
1095+
(0, channel_liquidities, required),
10741096
});
10751097
Ok(Self {
10761098
params,
10771099
network_graph,
10781100
logger,
10791101
channel_liquidities,
1102+
banned_nodes: HashSet::new(),
10801103
})
10811104
}
10821105
}

0 commit comments

Comments
 (0)