Skip to content

Commit 262ac35

Browse files
committed
Consume node_id from CandidateRouteHop
1 parent a34fe05 commit 262ac35

File tree

2 files changed

+37
-25
lines changed

2 files changed

+37
-25
lines changed

lightning/src/routing/router.rs

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,8 +1052,6 @@ pub enum CandidateRouteHop<'a> {
10521052
/// Provided to uniquely identify a hop as we are
10531053
/// route building.
10541054
hint_idx: usize,
1055-
/// The node id of the payer.
1056-
source_node_id: NodeId,
10571055
},
10581056
/// Similar to [`Self::Blinded`], but the path here has 1 blinded hop. `BlindedPayInfo` provided
10591057
/// for 1-hop blinded paths is ignored because it is meant to apply to the hops *between* the
@@ -1069,8 +1067,6 @@ pub enum CandidateRouteHop<'a> {
10691067
/// Provided to uniquely identify a hop as we are
10701068
/// route building.
10711069
hint_idx: usize,
1072-
/// The node id of the payer.
1073-
source_node_id: NodeId,
10741070
},
10751071
}
10761072

@@ -1183,8 +1179,8 @@ impl<'a> CandidateRouteHop<'a> {
11831179
*source_node_id
11841180
},
11851181
CandidateRouteHop::PrivateHop { hint, .. } => hint.src_node_id.into(),
1186-
CandidateRouteHop::Blinded { source_node_id, .. } => *source_node_id,
1187-
CandidateRouteHop::OneHopBlinded { source_node_id, .. } => *source_node_id,
1182+
CandidateRouteHop::Blinded { hint, .. } => hint.1.introduction_node_id.into(),
1183+
CandidateRouteHop::OneHopBlinded { hint, .. } => hint.1.introduction_node_id.into(),
11881184
}
11891185
}
11901186
/// Returns the target node id of this hop, if known.
@@ -1249,7 +1245,7 @@ fn iter_equal<I1: Iterator, I2: Iterator>(mut iter_a: I1, mut iter_b: I2)
12491245
pub struct PathBuildingHop<'a> {
12501246
// Note that this should be dropped in favor of loading it from CandidateRouteHop, but doing so
12511247
// is a larger refactor and will require careful performance analysis.
1252-
node_id: NodeId,
1248+
// node_id: NodeId,
12531249
candidate: CandidateRouteHop<'a>,
12541250
fee_msat: u64,
12551251

