@@ -300,6 +300,7 @@ where L::Target: Logger {
300
300
logger : L ,
301
301
// TODO: Remove entries of closed channels.
302
302
channel_liquidities : HashMap < u64 , ChannelLiquidity < T > > ,
303
+ banned_nodes : HashSet < NodeId > ,
303
304
}
304
305
305
306
/// Parameters for configuring [`ProbabilisticScorer`].
@@ -399,6 +400,7 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ProbabilisticScorerU
399
400
network_graph,
400
401
logger,
401
402
channel_liquidities : HashMap :: new ( ) ,
403
+ banned_nodes : HashSet :: new ( ) ,
402
404
}
403
405
}
404
406
@@ -408,6 +410,22 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ProbabilisticScorerU
408
410
self
409
411
}
410
412
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
+
411
429
/// Dump the contents of this scorer into the configured logger.
412
430
///
413
431
/// Note that this writes roughly one line per channel for which we have a liquidity estimate,
@@ -672,6 +690,10 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> Score for Probabilis
672
690
fn channel_penalty_msat (
673
691
& self , short_channel_id : u64 , source : & NodeId , target : & NodeId , usage : ChannelUsage
674
692
) -> u64 {
693
+ if self . banned_nodes . contains ( source) || self . banned_nodes . contains ( target) {
694
+ return u64:: max_value ( ) ;
695
+ }
696
+
675
697
if let EffectiveCapacity :: ExactLiquidity { liquidity_msat } = usage. effective_capacity {
676
698
if usage. amount_msat > liquidity_msat {
677
699
return u64:: max_value ( ) ;
@@ -1072,7 +1094,7 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> Writeable for Probab
1072
1094
#[ inline]
1073
1095
fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , io:: Error > {
1074
1096
write_tlv_fields ! ( w, {
1075
- ( 0 , self . channel_liquidities, required)
1097
+ ( 0 , self . channel_liquidities, required) ,
1076
1098
} ) ;
1077
1099
Ok ( ( ) )
1078
1100
}
@@ -1087,13 +1109,14 @@ ReadableArgs<(ProbabilisticScoringParameters, G, L)> for ProbabilisticScorerUsin
1087
1109
let ( params, network_graph, logger) = args;
1088
1110
let mut channel_liquidities = HashMap :: new ( ) ;
1089
1111
read_tlv_fields ! ( r, {
1090
- ( 0 , channel_liquidities, required)
1112
+ ( 0 , channel_liquidities, required) ,
1091
1113
} ) ;
1092
1114
Ok ( Self {
1093
1115
params,
1094
1116
network_graph,
1095
1117
logger,
1096
1118
channel_liquidities,
1119
+ banned_nodes : HashSet :: new ( ) ,
1097
1120
} )
1098
1121
}
1099
1122
}
0 commit comments