@@ -17,7 +17,7 @@ use bitcoin::secp256k1::key::PublicKey;
17
17
use ln:: channelmanager:: ChannelDetails ;
18
18
use ln:: features:: { ChannelFeatures , InvoiceFeatures , NodeFeatures } ;
19
19
use ln:: msgs:: { DecodeError , ErrorAction , LightningError , MAX_VALUE_MSAT } ;
20
- use routing:: scoring:: Score ;
20
+ use routing:: scoring:: { ChannelUsage , Score } ;
21
21
use routing:: network_graph:: { DirectedChannelInfoWithUpdate , EffectiveCapacity , NetworkGraph , ReadOnlyNetworkGraph , NodeId , RoutingFees } ;
22
22
use util:: ser:: { Writeable , Readable } ;
23
23
use util:: logger:: { Level , Logger } ;
@@ -433,7 +433,8 @@ impl<'a> CandidateRouteHop<'a> {
433
433
let htlc_maximum_msat = self . htlc_maximum_msat ( ) ;
434
434
AvailableLiquidity {
435
435
htlc_maximum_msat,
436
- remaining_liquidity_msat : htlc_maximum_msat,
436
+ allocated_liquidity_msat : htlc_maximum_msat,
437
+ in_use_liquidity_msat : 0 ,
437
438
}
438
439
}
439
440
}
@@ -449,21 +450,24 @@ impl<'a> CandidateRouteHop<'a> {
449
450
/// is used simply to inform whether a channel can be used in multiple paths.
450
451
struct AvailableLiquidity {
451
452
htlc_maximum_msat : u64 ,
452
- remaining_liquidity_msat : u64 ,
453
+ allocated_liquidity_msat : u64 ,
454
+ in_use_liquidity_msat : u64 ,
453
455
}
454
456
455
457
impl AvailableLiquidity {
456
458
fn as_msat ( & self ) -> u64 {
457
- core:: cmp:: min ( self . htlc_maximum_msat , self . remaining_liquidity_msat )
459
+ let remaining_liquidity_msat = self . allocated_liquidity_msat
460
+ . saturating_sub ( self . in_use_liquidity_msat ) ;
461
+ core:: cmp:: min ( self . htlc_maximum_msat , remaining_liquidity_msat)
458
462
}
459
463
460
464
fn reduce_by ( & mut self , amount_msat : u64 ) -> & mut Self {
461
- self . remaining_liquidity_msat - = amount_msat;
465
+ self . in_use_liquidity_msat + = amount_msat;
462
466
self
463
467
}
464
468
465
469
fn exhaust ( & mut self ) {
466
- self . remaining_liquidity_msat = 0 ;
470
+ self . in_use_liquidity_msat = self . allocated_liquidity_msat ;
467
471
}
468
472
}
469
473
@@ -1074,9 +1078,16 @@ where L::Target: Logger {
1074
1078
}
1075
1079
}
1076
1080
1077
- let path_penalty_msat = $next_hops_path_penalty_msat. saturating_add(
1078
- scorer. channel_penalty_msat( short_channel_id, amount_to_transfer_over_msat,
1079
- available_liquidity_msat, & $src_node_id, & $dest_node_id) ) ;
1081
+ let channel_usage = ChannelUsage {
1082
+ amount_msat: amount_to_transfer_over_msat,
1083
+ inflight_htlc_msat: available_liquidity. in_use_liquidity_msat,
1084
+ effective_capacity: $candidate. effective_capacity( ) ,
1085
+ } ;
1086
+ let channel_penalty_msat = scorer. channel_penalty_msat(
1087
+ short_channel_id, & $src_node_id, & $dest_node_id, channel_usage
1088
+ ) ;
1089
+ let path_penalty_msat = $next_hops_path_penalty_msat
1090
+ . saturating_add( channel_penalty_msat) ;
1080
1091
let new_graph_node = RouteGraphNode {
1081
1092
node_id: $src_node_id,
1082
1093
lowest_fee_to_peer_through_node: total_fee_msat,
@@ -1288,9 +1299,16 @@ where L::Target: Logger {
1288
1299
short_channel_id : hop. short_channel_id ,
1289
1300
} )
1290
1301
. unwrap_or_else ( || CandidateRouteHop :: PrivateHop { hint : hop } ) ;
1291
- let capacity_msat = candidate. effective_capacity ( ) . as_msat ( ) ;
1302
+ let channel_usage = ChannelUsage {
1303
+ amount_msat : final_value_msat,
1304
+ inflight_htlc_msat : 0 ,
1305
+ effective_capacity : candidate. effective_capacity ( ) ,
1306
+ } ;
1307
+ let channel_penalty_msat = scorer. channel_penalty_msat (
1308
+ hop. short_channel_id , & source, & target, channel_usage
1309
+ ) ;
1292
1310
aggregate_next_hops_path_penalty_msat = aggregate_next_hops_path_penalty_msat
1293
- . saturating_add ( scorer . channel_penalty_msat ( hop . short_channel_id , final_value_msat , capacity_msat , & source , & target ) ) ;
1311
+ . saturating_add ( channel_penalty_msat) ;
1294
1312
1295
1313
aggregate_next_hops_cltv_delta = aggregate_next_hops_cltv_delta
1296
1314
. saturating_add ( hop. cltv_expiry_delta as u32 ) ;
@@ -1747,7 +1765,7 @@ fn add_random_cltv_offset(route: &mut Route, payment_params: &PaymentParameters,
1747
1765
mod tests {
1748
1766
use routing:: network_graph:: { NetworkGraph , NetGraphMsgHandler , NodeId } ;
1749
1767
use routing:: router:: { get_route, add_random_cltv_offset, default_node_features, PaymentParameters , Route , RouteHint , RouteHintHop , RouteHop , RoutingFees , DEFAULT_MAX_TOTAL_CLTV_EXPIRY_DELTA } ;
1750
- use routing:: scoring:: Score ;
1768
+ use routing:: scoring:: { ChannelUsage , Score } ;
1751
1769
use chain:: transaction:: OutPoint ;
1752
1770
use chain:: keysinterface:: KeysInterface ;
1753
1771
use ln:: features:: { ChannelFeatures , InitFeatures , InvoiceFeatures , NodeFeatures } ;
@@ -5088,7 +5106,7 @@ mod tests {
5088
5106
fn write < W : Writer > ( & self , _w : & mut W ) -> Result < ( ) , :: io:: Error > { unimplemented ! ( ) }
5089
5107
}
5090
5108
impl Score for BadChannelScorer {
5091
- fn channel_penalty_msat ( & self , short_channel_id : u64 , _send_amt : u64 , _capacity_msat : u64 , _source : & NodeId , _target : & NodeId ) -> u64 {
5109
+ fn channel_penalty_msat ( & self , short_channel_id : u64 , _ : & NodeId , _ : & NodeId , _ : ChannelUsage ) -> u64 {
5092
5110
if short_channel_id == self . short_channel_id { u64:: max_value ( ) } else { 0 }
5093
5111
}
5094
5112
@@ -5106,7 +5124,7 @@ mod tests {
5106
5124
}
5107
5125
5108
5126
impl Score for BadNodeScorer {
5109
- fn channel_penalty_msat ( & self , _short_channel_id : u64 , _send_amt : u64 , _capacity_msat : u64 , _source : & NodeId , target : & NodeId ) -> u64 {
5127
+ fn channel_penalty_msat ( & self , _ : u64 , _ : & NodeId , target : & NodeId , _ : ChannelUsage ) -> u64 {
5110
5128
if * target == self . node_id { u64:: max_value ( ) } else { 0 }
5111
5129
}
5112
5130
0 commit comments