@@ -1287,7 +1283,7 @@ impl<'a> core::fmt::Debug for PathBuildingHop<'a> {
12871283
fn fmt(&self, f: &mut core::fmt::Formatter) -> Result<(), core::fmt::Error> {
12881284
let mut debug_struct = f.debug_struct("PathBuildingHop");
12891285
debug_struct
1290-
.field("node_id", &self.node_id)
1286+
.field("node_id", &self.candidate.source())
12911287
.field("short_channel_id", &self.candidate.short_channel_id())
12921288
.field("total_fee_msat", &self.total_fee_msat)
12931289
.field("next_hops_fee_msat", &self.next_hops_fee_msat)
@@ -1940,7 +1936,7 @@ where L::Target: Logger {
19401936
// This will affect our decision on selecting short_channel_id
19411937
// as a way to reach the $dest_node_id.
19421938
PathBuildingHop {
1943-
node_id: $dest_node_id.clone(),
1939+
// node_id: $dest_node_id.clone(),
19441940
candidate: $candidate.clone(),
19451941
fee_msat: 0,
19461942
next_hops_fee_msat: u64::max_value(),
@@ -2030,7 +2026,6 @@ where L::Target: Logger {
20302026
old_entry.next_hops_fee_msat = $next_hops_fee_msat;
20312027
old_entry.hop_use_fee_msat = hop_use_fee_msat;
20322028
old_entry.total_fee_msat = total_fee_msat;
2033-
old_entry.node_id = $dest_node_id.clone();
20342029
old_entry.candidate = $candidate.clone();
20352030
old_entry.fee_msat = 0; // This value will be later filled with hop_use_fee_msat of the following channel
20362031
old_entry.path_htlc_minimum_msat = path_htlc_minimum_msat;
@@ -2203,8 +2198,8 @@ where L::Target: Logger {
22032198
network_nodes.get(&intro_node_id).is_some();
22042199
if !have_intro_node_in_graph || our_node_id == intro_node_id { continue }
22052200
let candidate = if hint.1.blinded_hops.len() == 1 {
2206-
CandidateRouteHop::OneHopBlinded { hint, hint_idx, source_node_id: our_node_id }
2207-
} else { CandidateRouteHop::Blinded { hint, hint_idx, source_node_id: intro_node_id } };
2201+
CandidateRouteHop::OneHopBlinded { hint, hint_idx }
2202+
} else { CandidateRouteHop::Blinded { hint, hint_idx } };
22082203
let mut path_contribution_msat = path_value_msat;
22092204
if let Some(hop_used_msat) = add_entry!(&candidate, intro_node_id, maybe_dummy_payee_node_id,
22102205
0, path_contribution_msat, 0, 0_u64, 0, 0)
@@ -2400,7 +2395,11 @@ where L::Target: Logger {
24002395

24012396
'path_walk: loop {
24022397
let mut features_set = false;
2403-
if let Some(first_channels) = first_hop_targets.get(&ordered_hops.last().unwrap().0.node_id) {
2398+
let target = match ordered_hops.last().unwrap().0.candidate.target() {
2399+
Some(target) => target,
2400+
None => break,
2401+
};
2402+
if let Some(first_channels) = first_hop_targets.get(&target) {
24042403
for details in first_channels {
24052404
if let Some(scid) = ordered_hops.last().unwrap().0.candidate.short_channel_id() {
24062405
if details.get_outbound_payment_scid().unwrap() == scid {
@@ -2412,7 +2411,7 @@ where L::Target: Logger {
24122411
}
24132412
}
24142413
if !features_set {
2415-
if let Some(node) = network_nodes.get(&ordered_hops.last().unwrap().0.node_id) {
2414+
if let Some(node) = network_nodes.get(&ordered_hops.last().unwrap().0.candidate.target().unwrap()) {
24162415
if let Some(node_info) = node.announcement_info.as_ref() {
24172416
ordered_hops.last_mut().unwrap().1 = node_info.features.clone();
24182417
} else {
@@ -2429,11 +2428,11 @@ where L::Target: Logger {
24292428
// save this path for the payment route. Also, update the liquidity
24302429
// remaining on the used hops, so that we take them into account
24312430
// while looking for more paths.
2432-
if ordered_hops.last().unwrap().0.node_id == maybe_dummy_payee_node_id {
2431+
if ordered_hops.last().unwrap().0.candidate.target().unwrap() == maybe_dummy_payee_node_id {
24332432
break 'path_walk;
24342433
}
24352434

2436-
new_entry = match dist.remove(&ordered_hops.last().unwrap().0.node_id) {
2435+
new_entry = match dist.remove(&ordered_hops.last().unwrap().0.candidate.target().unwrap()) {
24372436
Some(payment_hop) => payment_hop,
24382437
// We can't arrive at None because, if we ever add an entry to targets,
24392438
// we also fill in the entry in dist (see add_entry!).
@@ -2472,12 +2471,16 @@ where L::Target: Logger {
24722471
// Remember that we used these channels so that we don't rely
24732472
// on the same liquidity in future paths.
24742473
let mut prevented_redundant_path_selection = false;
2475-
let prev_hop_iter = core::iter::once(&our_node_id)
2476-
.chain(payment_path.hops.iter().map(|(hop, _)| &hop.node_id));
2474+
let prev_hop_iter = core::iter::once(our_node_id)
2475+
.chain(payment_path.hops.iter().map(|(hop, _)| hop.candidate.target().unwrap()));
24772476
for (prev_hop, (hop, _)) in prev_hop_iter.zip(payment_path.hops.iter()) {
2477+
let target = match hop.candidate.target() {
2478+
Some(target) => target,
2479+
None => break,
2480+
};
24782481
let spent_on_hop_msat = value_contribution_msat + hop.next_hops_fee_msat;
24792482
let used_liquidity_msat = used_liquidities
2480-
.entry(hop.candidate.id(*prev_hop < hop.node_id))
2483+
.entry(hop.candidate.id(prev_hop < target))
24812484
.and_modify(|used_liquidity_msat| *used_liquidity_msat += spent_on_hop_msat)
24822485
.or_insert(spent_on_hop_msat);
24832486
let hop_capacity = hop.candidate.effective_capacity();
@@ -2652,8 +2655,8 @@ where L::Target: Logger {
26522655
});
26532656
for idx in 0..(selected_route.len() - 1) {
26542657
if idx + 1 >= selected_route.len() { break; }
2655-
if iter_equal(selected_route[idx ].hops.iter().map(|h| (h.0.candidate.id(true), h.0.node_id)),
2656-
selected_route[idx + 1].hops.iter().map(|h| (h.0.candidate.id(true), h.0.node_id))) {
2658+
if iter_equal(selected_route[idx].hops.iter().map(|h| (h.0.candidate.id(true), h.0.candidate.target())),
2659+
selected_route[idx + 1].hops.iter().map(|h| (h.0.candidate.id(true), h.0.candidate.target()))) {
26572660
let new_value = selected_route[idx].get_value_msat() + selected_route[idx + 1].get_value_msat();
26582661
selected_route[idx].update_value_and_recompute_fees(new_value);
26592662
selected_route.remove(idx + 1);
@@ -2678,14 +2681,15 @@ where L::Target: Logger {
26782681
// there are announced channels between the endpoints. If so, the hop might be
26792682
// referring to any of the announced channels, as its `short_channel_id` might be
26802683
// an alias, in which case we don't take any chances here.
2681-
network_graph.node(&hop.node_id).map_or(false, |hop_node|
2684+
let hop_node_id = hop.candidate.source();
2685+
network_graph.node(&hop_node_id).map_or(false, |hop_node|
26822686
hop_node.channels.iter().any(|scid| network_graph.channel(*scid)
2683-
.map_or(false, |c| c.as_directed_from(&prev_hop_node_id).is_some()))
2687+
.map_or(false, |c| c.as_directed_from(&prev_hop_node_id).is_some()))
26842688
)
26852689
};
26862690

26872691
hops.push(RouteHop {
2688-
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)})?,
2692+
pubkey: PublicKey::from_slice(hop.candidate.target().unwrap().as_slice()).map_err(|_| LightningError{err: format!("Public key {:?} is invalid", &hop.candidate.target().unwrap()), action: ErrorAction::IgnoreAndLog(Level::Trace)})?,
26892693
node_features: node_features.clone(),
26902694
short_channel_id: hop.candidate.short_channel_id().unwrap(),
26912695
channel_features: hop.candidate.features(),
@@ -2694,7 +2698,7 @@ where L::Target: Logger {
26942698
maybe_announced_channel,
26952699
});
26962700

2697-
prev_hop_node_id = hop.node_id;
2701+
prev_hop_node_id = hop.candidate.source();
26982702
}
26992703
let mut final_cltv_delta = final_cltv_expiry_delta;
27002704
let blinded_tail = payment_path.hops.last().and_then(|(h, _)| {

lightning/src/routing/scoring.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3715,6 +3715,14 @@ mod tests {
37153715
source_node_id: source,
37163716
target_node_id: *target
37173717
};
3718+
let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3719+
let (info, target) = channel.as_directed_from(&source).unwrap();
3720+
let candidate: CandidateRouteHop = CandidateRouteHop::PublicHop {
3721+
info,
3722+
short_channel_id: 42,
3723+
source_node_id: source,
3724+
target_node_id: *target,
3725+
};
37183726
// With no historical data the normal liquidity penalty calculation is used, which results
37193727
// in a success probability of ~75%.
37203728
assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 1269);

0 commit comments

Comments
 (0)