Skip to content

Commit 2b7d097

Browse files
committed
Simplify and make scoring calls in TestRouter more complete
`TestRouter` tries to make scoring calls that mimic what an actual router would do, but the changes in f0ecc3e failed to make scoring calls for private hints or if we take a public hop for the last hop. This fixes those regressions, though no tests currently depend on this behavior.
1 parent 6ae0516 commit 2b7d097

File tree

1 file changed

+32
-26
lines changed

1 file changed

+32
-26
lines changed

lightning/src/util/test_utils.rs

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ use crate::ln::msgs::LightningError;
3030
use crate::ln::script::ShutdownScript;
3131
use crate::offers::invoice::UnsignedBolt12Invoice;
3232
use crate::offers::invoice_request::UnsignedInvoiceRequest;
33-
use crate::routing::gossip::{EffectiveCapacity, NetworkGraph, NodeId};
33+
use crate::routing::gossip::{EffectiveCapacity, NetworkGraph, NodeId, RoutingFees};
3434
use crate::routing::utxo::{UtxoLookup, UtxoLookupError, UtxoResult};
35-
use crate::routing::router::{find_route, InFlightHtlcs, Path, Route, RouteParameters, Router, ScorerAccountingForInFlightHtlcs};
35+
use crate::routing::router::{find_route, InFlightHtlcs, Path, Route, RouteParameters, RouteHintHop, Router, ScorerAccountingForInFlightHtlcs};
3636
use crate::routing::scoring::{ChannelUsage, ScoreUpdate, ScoreLookUp};
3737
use crate::sync::RwLock;
3838
use crate::util::config::UserConfig;
@@ -129,6 +129,7 @@ impl<'a> Router for TestRouter<'a> {
129129
let scorer = ScorerAccountingForInFlightHtlcs::new(scorer, &inflight_htlcs);
130130
for path in &route.paths {
131131
let mut aggregate_msat = 0u64;
132+
let mut prev_hop_node = payer;
132133
for (idx, hop) in path.hops.iter().rev().enumerate() {
133134
aggregate_msat += hop.fee_msat;
134135
let usage = ChannelUsage {
@@ -137,39 +138,44 @@ impl<'a> Router for TestRouter<'a> {
137138
effective_capacity: EffectiveCapacity::Unknown,
138139
};
139140

140-
// Since the path is reversed, the last element in our iteration is the first
141-
// hop.
142141
if idx == path.hops.len() - 1 {
143-
let first_hops = match first_hops {
144-
Some(hops) => hops,
145-
None => continue,
146-
};
147-
if first_hops.len() == 0 {
148-
continue;
142+
if let Some(first_hops) = first_hops {
143+
if let Some(idx) = first_hops.iter().position(|h| h.get_outbound_payment_scid() == Some(hop.short_channel_id)) {
144+
let node_id = NodeId::from_pubkey(payer);
145+
let candidate = CandidateRouteHop::FirstHop {
146+
details: first_hops[idx],
147+
payer_node_id: &node_id,
148+
};
149+
scorer.channel_penalty_msat(&candidate, usage, &());
150+
continue;
151+
}
149152
}
150-
let idx = if first_hops.len() > 1 { route.paths.iter().position(|p| p == path).unwrap_or(0) } else { 0 };
151-
let node_id = NodeId::from_pubkey(payer);
152-
let candidate = CandidateRouteHop::FirstHop {
153-
details: first_hops[idx],
154-
payer_node_id: &node_id,
153+
}
154+
let network_graph = self.network_graph.read_only();
155+
if let Some(channel) = network_graph.channel(hop.short_channel_id) {
156+
let (directed, _) = channel.as_directed_to(&NodeId::from_pubkey(&hop.pubkey)).unwrap();
157+
let candidate = CandidateRouteHop::PublicHop {
158+
info: directed,
159+
short_channel_id: hop.short_channel_id,
155160
};
156161
scorer.channel_penalty_msat(&candidate, usage, &());
157162
} else {
158-
let network_graph = self.network_graph.read_only();
159-
let channel = match network_graph.channel(hop.short_channel_id) {
160-
Some(channel) => channel,
161-
None => continue,
162-
};
163-
let channel = match channel.as_directed_to(&NodeId::from_pubkey(&hop.pubkey)) {
164-
Some(channel) => channel,
165-
None => panic!("Channel directed to {} was not found", hop.pubkey),
166-
};
167-
let candidate = CandidateRouteHop::PublicHop {
168-
info: channel.0,
163+
let target_node_id = NodeId::from_pubkey(&hop.pubkey);
164+
let route_hint = RouteHintHop {
165+
src_node_id: *prev_hop_node,
169166
short_channel_id: hop.short_channel_id,
167+
fees: RoutingFees { base_msat: 0, proportional_millionths: 0 },
168+
cltv_expiry_delta: 0,
169+
htlc_minimum_msat: None,
170+
htlc_maximum_msat: None,
171+
};
172+
let candidate = CandidateRouteHop::PrivateHop {
173+
hint: &route_hint,
174+
target_node_id: target_node_id,
170175
};
171176
scorer.channel_penalty_msat(&candidate, usage, &());
172177
}
178+
prev_hop_node = &hop.pubkey;
173179
}
174180
}
175181
}

0 commit comments

Comments
 (0)