From b43d6e432659b8e502299c9a93de92e8db2ba117 Mon Sep 17 00:00:00 2001 From: Yeastplume Date: Wed, 17 Oct 2018 16:53:31 +0100 Subject: [PATCH] [T4] Set genesis block data + initial secondary scaling correctly (#1776) * ensure genesis block+pre genesis is populated correctly with secondary scaling * rustfmt --- core/src/consensus.rs | 45 +++++++++++++++++++++++++++++++------------ core/src/genesis.rs | 4 ++-- core/src/global.rs | 21 ++++++++++++++++++-- p2p/src/msg.rs | 2 +- 4 files changed, 55 insertions(+), 17 deletions(-) diff --git a/core/src/consensus.rs b/core/src/consensus.rs index f2613119..b775a7fa 100644 --- a/core/src/consensus.rs +++ b/core/src/consensus.rs @@ -49,8 +49,8 @@ pub fn reward(fee: u64) -> u64 { /// Nominal height for standard time intervals pub const HOUR_HEIGHT: u64 = 3600 / BLOCK_TIME_SEC; -pub const DAY_HEIGHT: u64 = 24 * HOUR_HEIGHT; -pub const WEEK_HEIGHT: u64 = 7 * DAY_HEIGHT; +pub const DAY_HEIGHT: u64 = 24 * HOUR_HEIGHT; +pub const WEEK_HEIGHT: u64 = 7 * DAY_HEIGHT; pub const YEAR_HEIGHT: u64 = 52 * WEEK_HEIGHT; /// Number of blocks before a coinbase matures and can be spent @@ -156,7 +156,8 @@ pub fn graph_weight(edge_bits: u8) -> u64 { } /// minimum possible difficulty equal to graph_weight(SECOND_POW_EDGE_BITS) -pub const MIN_DIFFICULTY: u64 = ((2 as u64) << (SECOND_POW_EDGE_BITS - BASE_EDGE_BITS)) * (SECOND_POW_EDGE_BITS as u64); +pub const MIN_DIFFICULTY: u64 = + ((2 as u64) << (SECOND_POW_EDGE_BITS - BASE_EDGE_BITS)) * (SECOND_POW_EDGE_BITS as u64); /// The initial difficulty at launch. This should be over-estimated /// and difficulty should come down at launch rather than up @@ -216,7 +217,7 @@ impl HeaderInfo { HeaderInfo { timestamp, difficulty, - secondary_scaling: 1, + secondary_scaling: global::initial_graph_weight(), is_secondary: false, } } @@ -233,9 +234,12 @@ impl HeaderInfo { } } +/// TODO: Doc pub fn damp(actual: u64, goal: u64, damp_factor: u64) -> u64 { - (1 * actual + (damp_factor-1) * goal) / damp_factor + (1 * actual + (damp_factor - 1) * goal) / damp_factor } + +/// TODO: Doc pub fn clamp(actual: u64, goal: u64, clamp_factor: u64) -> u64 { max(goal / clamp_factor, min(actual, goal * clamp_factor)) } @@ -267,13 +271,22 @@ where let sec_pow_scaling = secondary_pow_scaling(height, &diff_data); // Get the timestamp delta across the window - let ts_delta: u64 = diff_data[DIFFICULTY_ADJUST_WINDOW as usize].timestamp - diff_data[0].timestamp; + let ts_delta: u64 = + diff_data[DIFFICULTY_ADJUST_WINDOW as usize].timestamp - diff_data[0].timestamp; // Get the difficulty sum of the last DIFFICULTY_ADJUST_WINDOW elements - let diff_sum: u64 = diff_data.iter().skip(1).map(|dd| dd.difficulty.to_num()).sum(); + let diff_sum: u64 = diff_data + .iter() + .skip(1) + .map(|dd| dd.difficulty.to_num()) + .sum(); - // adjust time delta toward goal subject to dampening and clamping - let adj_ts = clamp(damp(ts_delta, BLOCK_TIME_WINDOW, DAMP_FACTOR), BLOCK_TIME_WINDOW, CLAMP_FACTOR); + // adjust time delta toward goal subject to dampening and clamping + let adj_ts = clamp( + damp(ts_delta, BLOCK_TIME_WINDOW, DAMP_FACTOR), + BLOCK_TIME_WINDOW, + CLAMP_FACTOR, + ); let difficulty = max(1, diff_sum * BLOCK_TIME_SEC / adj_ts); HeaderInfo::from_diff_scaling(Difficulty::from_num(difficulty), sec_pow_scaling) @@ -285,14 +298,22 @@ pub fn secondary_pow_scaling(height: u64, diff_data: &Vec) -> u32 { let snd_count = 100 * diff_data.iter().filter(|n| n.is_secondary).count() as u64; // Get the scaling factor sum of the last DIFFICULTY_ADJUST_WINDOW elements - let scale_sum: u64 = diff_data.iter().skip(1).map(|dd| dd.secondary_scaling as u64).sum(); + let scale_sum: u64 = diff_data + .iter() + .skip(1) + .map(|dd| dd.secondary_scaling as u64) + .sum(); // compute ideal 2nd_pow_fraction in pct and across window let target_pct = secondary_pow_ratio(height); let target_count = DIFFICULTY_ADJUST_WINDOW * target_pct; - // adjust count toward goal subject to dampening and clamping - let adj_count = clamp(damp(snd_count, target_count, DAMP_FACTOR), target_count, CLAMP_FACTOR); + // adjust count toward goal subject to dampening and clamping + let adj_count = clamp( + damp(snd_count, target_count, DAMP_FACTOR), + target_count, + CLAMP_FACTOR, + ); let scale = scale_sum * target_pct / adj_count; max(1, min(scale, MAX_SECONDARY_SCALING)) as u32 diff --git a/core/src/genesis.rs b/core/src/genesis.rs index b7951518..6fc11b19 100644 --- a/core/src/genesis.rs +++ b/core/src/genesis.rs @@ -111,10 +111,10 @@ pub fn genesis_testnet4() -> core::Block { core::Block::with_header(core::BlockHeader { height: 0, previous: core::hash::Hash([0xff; 32]), - timestamp: Utc.ymd(2018, 10, 17).and_hms(13, 0, 0), + timestamp: Utc.ymd(2018, 10, 17).and_hms(16, 0, 0), pow: ProofOfWork { total_difficulty: Difficulty::from_num(global::initial_block_difficulty()), - scaling_difficulty: 1, + scaling_difficulty: global::initial_graph_weight(), nonce: 4956988373127692, proof: Proof::new(vec![ 0xa420dc, 0xc8ffee, 0x10e433e, 0x1de9428, 0x2ed4cea, 0x52d907b, 0x5af0e3f, diff --git a/core/src/global.rs b/core/src/global.rs index 3a131b34..3c509eb9 100644 --- a/core/src/global.rs +++ b/core/src/global.rs @@ -18,8 +18,9 @@ use consensus::HeaderInfo; use consensus::{ - BASE_EDGE_BITS, BLOCK_TIME_SEC, COINBASE_MATURITY, CUT_THROUGH_HORIZON, DAY_HEIGHT, - DIFFICULTY_ADJUST_WINDOW, INITIAL_DIFFICULTY, PROOFSIZE, SECOND_POW_EDGE_BITS, + graph_weight, BASE_EDGE_BITS, BLOCK_TIME_SEC, COINBASE_MATURITY, CUT_THROUGH_HORIZON, + DAY_HEIGHT, DIFFICULTY_ADJUST_WINDOW, INITIAL_DIFFICULTY, MIN_DIFFICULTY, PROOFSIZE, + SECOND_POW_EDGE_BITS, }; use pow::{self, CuckatooContext, EdgeType, PoWContext}; /// An enum collecting sets of parameters used throughout the @@ -52,6 +53,9 @@ pub const USER_TESTING_COINBASE_MATURITY: u64 = 3; /// Testing cut through horizon in blocks pub const TESTING_CUT_THROUGH_HORIZON: u32 = 20; +/// Testing initial graph weight +pub const TESTING_INITIAL_GRAPH_WEIGHT: u32 = 1; + /// Testing initial block difficulty pub const TESTING_INITIAL_DIFFICULTY: u64 = 1; @@ -199,6 +203,19 @@ pub fn initial_block_difficulty() -> u64 { ChainTypes::Mainnet => INITIAL_DIFFICULTY, } } +/// Initial mining secondary scale +pub fn initial_graph_weight() -> u32 { + let param_ref = CHAIN_TYPE.read().unwrap(); + match *param_ref { + ChainTypes::AutomatedTesting => TESTING_INITIAL_GRAPH_WEIGHT, + ChainTypes::UserTesting => TESTING_INITIAL_GRAPH_WEIGHT, + ChainTypes::Testnet1 => TESTING_INITIAL_GRAPH_WEIGHT, + ChainTypes::Testnet2 => TESTING_INITIAL_GRAPH_WEIGHT, + ChainTypes::Testnet3 => TESTING_INITIAL_GRAPH_WEIGHT, + ChainTypes::Testnet4 => graph_weight(SECOND_POW_EDGE_BITS) as u32, + ChainTypes::Mainnet => graph_weight(SECOND_POW_EDGE_BITS) as u32, + } +} /// Horizon at which we can cut-through and do full local pruning pub fn cut_through_horizon() -> u32 { diff --git a/p2p/src/msg.rs b/p2p/src/msg.rs index 26efcd60..22a5e61d 100644 --- a/p2p/src/msg.rs +++ b/p2p/src/msg.rs @@ -35,7 +35,7 @@ pub const PROTOCOL_VERSION: u32 = 1; pub const USER_AGENT: &'static str = concat!("MW/Grin ", env!("CARGO_PKG_VERSION")); /// Magic number expected in the header of every message -const MAGIC: [u8; 2] = [0x47, 0x33]; +const MAGIC: [u8; 2] = [0x47, 0x34]; /// Size in bytes of a message header pub const HEADER_LEN: u64 = 11;