@@ -1245,9 +1245,6 @@ fn iter_equal<I1: Iterator, I2: Iterator>(mut iter_a: I1, mut iter_b: I2)
1245
1245
/// These fee values are useful to choose hops as we traverse the graph "payee-to-payer".
1246
1246
#[ derive( Clone ) ]
1247
1247
pub struct PathBuildingHop < ' a > {
1248
- // Note that this should be dropped in favor of loading it from CandidateRouteHop, but doing so
1249
- // is a larger refactor and will require careful performance analysis.
1250
- node_id : NodeId ,
1251
1248
candidate : CandidateRouteHop < ' a > ,
1252
1249
fee_msat : u64 ,
1253
1250
@@ -1285,7 +1282,7 @@ impl<'a> core::fmt::Debug for PathBuildingHop<'a> {
1285
1282
fn fmt ( & self , f : & mut core:: fmt:: Formatter ) -> Result < ( ) , core:: fmt:: Error > {
1286
1283
let mut debug_struct = f. debug_struct ( "PathBuildingHop" ) ;
1287
1284
debug_struct
1288
- . field ( "node_id" , & self . node_id )
1285
+ . field ( "node_id" , & self . candidate . target ( ) )
1289
1286
. field ( "short_channel_id" , & self . candidate . short_channel_id ( ) )
1290
1287
. field ( "total_fee_msat" , & self . total_fee_msat )
1291
1288
. field ( "next_hops_fee_msat" , & self . next_hops_fee_msat )
@@ -1822,7 +1819,6 @@ where L::Target: Logger {
1822
1819
// - for regular channels at channel announcement (TODO)
1823
1820
// - for first and last hops early in get_route
1824
1821
let src_node_id = $candidate. source( ) ;
1825
- let dest_node_id = $candidate. target( ) . unwrap_or( maybe_dummy_payee_node_id) ;
1826
1822
if Some ( $candidate. source( ) ) != $candidate. target( ) {
1827
1823
let scid_opt = $candidate. short_channel_id( ) ;
1828
1824
let effective_capacity = $candidate. effective_capacity( ) ;
@@ -1938,9 +1934,8 @@ where L::Target: Logger {
1938
1934
// (recall it goes payee-to-payer) of short_channel_id, first add a
1939
1935
// semi-dummy record just to compute the fees to reach the source node.
1940
1936
// This will affect our decision on selecting short_channel_id
1941
- // as a way to reach the $dest_node_id .
1937
+ // as a way to reach the target node id .
1942
1938
PathBuildingHop {
1943
- node_id: dest_node_id. clone( ) ,
1944
1939
candidate: $candidate. clone( ) ,
1945
1940
fee_msat: 0 ,
1946
1941
next_hops_fee_msat: u64 :: max_value( ) ,
@@ -2030,7 +2025,6 @@ where L::Target: Logger {
2030
2025
old_entry. next_hops_fee_msat = $next_hops_fee_msat;
2031
2026
old_entry. hop_use_fee_msat = hop_use_fee_msat;
2032
2027
old_entry. total_fee_msat = total_fee_msat;
2033
- old_entry. node_id = dest_node_id. clone( ) ;
2034
2028
old_entry. candidate = $candidate. clone( ) ;
2035
2029
old_entry. fee_msat = 0 ; // This value will be later filled with hop_use_fee_msat of the following channel
2036
2030
old_entry. path_htlc_minimum_msat = path_htlc_minimum_msat;
@@ -2399,7 +2393,8 @@ where L::Target: Logger {
2399
2393
2400
2394
' path_walk: loop {
2401
2395
let mut features_set = false ;
2402
- if let Some ( first_channels) = first_hop_targets. get ( & ordered_hops. last ( ) . unwrap ( ) . 0 . node_id ) {
2396
+ let target = ordered_hops. last ( ) . unwrap ( ) . 0 . candidate . target ( ) . unwrap_or ( maybe_dummy_payee_node_id) ;
2397
+ if let Some ( first_channels) = first_hop_targets. get ( & target) {
2403
2398
for details in first_channels {
2404
2399
if let Some ( scid) = ordered_hops. last ( ) . unwrap ( ) . 0 . candidate . short_channel_id ( ) {
2405
2400
if details. get_outbound_payment_scid ( ) . unwrap ( ) == scid {
@@ -2411,7 +2406,7 @@ where L::Target: Logger {
2411
2406
}
2412
2407
}
2413
2408
if !features_set {
2414
- if let Some ( node) = network_nodes. get ( & ordered_hops . last ( ) . unwrap ( ) . 0 . node_id ) {
2409
+ if let Some ( node) = network_nodes. get ( & target ) {
2415
2410
if let Some ( node_info) = node. announcement_info . as_ref ( ) {
2416
2411
ordered_hops. last_mut ( ) . unwrap ( ) . 1 = node_info. features . clone ( ) ;
2417
2412
} else {
@@ -2428,11 +2423,11 @@ where L::Target: Logger {
2428
2423
// save this path for the payment route. Also, update the liquidity
2429
2424
// remaining on the used hops, so that we take them into account
2430
2425
// while looking for more paths.
2431
- if ordered_hops . last ( ) . unwrap ( ) . 0 . node_id == maybe_dummy_payee_node_id {
2426
+ if target == maybe_dummy_payee_node_id {
2432
2427
break ' path_walk;
2433
2428
}
2434
2429
2435
- new_entry = match dist. remove ( & ordered_hops . last ( ) . unwrap ( ) . 0 . node_id ) {
2430
+ new_entry = match dist. remove ( & target ) {
2436
2431
Some ( payment_hop) => payment_hop,
2437
2432
// We can't arrive at None because, if we ever add an entry to targets,
2438
2433
// we also fill in the entry in dist (see add_entry!).
@@ -2651,8 +2646,8 @@ where L::Target: Logger {
2651
2646
} ) ;
2652
2647
for idx in 0 ..( selected_route. len ( ) - 1 ) {
2653
2648
if idx + 1 >= selected_route. len ( ) { break ; }
2654
- if iter_equal ( selected_route[ idx] . hops . iter ( ) . map ( |h| ( h. 0 . candidate . id ( ) , h. 0 . node_id ) ) ,
2655
- selected_route[ idx + 1 ] . hops . iter ( ) . map ( |h| ( h. 0 . candidate . id ( ) , h. 0 . node_id ) ) ) {
2649
+ if iter_equal ( selected_route[ idx] . hops . iter ( ) . map ( |h| ( h. 0 . candidate . id ( ) , h. 0 . candidate . target ( ) ) ) ,
2650
+ selected_route[ idx + 1 ] . hops . iter ( ) . map ( |h| ( h. 0 . candidate . id ( ) , h. 0 . candidate . target ( ) ) ) ) {
2656
2651
let new_value = selected_route[ idx] . get_value_msat ( ) + selected_route[ idx + 1 ] . get_value_msat ( ) ;
2657
2652
selected_route[ idx] . update_value_and_recompute_fees ( new_value) ;
2658
2653
selected_route. remove ( idx + 1 ) ;
@@ -2665,6 +2660,7 @@ where L::Target: Logger {
2665
2660
for ( hop, node_features) in payment_path. hops . iter ( )
2666
2661
. filter ( |( h, _) | h. candidate . short_channel_id ( ) . is_some ( ) )
2667
2662
{
2663
+ let target = hop. candidate . target ( ) . expect ( "target is defined when short_channel_id is defined" ) ;
2668
2664
let maybe_announced_channel = if let CandidateRouteHop :: PublicHop { .. } = hop. candidate {
2669
2665
// If we sourced the hop from the graph we're sure the target node is announced.
2670
2666
true
@@ -2676,14 +2672,14 @@ where L::Target: Logger {
2676
2672
// there are announced channels between the endpoints. If so, the hop might be
2677
2673
// referring to any of the announced channels, as its `short_channel_id` might be
2678
2674
// an alias, in which case we don't take any chances here.
2679
- network_graph. node ( & hop . node_id ) . map_or ( false , |hop_node|
2675
+ network_graph. node ( & target ) . map_or ( false , |hop_node|
2680
2676
hop_node. channels . iter ( ) . any ( |scid| network_graph. channel ( * scid)
2681
2677
. map_or ( false , |c| c. as_directed_from ( & hop. candidate . source ( ) ) . is_some ( ) ) )
2682
2678
)
2683
2679
} ;
2684
2680
2685
2681
hops. push ( RouteHop {
2686
- pubkey : PublicKey :: from_slice ( hop . node_id . as_slice ( ) ) . map_err ( |_| LightningError { err : format ! ( "Public key {:?} is invalid" , & hop . node_id ) , action : ErrorAction :: IgnoreAndLog ( Level :: Trace ) } ) ?,
2682
+ pubkey : PublicKey :: from_slice ( target . as_slice ( ) ) . map_err ( |_| LightningError { err : format ! ( "Public key {:?} is invalid" , & target ) , action : ErrorAction :: IgnoreAndLog ( Level :: Trace ) } ) ?,
2687
2683
node_features : node_features. clone ( ) ,
2688
2684
short_channel_id : hop. candidate . short_channel_id ( ) . unwrap ( ) ,
2689
2685
channel_features : hop. candidate . features ( ) ,
0 commit comments