mirror of
https://github.com/mimblewimble/grin.git
synced 2025-02-01 17:01:09 +03:00
Two year secondary pow ratio fix (#2037)
* Tweak (consensus breaking) secondary_pow_ratio * Look at chain type for sec pow ratio calc (hardfork is t4 only)
This commit is contained in:
parent
60cbcbd96b
commit
7dee490962
3 changed files with 112 additions and 7 deletions
|
@ -63,7 +63,17 @@ pub const COINBASE_MATURITY: u64 = DAY_HEIGHT;
|
||||||
/// function of block height (time). Starts at 90% losing a percent
|
/// function of block height (time). Starts at 90% losing a percent
|
||||||
/// approximately every week. Represented as an integer between 0 and 100.
|
/// approximately every week. Represented as an integer between 0 and 100.
|
||||||
pub fn secondary_pow_ratio(height: u64) -> u64 {
|
pub fn secondary_pow_ratio(height: u64) -> u64 {
|
||||||
90u64.saturating_sub(height / WEEK_HEIGHT)
|
// TODO - this should all be cleaned up and simplified before mainnet.
|
||||||
|
if global::is_mainnet() {
|
||||||
|
90u64.saturating_sub(height / (2 * YEAR_HEIGHT / 90))
|
||||||
|
} else {
|
||||||
|
if height < T4_CUCKAROO_HARDFORK {
|
||||||
|
// Maintaining pre hardfork testnet4 behavior
|
||||||
|
90u64.saturating_sub(height / WEEK_HEIGHT)
|
||||||
|
} else {
|
||||||
|
90u64.saturating_sub(height / (2 * YEAR_HEIGHT / 90))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Cuckoo-cycle proof size (cycle length)
|
/// Cuckoo-cycle proof size (cycle length)
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
use consensus::HeaderInfo;
|
use consensus::HeaderInfo;
|
||||||
use consensus::{
|
use consensus::{
|
||||||
graph_weight, BASE_EDGE_BITS, BLOCK_TIME_SEC, COINBASE_MATURITY, CUT_THROUGH_HORIZON,
|
graph_weight, BASE_EDGE_BITS, BLOCK_TIME_SEC, COINBASE_MATURITY, CUT_THROUGH_HORIZON,
|
||||||
DAY_HEIGHT, DIFFICULTY_ADJUST_WINDOW, INITIAL_DIFFICULTY, PROOFSIZE, SECOND_POW_EDGE_BITS,
|
DAY_HEIGHT, DEFAULT_MIN_EDGE_BITS, DIFFICULTY_ADJUST_WINDOW, INITIAL_DIFFICULTY, PROOFSIZE,
|
||||||
STATE_SYNC_THRESHOLD, T4_CUCKAROO_HARDFORK, UNIT_DIFFICULTY, DEFAULT_MIN_EDGE_BITS,
|
SECOND_POW_EDGE_BITS, STATE_SYNC_THRESHOLD, T4_CUCKAROO_HARDFORK, UNIT_DIFFICULTY,
|
||||||
};
|
};
|
||||||
use pow::{self, new_cuckaroo_ctx, new_cuckatoo_ctx, EdgeType, PoWContext};
|
use pow::{self, new_cuckaroo_ctx, new_cuckatoo_ctx, EdgeType, PoWContext};
|
||||||
/// An enum collecting sets of parameters used throughout the
|
/// An enum collecting sets of parameters used throughout the
|
||||||
|
@ -294,6 +294,12 @@ pub fn is_production_mode() -> bool {
|
||||||
|| ChainTypes::Mainnet == *param_ref
|
|| ChainTypes::Mainnet == *param_ref
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Are we in mainnet?
|
||||||
|
pub fn is_mainnet() -> bool {
|
||||||
|
let param_ref = CHAIN_TYPE.read();
|
||||||
|
ChainTypes::Mainnet == *param_ref
|
||||||
|
}
|
||||||
|
|
||||||
/// Helper function to get a nonce known to create a valid POW on
|
/// Helper function to get a nonce known to create a valid POW on
|
||||||
/// the genesis block, to prevent it taking ages. Should be fine for now
|
/// the genesis block, to prevent it taking ages. Should be fine for now
|
||||||
/// as the genesis block POW solution turns out to be the same for every new
|
/// as the genesis block POW solution turns out to be the same for every new
|
||||||
|
|
|
@ -146,8 +146,7 @@ fn get_diff_stats(chain_sim: &Vec<HeaderInfo>) -> DiffStats {
|
||||||
time: n.timestamp,
|
time: n.timestamp,
|
||||||
duration: dur,
|
duration: dur,
|
||||||
}
|
}
|
||||||
})
|
}).collect();
|
||||||
.collect();
|
|
||||||
|
|
||||||
let block_time_sum = sum_entries.iter().fold(0, |sum, t| sum + t.duration);
|
let block_time_sum = sum_entries.iter().fold(0, |sum, t| sum + t.duration);
|
||||||
let block_diff_sum = sum_entries.iter().fold(0, |sum, d| sum + d.difficulty);
|
let block_diff_sum = sum_entries.iter().fold(0, |sum, d| sum + d.difficulty);
|
||||||
|
@ -472,7 +471,94 @@ fn next_target_adjustment() {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn secondary_pow_scale() {
|
fn test_secondary_pow_ratio() {
|
||||||
|
// Tests for mainnet chain type.
|
||||||
|
{
|
||||||
|
global::set_mining_mode(global::ChainTypes::Mainnet);
|
||||||
|
assert_eq!(global::is_mainnet(), true);
|
||||||
|
|
||||||
|
assert_eq!(secondary_pow_ratio(1), 90);
|
||||||
|
assert_eq!(secondary_pow_ratio(89), 90);
|
||||||
|
assert_eq!(secondary_pow_ratio(90), 90);
|
||||||
|
assert_eq!(secondary_pow_ratio(91), 90);
|
||||||
|
assert_eq!(secondary_pow_ratio(179), 90);
|
||||||
|
assert_eq!(secondary_pow_ratio(180), 90);
|
||||||
|
assert_eq!(secondary_pow_ratio(181), 90);
|
||||||
|
|
||||||
|
let one_week = 60 * 24 * 7;
|
||||||
|
assert_eq!(secondary_pow_ratio(one_week - 1), 90);
|
||||||
|
assert_eq!(secondary_pow_ratio(one_week), 90);
|
||||||
|
assert_eq!(secondary_pow_ratio(one_week + 1), 90);
|
||||||
|
|
||||||
|
let two_weeks = one_week * 2;
|
||||||
|
assert_eq!(secondary_pow_ratio(two_weeks - 1), 89);
|
||||||
|
assert_eq!(secondary_pow_ratio(two_weeks), 89);
|
||||||
|
assert_eq!(secondary_pow_ratio(two_weeks + 1), 89);
|
||||||
|
|
||||||
|
let t4_fork_height = 64_000;
|
||||||
|
assert_eq!(secondary_pow_ratio(t4_fork_height - 1), 85);
|
||||||
|
assert_eq!(secondary_pow_ratio(t4_fork_height), 85);
|
||||||
|
assert_eq!(secondary_pow_ratio(t4_fork_height + 1), 85);
|
||||||
|
|
||||||
|
let one_year = one_week * 52;
|
||||||
|
assert_eq!(secondary_pow_ratio(one_year), 45);
|
||||||
|
|
||||||
|
let ninety_one_weeks = one_week * 91;
|
||||||
|
assert_eq!(secondary_pow_ratio(ninety_one_weeks - 1), 12);
|
||||||
|
assert_eq!(secondary_pow_ratio(ninety_one_weeks), 12);
|
||||||
|
assert_eq!(secondary_pow_ratio(ninety_one_weeks + 1), 12);
|
||||||
|
|
||||||
|
let two_year = one_year * 2;
|
||||||
|
assert_eq!(secondary_pow_ratio(two_year - 1), 1);
|
||||||
|
assert_eq!(secondary_pow_ratio(two_year), 0);
|
||||||
|
assert_eq!(secondary_pow_ratio(two_year + 1), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests for testnet4 chain type (covers pre and post hardfork).
|
||||||
|
{
|
||||||
|
global::set_mining_mode(global::ChainTypes::Testnet4);
|
||||||
|
assert_eq!(global::is_mainnet(), false);
|
||||||
|
|
||||||
|
assert_eq!(secondary_pow_ratio(1), 90);
|
||||||
|
assert_eq!(secondary_pow_ratio(89), 90);
|
||||||
|
assert_eq!(secondary_pow_ratio(90), 90);
|
||||||
|
assert_eq!(secondary_pow_ratio(91), 90);
|
||||||
|
assert_eq!(secondary_pow_ratio(179), 90);
|
||||||
|
assert_eq!(secondary_pow_ratio(180), 90);
|
||||||
|
assert_eq!(secondary_pow_ratio(181), 90);
|
||||||
|
|
||||||
|
let one_week = 60 * 24 * 7;
|
||||||
|
assert_eq!(secondary_pow_ratio(one_week - 1), 90);
|
||||||
|
assert_eq!(secondary_pow_ratio(one_week), 89);
|
||||||
|
assert_eq!(secondary_pow_ratio(one_week + 1), 89);
|
||||||
|
|
||||||
|
let two_weeks = one_week * 2;
|
||||||
|
assert_eq!(secondary_pow_ratio(two_weeks - 1), 89);
|
||||||
|
assert_eq!(secondary_pow_ratio(two_weeks), 88);
|
||||||
|
assert_eq!(secondary_pow_ratio(two_weeks + 1), 88);
|
||||||
|
|
||||||
|
let t4_fork_height = 64_000;
|
||||||
|
assert_eq!(secondary_pow_ratio(t4_fork_height - 1), 84);
|
||||||
|
assert_eq!(secondary_pow_ratio(t4_fork_height), 85);
|
||||||
|
assert_eq!(secondary_pow_ratio(t4_fork_height + 1), 85);
|
||||||
|
|
||||||
|
let one_year = one_week * 52;
|
||||||
|
assert_eq!(secondary_pow_ratio(one_year), 45);
|
||||||
|
|
||||||
|
let ninety_one_weeks = one_week * 91;
|
||||||
|
assert_eq!(secondary_pow_ratio(ninety_one_weeks - 1), 12);
|
||||||
|
assert_eq!(secondary_pow_ratio(ninety_one_weeks), 12);
|
||||||
|
assert_eq!(secondary_pow_ratio(ninety_one_weeks + 1), 12);
|
||||||
|
|
||||||
|
let two_year = one_year * 2;
|
||||||
|
assert_eq!(secondary_pow_ratio(two_year - 1), 1);
|
||||||
|
assert_eq!(secondary_pow_ratio(two_year), 0);
|
||||||
|
assert_eq!(secondary_pow_ratio(two_year + 1), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_secondary_pow_scale() {
|
||||||
let window = DIFFICULTY_ADJUST_WINDOW;
|
let window = DIFFICULTY_ADJUST_WINDOW;
|
||||||
let mut hi = HeaderInfo::from_diff_scaling(Difficulty::from_num(10), 100);
|
let mut hi = HeaderInfo::from_diff_scaling(Difficulty::from_num(10), 100);
|
||||||
|
|
||||||
|
@ -501,7 +587,10 @@ fn secondary_pow_scale() {
|
||||||
let mut low_hi = HeaderInfo::from_diff_scaling(Difficulty::from_num(10), MIN_DIFFICULTY as u32);
|
let mut low_hi = HeaderInfo::from_diff_scaling(Difficulty::from_num(10), MIN_DIFFICULTY as u32);
|
||||||
low_hi.is_secondary = true;
|
low_hi.is_secondary = true;
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
secondary_pow_scaling(890_000, &(0..window).map(|_| low_hi.clone()).collect::<Vec<_>>()),
|
secondary_pow_scaling(
|
||||||
|
890_000,
|
||||||
|
&(0..window).map(|_| low_hi.clone()).collect::<Vec<_>>()
|
||||||
|
),
|
||||||
MIN_DIFFICULTY as u32
|
MIN_DIFFICULTY as u32
|
||||||
);
|
);
|
||||||
// just about the right ratio, also no longer playing with median
|
// just about the right ratio, also no longer playing with median
|
||||||
|
|
Loading…
Reference in a new issue