From: Jeffrey Czyz Date: Wed, 27 Apr 2022 20:55:33 +0000 (-0500) Subject: Score without uncertainty for exact liquidity X-Git-Tag: v0.0.107~22^2 X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=4715d90a0624459d59705e4ee2ff776391169af5;p=rust-lightning Score without uncertainty for exact liquidity For direct channels, the channel liquidity is known with certainty. Use this knowledge in ProbabilisticScorer by either penalizing with the per-hop penalty or u64::max_value depending on the amount. --- diff --git a/lightning/src/routing/scoring.rs b/lightning/src/routing/scoring.rs index 2c62e6465..38e3c8384 100644 --- a/lightning/src/routing/scoring.rs +++ b/lightning/src/routing/scoring.rs @@ -903,6 +903,14 @@ impl, L: Deref, T: Time> Score for Probabilistic fn channel_penalty_msat( &self, short_channel_id: u64, source: &NodeId, target: &NodeId, usage: ChannelUsage ) -> u64 { + if let EffectiveCapacity::ExactLiquidity { liquidity_msat } = usage.effective_capacity { + if usage.amount_msat > liquidity_msat { + return u64::max_value(); + } else { + return self.params.base_penalty_msat; + }; + } + let liquidity_offset_half_life = self.params.liquidity_offset_half_life; let amount_msat = usage.amount_msat; let capacity_msat = usage.effective_capacity.as_msat() @@ -2574,4 +2582,28 @@ mod tests { let usage = ChannelUsage { inflight_htlc_msat: 251, ..usage }; assert_eq!(scorer.channel_penalty_msat(42, &source, &target, usage), u64::max_value()); } + + #[test] + fn removes_uncertainity_when_exact_liquidity_known() { + let network_graph = network_graph(); + let logger = TestLogger::new(); + let params = ProbabilisticScoringParameters::default(); + let scorer = ProbabilisticScorer::new(params, &network_graph, &logger); + let source = source_node_id(); + let target = target_node_id(); + + let base_penalty_msat = params.base_penalty_msat; + let usage = ChannelUsage { + amount_msat: 750, + inflight_htlc_msat: 0, + effective_capacity: EffectiveCapacity::ExactLiquidity { liquidity_msat: 1_000 }, + }; + assert_eq!(scorer.channel_penalty_msat(42, &source, &target, usage), base_penalty_msat); + + let usage = ChannelUsage { amount_msat: 1_000, ..usage }; + assert_eq!(scorer.channel_penalty_msat(42, &source, &target, usage), base_penalty_msat); + + let usage = ChannelUsage { amount_msat: 1_001, ..usage }; + assert_eq!(scorer.channel_penalty_msat(42, &source, &target, usage), u64::max_value()); + } }