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:
Antioch Peverell 2018-11-28 22:05:13 +00:00 committed by Ignotus Peverell
parent 60cbcbd96b
commit 7dee490962
3 changed files with 112 additions and 7 deletions

View file

@ -63,7 +63,17 @@ pub const COINBASE_MATURITY: u64 = DAY_HEIGHT;
/// function of block height (time). Starts at 90% losing a percent
/// approximately every week. Represented as an integer between 0 and 100.
pub fn secondary_pow_ratio(height: u64) -> u64 {
// 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)

View file

@ -19,8 +19,8 @@
use consensus::HeaderInfo;
use consensus::{
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,
STATE_SYNC_THRESHOLD, T4_CUCKAROO_HARDFORK, UNIT_DIFFICULTY, DEFAULT_MIN_EDGE_BITS,
DAY_HEIGHT, DEFAULT_MIN_EDGE_BITS, DIFFICULTY_ADJUST_WINDOW, INITIAL_DIFFICULTY, PROOFSIZE,
SECOND_POW_EDGE_BITS, STATE_SYNC_THRESHOLD, T4_CUCKAROO_HARDFORK, UNIT_DIFFICULTY,
};
use pow::{self, new_cuckaroo_ctx, new_cuckatoo_ctx, EdgeType, PoWContext};
/// An enum collecting sets of parameters used throughout the
@ -294,6 +294,12 @@ pub fn is_production_mode() -> bool {
|| 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
/// 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

View file

@ -146,8 +146,7 @@ fn get_diff_stats(chain_sim: &Vec<HeaderInfo>) -> DiffStats {
time: n.timestamp,
duration: dur,
}
})
.collect();
}).collect();
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);
@ -472,7 +471,94 @@ fn next_target_adjustment() {
}
#[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 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);
low_hi.is_secondary = true;
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
);
// just about the right ratio, also no longer playing with median