X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Frouting%2Fscoring.rs;h=ee9c3d0c47356ddc53d9f7efc21f368b1ef77743;hb=b040335712dd3161a74119b71149bfa2ad69b907;hp=9298a17b6c58d860dac29e6188867d70e817f884;hpb=21b0818be7c3f4b3fce24c2bd3ac0c156549f8bc;p=rust-lightning diff --git a/lightning/src/routing/scoring.rs b/lightning/src/routing/scoring.rs index 9298a17b..ee9c3d0c 100644 --- a/lightning/src/routing/scoring.rs +++ b/lightning/src/routing/scoring.rs @@ -519,6 +519,75 @@ pub struct ProbabilisticScoringFeeParameters { pub considered_impossible_penalty_msat: u64, } +impl Default for ProbabilisticScoringFeeParameters { + fn default() -> Self { + Self { + base_penalty_msat: 500, + base_penalty_amount_multiplier_msat: 8192, + liquidity_penalty_multiplier_msat: 30_000, + liquidity_penalty_amount_multiplier_msat: 192, + manual_node_penalties: HashMap::new(), + anti_probing_penalty_msat: 250, + considered_impossible_penalty_msat: 1_0000_0000_000, + historical_liquidity_penalty_multiplier_msat: 10_000, + historical_liquidity_penalty_amount_multiplier_msat: 64, + } + } +} + +impl ProbabilisticScoringFeeParameters { + /// Marks the node with the given `node_id` as banned, + /// i.e it will be avoided during path finding. + pub fn add_banned(&mut self, node_id: &NodeId) { + self.manual_node_penalties.insert(*node_id, u64::max_value()); + } + + /// Marks all nodes in the given list as banned, i.e., + /// they will be avoided during path finding. + pub fn add_banned_from_list(&mut self, node_ids: Vec) { + for id in node_ids { + self.manual_node_penalties.insert(id, u64::max_value()); + } + } + + /// Removes the node with the given `node_id` from the list of nodes to avoid. + pub fn remove_banned(&mut self, node_id: &NodeId) { + self.manual_node_penalties.remove(node_id); + } + + /// Sets a manual penalty for the given node. + pub fn set_manual_penalty(&mut self, node_id: &NodeId, penalty: u64) { + self.manual_node_penalties.insert(*node_id, penalty); + } + + /// Removes the node with the given `node_id` from the list of manual penalties. + pub fn remove_manual_penalty(&mut self, node_id: &NodeId) { + self.manual_node_penalties.remove(node_id); + } + + /// Clears the list of manual penalties that are applied during path finding. + pub fn clear_manual_penalties(&mut self) { + self.manual_node_penalties = HashMap::new(); + } +} + +#[cfg(test)] +impl ProbabilisticScoringFeeParameters { + fn zero_penalty() -> Self { + Self { + base_penalty_msat: 0, + base_penalty_amount_multiplier_msat: 0, + liquidity_penalty_multiplier_msat: 0, + liquidity_penalty_amount_multiplier_msat: 0, + historical_liquidity_penalty_multiplier_msat: 0, + historical_liquidity_penalty_amount_multiplier_msat: 0, + manual_node_penalties: HashMap::new(), + anti_probing_penalty_msat: 0, + considered_impossible_penalty_msat: 0, + } + } +} + /// Parameters for configuring [`ProbabilisticScorer`]. /// /// Used to configure decay parameters that are static throughout the lifetime of the scorer. @@ -561,9 +630,8 @@ pub struct ProbabilisticScoringDecayParameters { pub liquidity_offset_half_life: Duration, } -#[cfg(test)] -impl ProbabilisticScoringDecayParameters { - fn zero_penalty() -> Self { +impl Default for ProbabilisticScoringDecayParameters { + fn default() -> Self { Self { liquidity_offset_half_life: Duration::from_secs(6 * 60 * 60), historical_no_updates_half_life: Duration::from_secs(60 * 60 * 24 * 14), @@ -571,14 +639,16 @@ impl ProbabilisticScoringDecayParameters { } } -impl Default for ProbabilisticScoringDecayParameters { - fn default() -> Self { +#[cfg(test)] +impl ProbabilisticScoringDecayParameters { + fn zero_penalty() -> Self { Self { liquidity_offset_half_life: Duration::from_secs(6 * 60 * 60), historical_no_updates_half_life: Duration::from_secs(60 * 60 * 24 * 14), } } } + /// Tracks the historical state of a distribution as a weighted average of how much time was spent /// in each of 8 buckets. #[derive(Clone, Copy)] @@ -882,73 +952,6 @@ impl>, L: Deref, T: Time> ProbabilisticScorerU } } -impl ProbabilisticScoringFeeParameters { - #[cfg(test)] - fn zero_penalty() -> Self { - Self { - base_penalty_msat: 0, - base_penalty_amount_multiplier_msat: 0, - liquidity_penalty_multiplier_msat: 0, - liquidity_penalty_amount_multiplier_msat: 0, - historical_liquidity_penalty_multiplier_msat: 0, - historical_liquidity_penalty_amount_multiplier_msat: 0, - manual_node_penalties: HashMap::new(), - anti_probing_penalty_msat: 0, - considered_impossible_penalty_msat: 0, - } - } - - /// Marks the node with the given `node_id` as banned, i.e., - /// it will be avoided during path finding. - pub fn add_banned(&mut self, node_id: &NodeId) { - self.manual_node_penalties.insert(*node_id, u64::max_value()); - } - - /// Marks all nodes in the given list as banned, i.e., - /// they will be avoided during path finding. - pub fn add_banned_from_list(&mut self, node_ids: Vec) { - for id in node_ids { - self.manual_node_penalties.insert(id, u64::max_value()); - } - } - - /// Removes the node with the given `node_id` from the list of nodes to avoid. - pub fn remove_banned(&mut self, node_id: &NodeId) { - self.manual_node_penalties.remove(node_id); - } - - /// Sets a manual penalty for the given node. - pub fn set_manual_penalty(&mut self, node_id: &NodeId, penalty: u64) { - self.manual_node_penalties.insert(*node_id, penalty); - } - - /// Removes the node with the given `node_id` from the list of manual penalties. - pub fn remove_manual_penalty(&mut self, node_id: &NodeId) { - self.manual_node_penalties.remove(node_id); - } - - /// Clears the list of manual penalties that are applied during path finding. - pub fn clear_manual_penalties(&mut self) { - self.manual_node_penalties = HashMap::new(); - } -} - -impl Default for ProbabilisticScoringFeeParameters { - fn default() -> Self { - Self { - base_penalty_msat: 500, - base_penalty_amount_multiplier_msat: 8192, - liquidity_penalty_multiplier_msat: 30_000, - liquidity_penalty_amount_multiplier_msat: 192, - manual_node_penalties: HashMap::new(), - anti_probing_penalty_msat: 250, - considered_impossible_penalty_msat: 1_0000_0000_000, - historical_liquidity_penalty_multiplier_msat: 10_000, - historical_liquidity_penalty_amount_multiplier_msat: 64, - } - } -} - impl ChannelLiquidity { #[inline] fn new() -> Self { @@ -1240,8 +1243,10 @@ impl>, L: Deref, T: Time> Score for Probabilis let mut anti_probing_penalty_msat = 0; match usage.effective_capacity { - EffectiveCapacity::ExactLiquidity { liquidity_msat } => { - if usage.amount_msat > liquidity_msat { + EffectiveCapacity::ExactLiquidity { liquidity_msat: amount_msat } | + EffectiveCapacity::HintMaxHTLC { amount_msat } => + { + if usage.amount_msat > amount_msat { return u64::max_value(); } else { return base_penalty_msat; @@ -2866,7 +2871,7 @@ mod tests { let usage = ChannelUsage { amount_msat: 1, inflight_htlc_msat: 0, - effective_capacity: EffectiveCapacity::MaximumHTLC { amount_msat: 0 }, + effective_capacity: EffectiveCapacity::AdvertisedMaxHTLC { amount_msat: 0 }, }; assert_eq!(scorer.channel_penalty_msat(42, &target, &source, usage, ¶ms), 2048);