Skip to content

Commit 2c45afa

Browse files
committed
Don't rely on calculate_success_probability* to handle amt > cap
Currently we let an `htlc_amount >= channel_capacity` pass through from `penalty_msat` to `calculate_success_probability_times_billion`, but only if its only marginally bigger (less than 65/64ths). This is fine as `calculate_success_probability_times_billion` handles bogus values just fine (it will always return a zero probability in such cases). However, this is risky, and in fact breaks in the coming commits, so instead check it before ever calling through to the historical bucket probability calculations.
1 parent bada713 commit 2c45afa

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

lightning/src/routing/scoring.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,9 @@ impl<L: Deref<Target = u64>, BRT: Deref<Target = HistoricalBucketRangeTracker>,
10351035
/// Returns a liquidity penalty for routing the given HTLC `amount_msat` through the channel in
10361036
/// this direction.
10371037
fn penalty_msat(&self, amount_msat: u64, score_params: &ProbabilisticScoringFeeParameters) -> u64 {
1038-
let max_liquidity_msat = self.max_liquidity_msat();
1038+
let available_capacity = self.available_capacity();
1039+
let max_liquidity_msat = available_capacity.saturating_sub(
1040+
self.decayed_offset_msat(*self.max_liquidity_offset_msat));
10391041
let min_liquidity_msat = core::cmp::min(self.min_liquidity_msat(), max_liquidity_msat);
10401042

10411043
let mut res = if amount_msat <= min_liquidity_msat {
@@ -1066,6 +1068,15 @@ impl<L: Deref<Target = u64>, BRT: Deref<Target = HistoricalBucketRangeTracker>,
10661068
}
10671069
};
10681070

1071+
if amount_msat >= available_capacity {
1072+
// We're trying to send more than the capacity, use a max penalty.
1073+
res = res.saturating_add(Self::combined_penalty_msat(amount_msat,
1074+
NEGATIVE_LOG10_UPPER_BOUND * 2048,
1075+
score_params.historical_liquidity_penalty_multiplier_msat,
1076+
score_params.historical_liquidity_penalty_amount_multiplier_msat));
1077+
return res;
1078+
}
1079+
10691080
if score_params.historical_liquidity_penalty_multiplier_msat != 0 ||
10701081
score_params.historical_liquidity_penalty_amount_multiplier_msat != 0 {
10711082
let payment_amt_64th_bucket = if amount_msat < u64::max_value() / 64 {
@@ -2858,12 +2869,14 @@ mod tests {
28582869
assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
28592870
Some(([0; 8], [0; 8])));
28602871

2861-
let usage = ChannelUsage {
2872+
let mut usage = ChannelUsage {
28622873
amount_msat: 100,
28632874
inflight_htlc_msat: 1024,
28642875
effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_024 },
28652876
};
28662877
scorer.payment_path_failed(&payment_path_for_amount(1), 42);
2878+
assert_eq!(scorer.channel_penalty_msat(42, &source, &target, usage, &params), 2048);
2879+
usage.inflight_htlc_msat = 0;
28672880
assert_eq!(scorer.channel_penalty_msat(42, &source, &target, usage, &params), 409);
28682881

28692882
let usage = ChannelUsage {

0 commit comments

Comments
 (0)