Skip to content

Commit 7a7f031

Browse files
committed
Add CandidateRouteHop to channel_penalty_msat inputs
1 parent 2d0c66b commit 7a7f031

File tree

4 files changed

+438
-193
lines changed

4 files changed

+438
-193
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;
@@ -1063,7 +1063,7 @@ mod tests {
10631063
impl ScoreLookUp for TestScorer {
10641064
type ScoreParams = ();
10651065
fn channel_penalty_msat(
1066-
&self, _short_channel_id: u64, _source: &NodeId, _target: &NodeId, _usage: ChannelUsage, _score_params: &Self::ScoreParams
1066+
&self, _candidate: &CandidateRouteHop, _usage: ChannelUsage, _score_params: &Self::ScoreParams
10671067
) -> u64 { unimplemented!(); }
10681068
}
10691069

lightning/src/routing/router.rs

Lines changed: 58 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -134,18 +134,27 @@ impl<'a, SP: Sized, Sc: ScoreLookUp<ScoreParams = SP>, S: Deref<Target = Sc>> Wr
134134

135135
impl<'a, SP: Sized, Sc: 'a + ScoreLookUp<ScoreParams = SP>, S: Deref<Target = Sc>> ScoreLookUp for ScorerAccountingForInFlightHtlcs<'a, SP, Sc, S> {
136136
type ScoreParams = Sc::ScoreParams;
137-
fn channel_penalty_msat(&self, short_channel_id: u64, source: &NodeId, target: &NodeId, usage: ChannelUsage, score_params: &Self::ScoreParams) -> u64 {
137+
fn channel_penalty_msat(&self, candidate: &CandidateRouteHop, usage: ChannelUsage, score_params: &Self::ScoreParams) -> u64 {
138+
let target = match candidate.target() {
139+
Some(target) => target,
140+
None => return 0,
141+
};
142+
let short_channel_id = match candidate.short_channel_id() {
143+
Some(short_channel_id) => short_channel_id,
144+
None => return 0,
145+
};
146+
let source = candidate.source();
138147
if let Some(used_liquidity) = self.inflight_htlcs.used_liquidity_msat(
139-
source, target, short_channel_id
148+
&source, &target, short_channel_id
140149
) {
141150
let usage = ChannelUsage {
142151
inflight_htlc_msat: usage.inflight_htlc_msat + used_liquidity,
143152
..usage
144153
};
145154

146-
self.scorer.channel_penalty_msat(short_channel_id, source, target, usage, score_params)
155+
self.scorer.channel_penalty_msat(candidate, usage, score_params)
147156
} else {
148-
self.scorer.channel_penalty_msat(short_channel_id, source, target, usage, score_params)
157+
self.scorer.channel_penalty_msat(candidate, usage, score_params)
149158
}
150159
}
151160
}
@@ -1903,7 +1912,7 @@ where L::Target: Logger {
19031912
effective_capacity,
19041913
};
19051914
let channel_penalty_msat = scid_opt.map_or(0,
1906-
|scid| scorer.channel_penalty_msat(scid, &$src_node_id, &$dest_node_id,
1915+
|scid| scorer.channel_penalty_msat($candidate,
19071916
channel_usage, score_params));
19081917
let path_penalty_msat = $next_hops_path_penalty_msat
19091918
.saturating_add(channel_penalty_msat);
@@ -2017,7 +2026,7 @@ where L::Target: Logger {
20172026
if let Some(first_channels) = first_hop_targets.get(&$node_id) {
20182027
for details in first_channels {
20192028
let candidate = CandidateRouteHop::FirstHop { details, node_id: our_node_id };
2020-
add_entry!(candidate, our_node_id, $node_id, $fee_to_target_msat,
2029+
add_entry!(&candidate, our_node_id, $node_id, $fee_to_target_msat,
20212030
$next_hops_value_contribution,
20222031
$next_hops_path_htlc_minimum_msat, $next_hops_path_penalty_msat,
20232032
$next_hops_cltv_delta, $next_hops_path_length);
@@ -2041,7 +2050,7 @@ where L::Target: Logger {
20412050
info: directed_channel,
20422051
short_channel_id: *chan_id,
20432052
};
2044-
add_entry!(candidate, *source, $node_id,
2053+
add_entry!(&candidate, *source, $node_id,
20452054
$fee_to_target_msat,
20462055
$next_hops_value_contribution,
20472056
$next_hops_path_htlc_minimum_msat,
@@ -2072,7 +2081,7 @@ where L::Target: Logger {
20722081
payee_node_id_opt.map(|payee| first_hop_targets.get(&payee).map(|first_channels| {
20732082
for details in first_channels {
20742083
let candidate = CandidateRouteHop::FirstHop { details, node_id: our_node_id };
2075-
let added = add_entry!(candidate, our_node_id, payee, 0, path_value_msat,
2084+
let added = add_entry!(&candidate, our_node_id, payee, 0, path_value_msat,
20762085
0, 0u64, 0, 0).is_some();
20772086
log_trace!(logger, "{} direct route to payee via {}",
20782087
if added { "Added" } else { "Skipped" }, LoggedCandidateHop(&candidate));
@@ -2109,7 +2118,7 @@ where L::Target: Logger {
21092118
CandidateRouteHop::OneHopBlinded { hint, hint_idx }
21102119
} else { CandidateRouteHop::Blinded { hint, hint_idx } };
21112120
let mut path_contribution_msat = path_value_msat;
2112-
if let Some(hop_used_msat) = add_entry!(candidate, intro_node_id, maybe_dummy_payee_node_id,
2121+
if let Some(hop_used_msat) = add_entry!(&candidate, intro_node_id, maybe_dummy_payee_node_id,
21132122
0, path_contribution_msat, 0, 0_u64, 0, 0)
21142123
{
21152124
path_contribution_msat = hop_used_msat;
@@ -2123,7 +2132,7 @@ where L::Target: Logger {
21232132
Some(fee) => fee,
21242133
None => continue
21252134
};
2126-
add_entry!(first_hop_candidate, our_node_id, intro_node_id, blinded_path_fee,
2135+
add_entry!(&first_hop_candidate, our_node_id, intro_node_id, blinded_path_fee,
21272136
path_contribution_msat, candidate.htlc_minimum_msat(), 0_u64,
21282137
candidate.cltv_expiry_delta(),
21292138
candidate.blinded_path().map_or(1, |bp| bp.blinded_hops.len() as u8));
@@ -2166,7 +2175,7 @@ where L::Target: Logger {
21662175
})
21672176
.unwrap_or_else(|| CandidateRouteHop::PrivateHop { hint: hop, target_node_id: target });
21682177

2169-
if let Some(hop_used_msat) = add_entry!(candidate, source, target,
2178+
if let Some(hop_used_msat) = add_entry!(&candidate, source, target,
21702179
aggregate_next_hops_fee_msat, aggregate_path_contribution_msat,
21712180
aggregate_next_hops_path_htlc_minimum_msat, aggregate_next_hops_path_penalty_msat,
21722181
aggregate_next_hops_cltv_delta, aggregate_next_hops_path_length)
@@ -2188,7 +2197,7 @@ where L::Target: Logger {
21882197
effective_capacity: candidate.effective_capacity(),
21892198
};
21902199
let channel_penalty_msat = scorer.channel_penalty_msat(
2191-
hop.short_channel_id, &source, &target, channel_usage, score_params
2200+
&candidate, channel_usage, score_params
21922201
);
21932202
aggregate_next_hops_path_penalty_msat = aggregate_next_hops_path_penalty_msat
21942203
.saturating_add(channel_penalty_msat);
@@ -2205,7 +2214,7 @@ where L::Target: Logger {
22052214
recommended_value_msat, our_node_pubkey);
22062215
for details in first_channels {
22072216
let first_hop_candidate = CandidateRouteHop::FirstHop { details, node_id: our_node_id};
2208-
add_entry!(first_hop_candidate, our_node_id, NodeId::from_pubkey(&prev_hop_id),
2217+
add_entry!(&first_hop_candidate, our_node_id, NodeId::from_pubkey(&prev_hop_id),
22092218
aggregate_next_hops_fee_msat, aggregate_path_contribution_msat,
22102219
aggregate_next_hops_path_htlc_minimum_msat, aggregate_next_hops_path_penalty_msat,
22112220
aggregate_next_hops_cltv_delta, aggregate_next_hops_path_length);
@@ -2246,7 +2255,7 @@ where L::Target: Logger {
22462255
recommended_value_msat, our_node_pubkey);
22472256
for details in first_channels {
22482257
let first_hop_candidate = CandidateRouteHop::FirstHop { details, node_id: our_node_id};
2249-
add_entry!(first_hop_candidate, our_node_id,
2258+
add_entry!(&first_hop_candidate, our_node_id,
22502259
NodeId::from_pubkey(&hop.src_node_id),
22512260
aggregate_next_hops_fee_msat,
22522261
aggregate_path_contribution_msat,
@@ -2723,13 +2732,18 @@ fn build_route_from_hops_internal<L: Deref>(
27232732

27242733
impl ScoreLookUp for HopScorer {
27252734
type ScoreParams = ();
2726-
fn channel_penalty_msat(&self, _short_channel_id: u64, source: &NodeId, target: &NodeId,
2735+
fn channel_penalty_msat(&self, candidate: &CandidateRouteHop,
27272736
_usage: ChannelUsage, _score_params: &Self::ScoreParams) -> u64
27282737
{
2738+
let target = match candidate.target() {
2739+
Some(target) => target,
2740+
None => return 0,
2741+
};
2742+
let source = candidate.source();
27292743
let mut cur_id = self.our_node_id;
27302744
for i in 0..self.hop_ids.len() {
27312745
if let Some(next_id) = self.hop_ids[i] {
2732-
if cur_id == *source && next_id == *target {
2746+
if cur_id == source && next_id == target {
27332747
return 0;
27342748
}
27352749
cur_id = next_id;
@@ -2805,6 +2819,8 @@ mod tests {
28052819

28062820
use core::convert::TryInto;
28072821

2822+
use super::CandidateRouteHop;
2823+
28082824
fn get_channel_details(short_channel_id: Option<u64>, node_id: PublicKey,
28092825
features: InitFeatures, outbound_capacity_msat: u64) -> channelmanager::ChannelDetails {
28102826
channelmanager::ChannelDetails {
@@ -2900,7 +2916,7 @@ mod tests {
29002916
Arc::clone(&logger), &scorer, &(), &random_seed_bytes) {
29012917
assert_eq!(err, "First hop cannot have our_node_pubkey as a destination.");
29022918
} else { panic!(); }
2903-
2919+
29042920
let route = get_route(&our_id, &route_params, &network_graph.read_only(), None,
29052921
Arc::clone(&logger), &scorer, &(), &random_seed_bytes).unwrap();
29062922
assert_eq!(route.paths[0].hops.len(), 2);
@@ -5981,7 +5997,11 @@ mod tests {
59815997
}
59825998
impl ScoreLookUp for BadChannelScorer {
59835999
type ScoreParams = ();
5984-
fn channel_penalty_msat(&self, short_channel_id: u64, _: &NodeId, _: &NodeId, _: ChannelUsage, _score_params:&Self::ScoreParams) -> u64 {
6000+
fn channel_penalty_msat(&self, candidate: &CandidateRouteHop, _: ChannelUsage, _score_params:&Self::ScoreParams) -> u64 {
6001+
let short_channel_id = match candidate.short_channel_id() {
6002+
Some(id) => id,
6003+
None => return 0,
6004+
};
59856005
if short_channel_id == self.short_channel_id { u64::max_value() } else { 0 }
59866006
}
59876007
}
@@ -5997,8 +6017,12 @@ mod tests {
59976017

59986018
impl ScoreLookUp for BadNodeScorer {
59996019
type ScoreParams = ();
6000-
fn channel_penalty_msat(&self, _: u64, _: &NodeId, target: &NodeId, _: ChannelUsage, _score_params:&Self::ScoreParams) -> u64 {
6001-
if *target == self.node_id { u64::max_value() } else { 0 }
6020+
fn channel_penalty_msat(&self, candidate: &CandidateRouteHop, _: ChannelUsage, _score_params:&Self::ScoreParams) -> u64 {
6021+
let target = match candidate.target() {
6022+
Some(target) => target,
6023+
None => return 0,
6024+
};
6025+
if target == self.node_id { u64::max_value() } else { 0 }
60026026
}
60036027
}
60046028

@@ -6484,26 +6508,33 @@ mod tests {
64846508
};
64856509
scorer_params.set_manual_penalty(&NodeId::from_pubkey(&nodes[3]), 123);
64866510
scorer_params.set_manual_penalty(&NodeId::from_pubkey(&nodes[4]), 456);
6487-
assert_eq!(scorer.channel_penalty_msat(42, &NodeId::from_pubkey(&nodes[3]), &NodeId::from_pubkey(&nodes[4]), usage, &scorer_params), 456);
6511+
let network_graph = network_graph.read_only();
6512+
let channels = network_graph.channels();
6513+
let channel = channels.get(&5).unwrap();
6514+
let info = channel.as_directed_from(&NodeId::from_pubkey(&nodes[3])).unwrap();
6515+
let candidate: CandidateRouteHop = CandidateRouteHop::PublicHop {
6516+
info: info.0,
6517+
short_channel_id: 5,
6518+
};
6519+
assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &scorer_params), 456);
64886520

64896521
// Then check we can get a normal route
64906522
let payment_params = PaymentParameters::from_node_id(nodes[10], 42);
64916523
let route_params = RouteParameters::from_payment_params_and_value(
64926524
payment_params, 100);
6493-
let route = get_route(&our_id, &route_params, &network_graph.read_only(), None,
6494-
Arc::clone(&logger), &scorer, &scorer_params, &random_seed_bytes);
6525+
// let route = get_route(&our_id, &route_params, &network_graph.read_only(), None,
6526+
// Arc::clone(&logger), &scorer, &scorer_params, &random_seed_bytes);
6527+
let route = get_route(&our_id, &payment_params, &network_graph, None, 100, Arc::clone(&logger), &scorer, &scorer_params,&random_seed_bytes);
64956528
assert!(route.is_ok());
64966529

64976530
// Then check that we can't get a route if we ban an intermediate node.
64986531
scorer_params.add_banned(&NodeId::from_pubkey(&nodes[3]));
6499-
let route = get_route(&our_id, &route_params, &network_graph.read_only(), None,
6500-
Arc::clone(&logger), &scorer, &scorer_params, &random_seed_bytes);
6532+
let route = get_route(&our_id, &payment_params, &network_graph, None, 100, Arc::clone(&logger), &scorer, &scorer_params,&random_seed_bytes);
65016533
assert!(route.is_err());
65026534

65036535
// Finally make sure we can route again, when we remove the ban.
65046536
scorer_params.remove_banned(&NodeId::from_pubkey(&nodes[3]));
6505-
let route = get_route(&our_id, &route_params, &network_graph.read_only(), None,
6506-
Arc::clone(&logger), &scorer, &scorer_params, &random_seed_bytes);
6537+
let route = get_route(&our_id, &payment_params, &network_graph, None, 100, Arc::clone(&logger), &scorer, &scorer_params,&random_seed_bytes);
65076538
assert!(route.is_ok());
65086539
}
65096540

0 commit comments

Comments
 (0)