Skip to content

Commit 90320d0

Browse files
committed
Add CandidateRouteHop to channel_penalty_msat inputs
1 parent 8d22fb8 commit 90320d0

File tree

4 files changed

+491
-192
lines changed

4 files changed

+491
-192
lines changed

lightning-background-processor/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,7 @@ mod tests {
863863
use lightning::ln::msgs::{ChannelMessageHandler, Init};
864864
use lightning::ln::peer_handler::{PeerManager, MessageHandler, SocketDescriptor, IgnoringMessageHandler};
865865
use lightning::routing::gossip::{NetworkGraph, NodeId, P2PGossipSync};
866-
use lightning::routing::router::{DefaultRouter, Path, RouteHop};
866+
use lightning::routing::router::{DefaultRouter, Path, RouteHop, CandidateRouteHop};
867867
use lightning::routing::scoring::{ChannelUsage, ScoreUpdate, ScoreLookUp};
868868
use lightning::util::config::UserConfig;
869869
use lightning::util::ser::Writeable;
@@ -1066,7 +1066,7 @@ mod tests {
10661066
impl ScoreLookUp for TestScorer {
10671067
type ScoreParams = ();
10681068
fn channel_penalty_msat(
1069-
&self, _short_channel_id: u64, _source: &NodeId, _target: &NodeId, _usage: ChannelUsage, _score_params: &Self::ScoreParams
1069+
&self, _candidate: &CandidateRouteHop, _usage: ChannelUsage, _score_params: &Self::ScoreParams
10701070
) -> u64 { unimplemented!(); }
10711071
}
10721072

lightning/src/routing/router.rs

Lines changed: 51 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -129,18 +129,24 @@ impl<'a, S: Deref> ScorerAccountingForInFlightHtlcs<'a, S> where S::Target: Scor
129129

130130
impl<'a, S: Deref> ScoreLookUp for ScorerAccountingForInFlightHtlcs<'a, S> where S::Target: ScoreLookUp {
131131
type ScoreParams = <S::Target as ScoreLookUp>::ScoreParams;
132-
fn channel_penalty_msat(&self, short_channel_id: u64, source: &NodeId, target: &NodeId, usage: ChannelUsage, score_params: &Self::ScoreParams) -> u64 {
132+
fn channel_penalty_msat(&self, candidate: &CandidateRouteHop, usage: ChannelUsage, score_params: &Self::ScoreParams) -> u64 {
133+
let target = candidate.target();
134+
let short_channel_id = match candidate.short_channel_id() {
135+
Some(short_channel_id) => short_channel_id,
136+
None => return self.scorer.channel_penalty_msat(candidate, usage, score_params),
137+
};
138+
let source = candidate.source();
133139
if let Some(used_liquidity) = self.inflight_htlcs.used_liquidity_msat(
134-
source, target, short_channel_id
140+
&source, &target, short_channel_id
135141
) {
136142
let usage = ChannelUsage {
137143
inflight_htlc_msat: usage.inflight_htlc_msat.saturating_add(used_liquidity),
138144
..usage
139145
};
140146

141-
self.scorer.channel_penalty_msat(short_channel_id, source, target, usage, score_params)
147+
self.scorer.channel_penalty_msat(candidate, usage, score_params)
142148
} else {
143-
self.scorer.channel_penalty_msat(short_channel_id, source, target, usage, score_params)
149+
self.scorer.channel_penalty_msat(candidate, usage, score_params)
144150
}
145151
}
146152
}
@@ -1974,9 +1980,10 @@ where L::Target: Logger {
19741980
inflight_htlc_msat: used_liquidity_msat,
19751981
effective_capacity,
19761982
};
1977-
let channel_penalty_msat = scid_opt.map_or(0,
1978-
|scid| scorer.channel_penalty_msat(scid, &$src_node_id, &$dest_node_id,
1979-
channel_usage, score_params));
1983+
let channel_penalty_msat =
1984+
scorer.channel_penalty_msat($candidate,
1985+
channel_usage,
1986+
score_params);
19801987
let path_penalty_msat = $next_hops_path_penalty_msat
19811988
.saturating_add(channel_penalty_msat);
19821989
let new_graph_node = RouteGraphNode {
@@ -2097,7 +2104,7 @@ where L::Target: Logger {
20972104
if let Some(first_channels) = first_hop_targets.get(&$node_id) {
20982105
for details in first_channels {
20992106
let candidate = CandidateRouteHop::FirstHop { details, node_id: our_node_id };
2100-
add_entry!(candidate, our_node_id, $node_id, $fee_to_target_msat,
2107+
add_entry!(&candidate, our_node_id, $node_id, $fee_to_target_msat,
21012108
$next_hops_value_contribution,
21022109
$next_hops_path_htlc_minimum_msat, $next_hops_path_penalty_msat,
21032110
$next_hops_cltv_delta, $next_hops_path_length);
@@ -2123,7 +2130,7 @@ where L::Target: Logger {
21232130
source_node_id: *source,
21242131
target_node_id: $node_id,
21252132
};
2126-
add_entry!(candidate, *source, $node_id,
2133+
add_entry!(&candidate, *source, $node_id,
21272134
$fee_to_target_msat,
21282135
$next_hops_value_contribution,
21292136
$next_hops_path_htlc_minimum_msat,
@@ -2154,7 +2161,7 @@ where L::Target: Logger {
21542161
payee_node_id_opt.map(|payee| first_hop_targets.get(&payee).map(|first_channels| {
21552162
for details in first_channels {
21562163
let candidate = CandidateRouteHop::FirstHop { details, node_id: our_node_id };
2157-
let added = add_entry!(candidate, our_node_id, payee, 0, path_value_msat,
2164+
let added = add_entry!(&candidate, our_node_id, payee, 0, path_value_msat,
21582165
0, 0u64, 0, 0).is_some();
21592166
log_trace!(logger, "{} direct route to payee via {}",
21602167
if added { "Added" } else { "Skipped" }, LoggedCandidateHop(&candidate));
@@ -2191,7 +2198,7 @@ where L::Target: Logger {
21912198
CandidateRouteHop::OneHopBlinded { hint, hint_idx, target_node_id: maybe_dummy_payee_node_id }
21922199
} else { CandidateRouteHop::Blinded { hint, hint_idx, target_node_id: maybe_dummy_payee_node_id } };
21932200
let mut path_contribution_msat = path_value_msat;
2194-
if let Some(hop_used_msat) = add_entry!(candidate, intro_node_id, maybe_dummy_payee_node_id,
2201+
if let Some(hop_used_msat) = add_entry!(&candidate, intro_node_id, maybe_dummy_payee_node_id,
21952202
0, path_contribution_msat, 0, 0_u64, 0, 0)
21962203
{
21972204
path_contribution_msat = hop_used_msat;
@@ -2207,7 +2214,7 @@ where L::Target: Logger {
22072214
};
22082215
let path_min = candidate.htlc_minimum_msat().saturating_add(
22092216
compute_fees_saturating(candidate.htlc_minimum_msat(), candidate.fees()));
2210-
add_entry!(first_hop_candidate, our_node_id, intro_node_id, blinded_path_fee,
2217+
add_entry!(&first_hop_candidate, our_node_id, intro_node_id, blinded_path_fee,
22112218
path_contribution_msat, path_min, 0_u64, candidate.cltv_expiry_delta(),
22122219
candidate.blinded_path().map_or(1, |bp| bp.blinded_hops.len() as u8));
22132220
}
@@ -2261,7 +2268,7 @@ where L::Target: Logger {
22612268
})
22622269
.unwrap_or_else(|| CandidateRouteHop::PrivateHop { hint: hop, target_node_id: target });
22632270

2264-
if let Some(hop_used_msat) = add_entry!(candidate, source, target,
2271+
if let Some(hop_used_msat) = add_entry!(&candidate, source, target,
22652272
aggregate_next_hops_fee_msat, aggregate_path_contribution_msat,
22662273
aggregate_next_hops_path_htlc_minimum_msat, aggregate_next_hops_path_penalty_msat,
22672274
aggregate_next_hops_cltv_delta, aggregate_next_hops_path_length)
@@ -2283,7 +2290,7 @@ where L::Target: Logger {
22832290
effective_capacity: candidate.effective_capacity(),
22842291
};
22852292
let channel_penalty_msat = scorer.channel_penalty_msat(
2286-
hop.short_channel_id, &source, &target, channel_usage, score_params
2293+
&candidate, channel_usage, score_params
22872294
);
22882295
aggregate_next_hops_path_penalty_msat = aggregate_next_hops_path_penalty_msat
22892296
.saturating_add(channel_penalty_msat);
@@ -2300,7 +2307,7 @@ where L::Target: Logger {
23002307
recommended_value_msat, our_node_pubkey);
23012308
for details in first_channels {
23022309
let first_hop_candidate = CandidateRouteHop::FirstHop { details, node_id: our_node_id};
2303-
add_entry!(first_hop_candidate, our_node_id, NodeId::from_pubkey(&prev_hop_id),
2310+
add_entry!(&first_hop_candidate, our_node_id, NodeId::from_pubkey(&prev_hop_id),
23042311
aggregate_next_hops_fee_msat, aggregate_path_contribution_msat,
23052312
aggregate_next_hops_path_htlc_minimum_msat, aggregate_next_hops_path_penalty_msat,
23062313
aggregate_next_hops_cltv_delta, aggregate_next_hops_path_length);
@@ -2345,7 +2352,7 @@ where L::Target: Logger {
23452352
recommended_value_msat, our_node_pubkey);
23462353
for details in first_channels {
23472354
let first_hop_candidate = CandidateRouteHop::FirstHop { details, node_id: our_node_id};
2348-
add_entry!(first_hop_candidate, our_node_id,
2355+
add_entry!(&first_hop_candidate, our_node_id,
23492356
NodeId::from_pubkey(&hop.src_node_id),
23502357
aggregate_next_hops_fee_msat,
23512358
aggregate_path_contribution_msat,
@@ -2842,13 +2849,15 @@ fn build_route_from_hops_internal<L: Deref>(
28422849

28432850
impl ScoreLookUp for HopScorer {
28442851
type ScoreParams = ();
2845-
fn channel_penalty_msat(&self, _short_channel_id: u64, source: &NodeId, target: &NodeId,
2852+
fn channel_penalty_msat(&self, candidate: &CandidateRouteHop,
28462853
_usage: ChannelUsage, _score_params: &Self::ScoreParams) -> u64
28472854
{
2855+
let target = candidate.target();
2856+
let source = candidate.source();
28482857
let mut cur_id = self.our_node_id;
28492858
for i in 0..self.hop_ids.len() {
28502859
if let Some(next_id) = self.hop_ids[i] {
2851-
if cur_id == *source && next_id == *target {
2860+
if cur_id == source && next_id == target {
28522861
return 0;
28532862
}
28542863
cur_id = next_id;
@@ -2924,6 +2933,8 @@ mod tests {
29242933

29252934
use core::convert::TryInto;
29262935

2936+
use super::CandidateRouteHop;
2937+
29272938
fn get_channel_details(short_channel_id: Option<u64>, node_id: PublicKey,
29282939
features: InitFeatures, outbound_capacity_msat: u64) -> channelmanager::ChannelDetails {
29292940
channelmanager::ChannelDetails {
@@ -6177,7 +6188,11 @@ mod tests {
61776188
}
61786189
impl ScoreLookUp for BadChannelScorer {
61796190
type ScoreParams = ();
6180-
fn channel_penalty_msat(&self, short_channel_id: u64, _: &NodeId, _: &NodeId, _: ChannelUsage, _score_params:&Self::ScoreParams) -> u64 {
6191+
fn channel_penalty_msat(&self, candidate: &CandidateRouteHop, _: ChannelUsage, _score_params:&Self::ScoreParams) -> u64 {
6192+
let short_channel_id = match candidate.short_channel_id() {
6193+
Some(id) => id,
6194+
None => return 0,
6195+
};
61816196
if short_channel_id == self.short_channel_id { u64::max_value() } else { 0 }
61826197
}
61836198
}
@@ -6193,8 +6208,9 @@ mod tests {
61936208

61946209
impl ScoreLookUp for BadNodeScorer {
61956210
type ScoreParams = ();
6196-
fn channel_penalty_msat(&self, _: u64, _: &NodeId, target: &NodeId, _: ChannelUsage, _score_params:&Self::ScoreParams) -> u64 {
6197-
if *target == self.node_id { u64::max_value() } else { 0 }
6211+
fn channel_penalty_msat(&self, candidate: &CandidateRouteHop, _: ChannelUsage, _score_params:&Self::ScoreParams) -> u64 {
6212+
let target = candidate.target();
6213+
if target == self.node_id { u64::max_value() } else { 0 }
61986214
}
61996215
}
62006216

@@ -6680,26 +6696,34 @@ mod tests {
66806696
};
66816697
scorer_params.set_manual_penalty(&NodeId::from_pubkey(&nodes[3]), 123);
66826698
scorer_params.set_manual_penalty(&NodeId::from_pubkey(&nodes[4]), 456);
6683-
assert_eq!(scorer.channel_penalty_msat(42, &NodeId::from_pubkey(&nodes[3]), &NodeId::from_pubkey(&nodes[4]), usage, &scorer_params), 456);
6699+
let network_graph = network_graph.read_only();
6700+
let channels = network_graph.channels();
6701+
let channel = channels.get(&5).unwrap();
6702+
let info = channel.as_directed_from(&NodeId::from_pubkey(&nodes[3])).unwrap();
6703+
let candidate: CandidateRouteHop = CandidateRouteHop::PublicHop {
6704+
info: info.0,
6705+
short_channel_id: 5,
6706+
source_node_id: NodeId::from_pubkey(&nodes[3]),
6707+
target_node_id: NodeId::from_pubkey(&nodes[4]),
6708+
};
6709+
assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &scorer_params), 456);
66846710

66856711
// Then check we can get a normal route
66866712
let payment_params = PaymentParameters::from_node_id(nodes[10], 42);
66876713
let route_params = RouteParameters::from_payment_params_and_value(
66886714
payment_params, 100);
6689-
let route = get_route(&our_id, &route_params, &network_graph.read_only(), None,
6715+
let route = get_route(&our_id, &route_params, &network_graph, None,
66906716
Arc::clone(&logger), &scorer, &scorer_params, &random_seed_bytes);
66916717
assert!(route.is_ok());
66926718

66936719
// Then check that we can't get a route if we ban an intermediate node.
66946720
scorer_params.add_banned(&NodeId::from_pubkey(&nodes[3]));
6695-
let route = get_route(&our_id, &route_params, &network_graph.read_only(), None,
6696-
Arc::clone(&logger), &scorer, &scorer_params, &random_seed_bytes);
6721+
let route = get_route(&our_id, &route_params, &network_graph, None, Arc::clone(&logger), &scorer, &scorer_params,&random_seed_bytes);
66976722
assert!(route.is_err());
66986723

66996724
// Finally make sure we can route again, when we remove the ban.
67006725
scorer_params.remove_banned(&NodeId::from_pubkey(&nodes[3]));
6701-
let route = get_route(&our_id, &route_params, &network_graph.read_only(), None,
6702-
Arc::clone(&logger), &scorer, &scorer_params, &random_seed_bytes);
6726+
let route = get_route(&our_id, &route_params, &network_graph, None, Arc::clone(&logger), &scorer, &scorer_params,&random_seed_bytes);
67036727
assert!(route.is_ok());
67046728
}
67056729

0 commit comments

Comments
 (0)