@@ -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 : Vec < 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 : Vec :: new ( ) ,
402
404
}
403
405
}
404
406
@@ -408,6 +410,17 @@ 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 set_banned ( & mut self , node_id : & NodeId ) {
416
+ self . banned_nodes . push ( * 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 . retain ( |id| * id != * node_id) ;
422
+ }
423
+
411
424
/// Dump the contents of this scorer into the configured logger.
412
425
///
413
426
/// Note that this writes roughly one line per channel for which we have a liquidity estimate,
@@ -655,6 +668,10 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> Score for Probabilis
655
668
fn channel_penalty_msat (
656
669
& self , short_channel_id : u64 , source : & NodeId , target : & NodeId , usage : ChannelUsage
657
670
) -> u64 {
671
+ if self . banned_nodes . contains ( source) || self . banned_nodes . contains ( target) {
672
+ return u64:: max_value ( ) ;
673
+ }
674
+
658
675
if let EffectiveCapacity :: ExactLiquidity { liquidity_msat } = usage. effective_capacity {
659
676
if usage. amount_msat > liquidity_msat {
660
677
return u64:: max_value ( ) ;
@@ -1055,7 +1072,8 @@ impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> Writeable for Probab
1055
1072
#[ inline]
1056
1073
fn write < W : Writer > ( & self , w : & mut W ) -> Result < ( ) , io:: Error > {
1057
1074
write_tlv_fields ! ( w, {
1058
- ( 0 , self . channel_liquidities, required)
1075
+ ( 0 , self . channel_liquidities, required) ,
1076
+ ( 1 , self . banned_nodes, vec_type) ,
1059
1077
} ) ;
1060
1078
Ok ( ( ) )
1061
1079
}
@@ -1069,14 +1087,17 @@ ReadableArgs<(ProbabilisticScoringParameters, G, L)> for ProbabilisticScorerUsin
1069
1087
) -> Result < Self , DecodeError > {
1070
1088
let ( params, network_graph, logger) = args;
1071
1089
let mut channel_liquidities = HashMap :: new ( ) ;
1090
+ init_tlv_field_var ! ( banned_nodes, vec_type) ;
1072
1091
read_tlv_fields ! ( r, {
1073
- ( 0 , channel_liquidities, required)
1092
+ ( 0 , channel_liquidities, required) ,
1093
+ ( 1 , banned_nodes, vec_type) ,
1074
1094
} ) ;
1075
1095
Ok ( Self {
1076
1096
params,
1077
1097
network_graph,
1078
1098
logger,
1079
1099
channel_liquidities,
1100
+ banned_nodes : init_tlv_based_struct_field ! ( banned_nodes, vec_type) ,
1080
1101
} )
1081
1102
}
1082
1103
}
0 commit comments