X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Frouting%2Fscoring.rs;h=459303f7d87f0c988293a2360798665570607955;hb=9596cc71103168d041adcdd4a3c247595c1d4c34;hp=d9d0bee3ca59c23ddf61898d0d5599962fac9f06;hpb=4ea18e323292ddee00c84cad8bfdb3bb2bc64306;p=rust-lightning diff --git a/lightning/src/routing/scoring.rs b/lightning/src/routing/scoring.rs index d9d0bee3..459303f7 100644 --- a/lightning/src/routing/scoring.rs +++ b/lightning/src/routing/scoring.rs @@ -533,7 +533,7 @@ pub struct ProbabilisticScoringParameters { /// payments. This knowledge is decayed over time based on [`liquidity_offset_half_life`]. The /// penalty is effectively limited to `2 * liquidity_penalty_multiplier_msat`. /// - /// Default value: 10,000 msat + /// Default value: 40,000 msat /// /// [`liquidity_offset_half_life`]: Self::liquidity_offset_half_life pub liquidity_penalty_multiplier_msat: u64, @@ -603,7 +603,7 @@ impl Default for ProbabilisticScoringParameters { fn default() -> Self { Self { base_penalty_msat: 500, - liquidity_penalty_multiplier_msat: 10_000, + liquidity_penalty_multiplier_msat: 40_000, liquidity_offset_half_life: Duration::from_secs(3600), } } @@ -666,20 +666,21 @@ impl, T: Time, U: Deref> DirectedChannelLiqui /// Returns a penalty for routing the given HTLC `amount_msat` through the channel in this /// direction. fn penalty_msat(&self, amount_msat: u64, liquidity_penalty_multiplier_msat: u64) -> u64 { + let max_penalty_msat = liquidity_penalty_multiplier_msat.saturating_mul(2); let max_liquidity_msat = self.max_liquidity_msat(); let min_liquidity_msat = core::cmp::min(self.min_liquidity_msat(), max_liquidity_msat); if amount_msat > max_liquidity_msat { - u64::max_value() + max_penalty_msat } else if amount_msat <= min_liquidity_msat { 0 } else { let numerator = (max_liquidity_msat - amount_msat).saturating_add(1); let denominator = (max_liquidity_msat - min_liquidity_msat).saturating_add(1); - approx::negative_log10_times_1024(numerator, denominator) - .saturating_mul(liquidity_penalty_multiplier_msat) / 1024 + let penalty_msat = approx::negative_log10_times_1024(numerator, denominator) + .saturating_mul(liquidity_penalty_multiplier_msat) / 1024; + // Upper bound the penalty to ensure some channel is selected. + penalty_msat.min(max_penalty_msat) } - // Upper bound the penalty to ensure some channel is selected. - .min(2 * liquidity_penalty_multiplier_msat) } /// Returns the lower bound of the channel liquidity balance in this direction. @@ -2050,16 +2051,16 @@ mod tests { let target = target_node_id(); let params = ProbabilisticScoringParameters { - base_penalty_msat: 0, ..Default::default() + base_penalty_msat: 0, liquidity_penalty_multiplier_msat: 1_000, ..Default::default() }; let scorer = ProbabilisticScorer::new(params, &network_graph); - assert_eq!(scorer.channel_penalty_msat(42, 128, 1_024, &source, &target), 585); + assert_eq!(scorer.channel_penalty_msat(42, 128, 1_024, &source, &target), 58); let params = ProbabilisticScoringParameters { - base_penalty_msat: 500, ..Default::default() + base_penalty_msat: 500, liquidity_penalty_multiplier_msat: 1_000, ..Default::default() }; let scorer = ProbabilisticScorer::new(params, &network_graph); - assert_eq!(scorer.channel_penalty_msat(42, 128, 1_024, &source, &target), 1085); + assert_eq!(scorer.channel_penalty_msat(42, 128, 1_024, &source, &target), 558); } #[test] @@ -2074,7 +2075,7 @@ mod tests { let scorer = ProbabilisticScorer::new(params, &network_graph); assert_eq!( scorer.channel_penalty_msat(42, u64::max_value(), u64::max_value(), &source, &target), - 20_000, + 80_000, ); } }