From 430779c512ffca427477df5202f0cf05febe9cbd Mon Sep 17 00:00:00 2001 From: FiveMovesAhead Date: Fri, 14 Jun 2024 02:48:27 +1000 Subject: [PATCH] Enforce min gap between frontiers. --- tig-protocol/src/add_block.rs | 38 ++++++++++++++++++++--------------- tig-structs/src/config.rs | 2 +- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/tig-protocol/src/add_block.rs b/tig-protocol/src/add_block.rs index 9fe11b8e..076f2158 100644 --- a/tig-protocol/src/add_block.rs +++ b/tig-protocol/src/add_block.rs @@ -661,7 +661,7 @@ async fn update_frontiers(ctx: &mut T, block: &Block) { let min_difficulty = difficulty_parameters.min_difficulty(); let max_difficulty = difficulty_parameters.max_difficulty(); - let base_frontier = block_data + let lowest_frontier = block_data .qualifier_difficulties() .iter() .map(|d| d.iter().map(|x| -x).collect()) // mirror the points so easiest difficulties are first @@ -672,21 +672,27 @@ async fn update_frontiers(ctx: &mut T, block: &Block) { .collect::() // mirror the points back; .extend(&min_difficulty, &max_difficulty); - let mut scaling_factor = (*block_data.num_qualifiers() as f64 - / config.qualifiers.total_qualifiers_threshold as f64) - .clamp(0.0, config.difficulty.max_scaling_factor); - if let Some(scaling_factor_decay) = config.difficulty.scaling_factor_decay { - let prev_scaling_factor = - get_challenge_by_id(ctx, challenge_id, Some(&block.details.prev_block_id)) - .await - .unwrap_or_else(|e| panic!("get_challenge_by_id error: {:?}", e)) - .block_data() - .scaling_factor - .unwrap_or(1.0) - .clamp(0.0, config.difficulty.max_scaling_factor); - scaling_factor = scaling_factor_decay * prev_scaling_factor - + (1.0 - scaling_factor_decay) * scaling_factor; - } + let scaling_factor = *block_data.num_qualifiers() as f64 + / config.qualifiers.total_qualifiers_threshold as f64; + let (scaling_factor, base_frontier) = match config.difficulty.min_frontiers_gap { + Some(min_gap) => { + if scaling_factor >= 1.0 { + ( + (scaling_factor / (1.0 - min_gap)) + .min(config.difficulty.max_scaling_factor), + lowest_frontier + .scale(&min_difficulty, &max_difficulty, 1.0 - min_gap) + .extend(&min_difficulty, &max_difficulty), + ) + } else { + (scaling_factor.min(1.0 - min_gap), lowest_frontier.clone()) + } + } + None => ( + scaling_factor.min(config.difficulty.max_scaling_factor), + lowest_frontier, + ), + }; let scaled_frontier = base_frontier .scale(&min_difficulty, &max_difficulty, scaling_factor) .extend(&min_difficulty, &max_difficulty); diff --git a/tig-structs/src/config.rs b/tig-structs/src/config.rs index 1dcbfa38..8c35e917 100644 --- a/tig-structs/src/config.rs +++ b/tig-structs/src/config.rs @@ -75,7 +75,7 @@ impl MinMaxDifficulty for Vec { serializable_struct_with_getters! { DifficultyConfig { max_scaling_factor: f64, - scaling_factor_decay: Option, + min_frontiers_gap: Option, parameters: HashMap>, } }