2018-01-27 10:48:53 +03:00
|
|
|
// Copyright 2018 The Grin Developers
|
2017-08-09 19:40:23 +03:00
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
//! Values that should be shared across all modules, without necessarily
|
|
|
|
//! having to pass them all over the place, but aren't consensus values.
|
|
|
|
//! should be used sparingly.
|
|
|
|
|
2018-12-08 02:59:40 +03:00
|
|
|
use crate::consensus::HeaderInfo;
|
|
|
|
use crate::consensus::{
|
2018-10-17 18:53:31 +03:00
|
|
|
graph_weight, BASE_EDGE_BITS, BLOCK_TIME_SEC, COINBASE_MATURITY, CUT_THROUGH_HORIZON,
|
2018-11-29 01:05:13 +03:00
|
|
|
DAY_HEIGHT, DEFAULT_MIN_EDGE_BITS, DIFFICULTY_ADJUST_WINDOW, INITIAL_DIFFICULTY, PROOFSIZE,
|
|
|
|
SECOND_POW_EDGE_BITS, STATE_SYNC_THRESHOLD, T4_CUCKAROO_HARDFORK, UNIT_DIFFICULTY,
|
2018-07-01 01:36:38 +03:00
|
|
|
};
|
2018-12-08 02:59:40 +03:00
|
|
|
use crate::pow::{self, new_cuckaroo_ctx, new_cuckatoo_ctx, EdgeType, PoWContext};
|
2017-08-09 19:40:23 +03:00
|
|
|
/// An enum collecting sets of parameters used throughout the
|
|
|
|
/// code wherever mining is needed. This should allow for
|
|
|
|
/// different sets of parameters for different purposes,
|
|
|
|
/// e.g. CI, User testing, production values
|
2018-12-08 02:59:40 +03:00
|
|
|
use crate::util::RwLock;
|
2017-08-09 19:40:23 +03:00
|
|
|
|
|
|
|
/// Define these here, as they should be developer-set, not really tweakable
|
|
|
|
/// by users
|
|
|
|
|
2018-10-16 02:14:23 +03:00
|
|
|
/// Automated testing edge_bits
|
|
|
|
pub const AUTOMATED_TESTING_MIN_EDGE_BITS: u8 = 9;
|
2017-08-09 19:40:23 +03:00
|
|
|
|
2017-08-10 03:54:10 +03:00
|
|
|
/// Automated testing proof size
|
2017-09-29 21:44:25 +03:00
|
|
|
pub const AUTOMATED_TESTING_PROOF_SIZE: usize = 4;
|
2017-08-09 19:40:23 +03:00
|
|
|
|
2018-10-16 02:14:23 +03:00
|
|
|
/// User testing edge_bits
|
|
|
|
pub const USER_TESTING_MIN_EDGE_BITS: u8 = 15;
|
2017-08-09 19:40:23 +03:00
|
|
|
|
2017-08-10 03:54:10 +03:00
|
|
|
/// User testing proof size
|
2017-09-29 21:44:25 +03:00
|
|
|
pub const USER_TESTING_PROOF_SIZE: usize = 42;
|
2017-08-09 19:40:23 +03:00
|
|
|
|
2017-10-04 20:44:22 +03:00
|
|
|
/// Automated testing coinbase maturity
|
|
|
|
pub const AUTOMATED_TESTING_COINBASE_MATURITY: u64 = 3;
|
|
|
|
|
|
|
|
/// User testing coinbase maturity
|
|
|
|
pub const USER_TESTING_COINBASE_MATURITY: u64 = 3;
|
|
|
|
|
2018-02-10 01:32:16 +03:00
|
|
|
/// Testing cut through horizon in blocks
|
2018-11-10 06:27:52 +03:00
|
|
|
pub const TESTING_CUT_THROUGH_HORIZON: u32 = 70;
|
|
|
|
|
|
|
|
/// Testing state sync threshold in blocks
|
|
|
|
pub const TESTING_STATE_SYNC_THRESHOLD: u32 = 20;
|
2018-02-10 01:32:16 +03:00
|
|
|
|
2018-10-17 18:53:31 +03:00
|
|
|
/// Testing initial graph weight
|
|
|
|
pub const TESTING_INITIAL_GRAPH_WEIGHT: u32 = 1;
|
|
|
|
|
2018-01-27 10:48:53 +03:00
|
|
|
/// Testing initial block difficulty
|
|
|
|
pub const TESTING_INITIAL_DIFFICULTY: u64 = 1;
|
|
|
|
|
2018-03-26 12:48:46 +03:00
|
|
|
/// Testnet 2 initial block difficulty, high to see how it goes
|
|
|
|
pub const TESTNET2_INITIAL_DIFFICULTY: u64 = 1000;
|
2018-01-27 10:48:53 +03:00
|
|
|
|
2018-07-08 00:17:11 +03:00
|
|
|
/// Testnet 3 initial block difficulty, moderately high, taking into account
|
2018-07-02 02:49:49 +03:00
|
|
|
/// a 30x Cuckoo adjustment factor
|
2018-07-08 00:17:11 +03:00
|
|
|
pub const TESTNET3_INITIAL_DIFFICULTY: u64 = 30000;
|
2018-07-02 02:49:49 +03:00
|
|
|
|
2018-10-18 05:04:05 +03:00
|
|
|
/// If a peer's last updated difficulty is 2 hours ago and its difficulty's lower than ours,
|
|
|
|
/// we're sure this peer is a stuck node, and we will kick out such kind of stuck peers.
|
|
|
|
pub const STUCK_PEER_KICK_TIME: i64 = 2 * 3600 * 1000;
|
|
|
|
|
2018-10-22 23:59:40 +03:00
|
|
|
/// If a peer's last seen time is 2 weeks ago we will forget such kind of defunct peers.
|
|
|
|
const PEER_EXPIRATION_DAYS: i64 = 7 * 2;
|
|
|
|
|
|
|
|
/// Constant that expresses defunct peer timeout in seconds to be used in checks.
|
|
|
|
pub const PEER_EXPIRATION_REMOVE_TIME: i64 = PEER_EXPIRATION_DAYS * 24 * 3600;
|
|
|
|
|
2018-10-10 12:09:44 +03:00
|
|
|
/// Testnet 4 initial block difficulty
|
2018-10-17 02:14:22 +03:00
|
|
|
/// 1_000 times natural scale factor for cuckatoo29
|
2018-10-18 15:20:00 +03:00
|
|
|
pub const TESTNET4_INITIAL_DIFFICULTY: u64 = 1_000 * UNIT_DIFFICULTY;
|
2018-10-10 12:09:44 +03:00
|
|
|
|
2018-11-24 23:33:17 +03:00
|
|
|
/// Cuckatoo edge_bits on T4
|
|
|
|
pub const TESTNET4_MIN_EDGE_BITS: u8 = 30;
|
|
|
|
|
2018-10-23 15:01:19 +03:00
|
|
|
/// Trigger compaction check on average every day for all nodes.
|
|
|
|
/// Randomized per node - roll the dice on every block to decide.
|
|
|
|
/// Will compact the txhashset to remove pruned data.
|
|
|
|
/// Will also remove old blocks and associated data from the database.
|
|
|
|
/// For a node configured as "archival_mode = true" only the txhashset will be compacted.
|
2018-10-17 02:14:22 +03:00
|
|
|
pub const COMPACTION_CHECK: u64 = DAY_HEIGHT;
|
2018-10-13 19:34:16 +03:00
|
|
|
|
2017-11-16 00:49:15 +03:00
|
|
|
/// Types of chain a server can run with, dictates the genesis block and
|
|
|
|
/// and mining parameters used.
|
2017-11-13 18:24:49 +03:00
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
2017-11-16 00:49:15 +03:00
|
|
|
pub enum ChainTypes {
|
2017-08-09 19:40:23 +03:00
|
|
|
/// For CI testing
|
|
|
|
AutomatedTesting,
|
|
|
|
/// For User testing
|
|
|
|
UserTesting,
|
2018-03-04 03:19:54 +03:00
|
|
|
/// First test network
|
2017-11-16 00:49:15 +03:00
|
|
|
Testnet1,
|
2018-01-19 20:48:18 +03:00
|
|
|
/// Second test network
|
|
|
|
Testnet2,
|
2018-07-06 20:40:43 +03:00
|
|
|
/// Third test network
|
2018-07-02 02:49:49 +03:00
|
|
|
Testnet3,
|
2018-10-10 12:09:44 +03:00
|
|
|
/// Fourth test network
|
|
|
|
Testnet4,
|
2018-03-04 03:19:54 +03:00
|
|
|
/// Main production network
|
2017-11-16 00:49:15 +03:00
|
|
|
Mainnet,
|
2017-08-09 19:40:23 +03:00
|
|
|
}
|
|
|
|
|
2017-11-16 01:30:48 +03:00
|
|
|
impl Default for ChainTypes {
|
|
|
|
fn default() -> ChainTypes {
|
2018-10-10 12:09:44 +03:00
|
|
|
ChainTypes::Testnet4
|
2017-11-16 01:30:48 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-09-28 13:53:14 +03:00
|
|
|
/// PoW test mining and verifier context
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
|
|
|
pub enum PoWContextTypes {
|
|
|
|
/// Classic Cuckoo
|
|
|
|
Cuckoo,
|
2018-11-24 23:33:17 +03:00
|
|
|
/// ASIC-friendly Cuckatoo
|
2018-09-28 13:53:14 +03:00
|
|
|
Cuckatoo,
|
2018-11-24 23:33:17 +03:00
|
|
|
/// ASIC-resistant Cuckaroo
|
|
|
|
Cuckaroo,
|
2018-09-28 13:53:14 +03:00
|
|
|
}
|
|
|
|
|
2018-12-08 02:59:40 +03:00
|
|
|
lazy_static! {
|
2017-11-01 02:32:33 +03:00
|
|
|
/// The mining parameter mode
|
2017-11-16 00:49:15 +03:00
|
|
|
pub static ref CHAIN_TYPE: RwLock<ChainTypes> =
|
|
|
|
RwLock::new(ChainTypes::Mainnet);
|
2018-09-28 13:53:14 +03:00
|
|
|
|
|
|
|
/// PoW context type to instantiate
|
|
|
|
pub static ref POW_CONTEXT_TYPE: RwLock<PoWContextTypes> =
|
|
|
|
RwLock::new(PoWContextTypes::Cuckoo);
|
2017-08-09 19:40:23 +03:00
|
|
|
}
|
|
|
|
|
2017-08-10 03:54:10 +03:00
|
|
|
/// Set the mining mode
|
2017-11-16 00:49:15 +03:00
|
|
|
pub fn set_mining_mode(mode: ChainTypes) {
|
2018-10-20 03:13:07 +03:00
|
|
|
let mut param_ref = CHAIN_TYPE.write();
|
2017-09-29 21:44:25 +03:00
|
|
|
*param_ref = mode;
|
2017-08-09 19:40:23 +03:00
|
|
|
}
|
|
|
|
|
2018-09-28 13:53:14 +03:00
|
|
|
/// Return either a cuckoo context or a cuckatoo context
|
|
|
|
/// Single change point
|
|
|
|
pub fn create_pow_context<T>(
|
2018-11-24 23:33:17 +03:00
|
|
|
height: u64,
|
2018-09-28 13:53:14 +03:00
|
|
|
edge_bits: u8,
|
|
|
|
proof_size: usize,
|
|
|
|
max_sols: u32,
|
2018-11-24 23:33:17 +03:00
|
|
|
) -> Result<Box<dyn PoWContext<T>>, pow::Error>
|
2018-09-28 13:53:14 +03:00
|
|
|
where
|
2018-11-24 23:33:17 +03:00
|
|
|
T: EdgeType + 'static,
|
2018-09-28 13:53:14 +03:00
|
|
|
{
|
2018-11-24 23:33:17 +03:00
|
|
|
let chain_type = CHAIN_TYPE.read().clone();
|
|
|
|
match chain_type {
|
|
|
|
// Mainnet has Cuckaroo29 for AR and Cuckatoo30+ for AF
|
|
|
|
ChainTypes::Mainnet if edge_bits == 29 => new_cuckaroo_ctx(edge_bits, proof_size),
|
|
|
|
ChainTypes::Mainnet => new_cuckatoo_ctx(edge_bits, proof_size, max_sols),
|
|
|
|
|
|
|
|
// T4 has Cuckatoo for everything up to hard fork, then Cuckaroo29 for AR
|
|
|
|
// and Cuckatoo30+ for AF PoW
|
|
|
|
ChainTypes::Testnet4 if edge_bits == 29 && height >= T4_CUCKAROO_HARDFORK => {
|
|
|
|
new_cuckaroo_ctx(edge_bits, proof_size)
|
|
|
|
}
|
|
|
|
ChainTypes::Testnet4 => new_cuckatoo_ctx(edge_bits, proof_size, max_sols),
|
|
|
|
|
|
|
|
// Everything else is Cuckatoo only
|
|
|
|
_ => new_cuckatoo_ctx(edge_bits, proof_size, max_sols),
|
|
|
|
}
|
2018-10-10 12:09:44 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Return the type of the pos
|
|
|
|
pub fn pow_type() -> PoWContextTypes {
|
|
|
|
PoWContextTypes::Cuckatoo
|
2018-09-28 13:53:14 +03:00
|
|
|
}
|
|
|
|
|
2018-10-16 02:14:23 +03:00
|
|
|
/// The minimum acceptable edge_bits
|
|
|
|
pub fn min_edge_bits() -> u8 {
|
2018-10-20 03:13:07 +03:00
|
|
|
let param_ref = CHAIN_TYPE.read();
|
2017-08-09 19:40:23 +03:00
|
|
|
match *param_ref {
|
2018-10-16 02:14:23 +03:00
|
|
|
ChainTypes::AutomatedTesting => AUTOMATED_TESTING_MIN_EDGE_BITS,
|
|
|
|
ChainTypes::UserTesting => USER_TESTING_MIN_EDGE_BITS,
|
|
|
|
ChainTypes::Testnet1 => USER_TESTING_MIN_EDGE_BITS,
|
2018-11-24 23:33:17 +03:00
|
|
|
ChainTypes::Testnet4 => TESTNET4_MIN_EDGE_BITS,
|
|
|
|
_ => DEFAULT_MIN_EDGE_BITS,
|
2018-06-29 20:41:28 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-16 02:14:23 +03:00
|
|
|
/// Reference edge_bits used to compute factor on higher Cuck(at)oo graph sizes,
|
|
|
|
/// while the min_edge_bits can be changed on a soft fork, changing
|
|
|
|
/// base_edge_bits is a hard fork.
|
|
|
|
pub fn base_edge_bits() -> u8 {
|
2018-10-20 03:13:07 +03:00
|
|
|
let param_ref = CHAIN_TYPE.read();
|
2018-06-29 20:41:28 +03:00
|
|
|
match *param_ref {
|
2018-10-16 02:14:23 +03:00
|
|
|
ChainTypes::AutomatedTesting => AUTOMATED_TESTING_MIN_EDGE_BITS,
|
|
|
|
ChainTypes::UserTesting => USER_TESTING_MIN_EDGE_BITS,
|
|
|
|
ChainTypes::Testnet1 => USER_TESTING_MIN_EDGE_BITS,
|
|
|
|
_ => BASE_EDGE_BITS,
|
2017-08-09 19:40:23 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-08-10 03:54:10 +03:00
|
|
|
/// The proofsize
|
2017-08-09 19:40:23 +03:00
|
|
|
pub fn proofsize() -> usize {
|
2018-10-20 03:13:07 +03:00
|
|
|
let param_ref = CHAIN_TYPE.read();
|
2017-08-09 19:40:23 +03:00
|
|
|
match *param_ref {
|
2017-11-16 00:49:15 +03:00
|
|
|
ChainTypes::AutomatedTesting => AUTOMATED_TESTING_PROOF_SIZE,
|
|
|
|
ChainTypes::UserTesting => USER_TESTING_PROOF_SIZE,
|
2018-07-08 00:17:11 +03:00
|
|
|
_ => PROOFSIZE,
|
2017-08-09 19:40:23 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-17 02:14:22 +03:00
|
|
|
/// Coinbase maturity for coinbases to be spent
|
|
|
|
pub fn coinbase_maturity() -> u64 {
|
2018-10-20 03:13:07 +03:00
|
|
|
let param_ref = CHAIN_TYPE.read();
|
2017-10-04 20:44:22 +03:00
|
|
|
match *param_ref {
|
2017-11-16 00:49:15 +03:00
|
|
|
ChainTypes::AutomatedTesting => AUTOMATED_TESTING_COINBASE_MATURITY,
|
|
|
|
ChainTypes::UserTesting => USER_TESTING_COINBASE_MATURITY,
|
2018-10-17 02:14:22 +03:00
|
|
|
_ => COINBASE_MATURITY,
|
2017-10-04 20:44:22 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-27 10:48:53 +03:00
|
|
|
/// Initial mining difficulty
|
|
|
|
pub fn initial_block_difficulty() -> u64 {
|
2018-10-20 03:13:07 +03:00
|
|
|
let param_ref = CHAIN_TYPE.read();
|
2018-01-27 10:48:53 +03:00
|
|
|
match *param_ref {
|
|
|
|
ChainTypes::AutomatedTesting => TESTING_INITIAL_DIFFICULTY,
|
|
|
|
ChainTypes::UserTesting => TESTING_INITIAL_DIFFICULTY,
|
|
|
|
ChainTypes::Testnet1 => TESTING_INITIAL_DIFFICULTY,
|
|
|
|
ChainTypes::Testnet2 => TESTNET2_INITIAL_DIFFICULTY,
|
2018-07-04 00:25:57 +03:00
|
|
|
ChainTypes::Testnet3 => TESTNET3_INITIAL_DIFFICULTY,
|
2018-10-10 12:09:44 +03:00
|
|
|
ChainTypes::Testnet4 => TESTNET4_INITIAL_DIFFICULTY,
|
2018-01-27 10:48:53 +03:00
|
|
|
ChainTypes::Mainnet => INITIAL_DIFFICULTY,
|
|
|
|
}
|
|
|
|
}
|
2018-10-17 18:53:31 +03:00
|
|
|
/// Initial mining secondary scale
|
|
|
|
pub fn initial_graph_weight() -> u32 {
|
2018-10-20 03:13:07 +03:00
|
|
|
let param_ref = CHAIN_TYPE.read();
|
2018-10-17 18:53:31 +03:00
|
|
|
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,
|
2018-11-29 01:05:55 +03:00
|
|
|
ChainTypes::Testnet4 => graph_weight(0, SECOND_POW_EDGE_BITS) as u32,
|
|
|
|
ChainTypes::Mainnet => graph_weight(0, SECOND_POW_EDGE_BITS) as u32,
|
2018-10-17 18:53:31 +03:00
|
|
|
}
|
|
|
|
}
|
2018-01-27 10:48:53 +03:00
|
|
|
|
2018-02-10 01:32:16 +03:00
|
|
|
/// Horizon at which we can cut-through and do full local pruning
|
|
|
|
pub fn cut_through_horizon() -> u32 {
|
2018-10-20 03:13:07 +03:00
|
|
|
let param_ref = CHAIN_TYPE.read();
|
2018-02-10 01:32:16 +03:00
|
|
|
match *param_ref {
|
|
|
|
ChainTypes::AutomatedTesting => TESTING_CUT_THROUGH_HORIZON,
|
|
|
|
ChainTypes::UserTesting => TESTING_CUT_THROUGH_HORIZON,
|
2018-07-08 00:17:11 +03:00
|
|
|
_ => CUT_THROUGH_HORIZON,
|
2018-02-10 01:32:16 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-10 06:27:52 +03:00
|
|
|
/// Threshold at which we can request a txhashset (and full blocks from)
|
|
|
|
pub fn state_sync_threshold() -> u32 {
|
|
|
|
let param_ref = CHAIN_TYPE.read();
|
|
|
|
match *param_ref {
|
|
|
|
ChainTypes::AutomatedTesting => TESTING_STATE_SYNC_THRESHOLD,
|
|
|
|
ChainTypes::UserTesting => TESTING_STATE_SYNC_THRESHOLD,
|
|
|
|
_ => STATE_SYNC_THRESHOLD,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-08-10 03:54:10 +03:00
|
|
|
/// Are we in automated testing mode?
|
2017-08-09 19:40:23 +03:00
|
|
|
pub fn is_automated_testing_mode() -> bool {
|
2018-10-20 03:13:07 +03:00
|
|
|
let param_ref = CHAIN_TYPE.read();
|
2017-11-16 00:49:15 +03:00
|
|
|
ChainTypes::AutomatedTesting == *param_ref
|
2017-11-13 18:24:49 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Are we in user testing mode?
|
|
|
|
pub fn is_user_testing_mode() -> bool {
|
2018-10-20 03:13:07 +03:00
|
|
|
let param_ref = CHAIN_TYPE.read();
|
2017-11-16 00:49:15 +03:00
|
|
|
ChainTypes::UserTesting == *param_ref
|
2017-08-09 19:40:23 +03:00
|
|
|
}
|
2017-08-12 00:05:59 +03:00
|
|
|
|
2017-11-16 00:49:15 +03:00
|
|
|
/// Are we in production mode (a live public network)?
|
2017-08-22 21:23:54 +03:00
|
|
|
pub fn is_production_mode() -> bool {
|
2018-10-20 03:13:07 +03:00
|
|
|
let param_ref = CHAIN_TYPE.read();
|
2018-07-01 01:36:38 +03:00
|
|
|
ChainTypes::Testnet1 == *param_ref
|
|
|
|
|| ChainTypes::Testnet2 == *param_ref
|
2018-07-02 02:49:49 +03:00
|
|
|
|| ChainTypes::Testnet3 == *param_ref
|
2018-10-10 12:09:44 +03:00
|
|
|
|| ChainTypes::Testnet4 == *param_ref
|
2018-03-04 03:19:54 +03:00
|
|
|
|| ChainTypes::Mainnet == *param_ref
|
2017-08-22 21:23:54 +03:00
|
|
|
}
|
|
|
|
|
2018-11-29 01:05:13 +03:00
|
|
|
/// Are we in mainnet?
|
|
|
|
pub fn is_mainnet() -> bool {
|
|
|
|
let param_ref = CHAIN_TYPE.read();
|
|
|
|
ChainTypes::Mainnet == *param_ref
|
|
|
|
}
|
|
|
|
|
2017-09-29 21:44:25 +03:00
|
|
|
/// Helper function to get a nonce known to create a valid POW on
|
2017-08-12 00:05:59 +03:00
|
|
|
/// the genesis block, to prevent it taking ages. Should be fine for now
|
2017-09-29 21:44:25 +03:00
|
|
|
/// as the genesis block POW solution turns out to be the same for every new
|
2018-01-27 10:48:53 +03:00
|
|
|
/// block chain at the moment
|
2017-08-12 00:05:59 +03:00
|
|
|
pub fn get_genesis_nonce() -> u64 {
|
2018-10-20 03:13:07 +03:00
|
|
|
let param_ref = CHAIN_TYPE.read();
|
2017-08-12 00:05:59 +03:00
|
|
|
match *param_ref {
|
2017-09-29 21:44:25 +03:00
|
|
|
// won't make a difference
|
2017-11-16 00:49:15 +03:00
|
|
|
ChainTypes::AutomatedTesting => 0,
|
2018-10-16 02:14:23 +03:00
|
|
|
// Magic nonce for current genesis block at cuckatoo15
|
2017-11-16 00:49:15 +03:00
|
|
|
ChainTypes::UserTesting => 27944,
|
2018-10-16 02:14:23 +03:00
|
|
|
// Magic nonce for genesis block for testnet2 (cuckatoo29)
|
2017-11-16 00:49:15 +03:00
|
|
|
_ => panic!("Pre-set"),
|
2017-11-13 18:24:49 +03:00
|
|
|
}
|
2017-08-22 21:23:54 +03:00
|
|
|
}
|
2018-01-27 10:48:53 +03:00
|
|
|
|
2018-09-03 14:09:28 +03:00
|
|
|
/// Converts an iterator of block difficulty data to more a more manageable
|
2018-06-14 15:16:14 +03:00
|
|
|
/// vector and pads if needed (which will) only be needed for the first few
|
|
|
|
/// blocks after genesis
|
2018-01-27 10:48:53 +03:00
|
|
|
|
2018-10-13 23:57:01 +03:00
|
|
|
pub fn difficulty_data_to_vector<T>(cursor: T) -> Vec<HeaderInfo>
|
2018-03-04 03:19:54 +03:00
|
|
|
where
|
2018-10-13 23:57:01 +03:00
|
|
|
T: IntoIterator<Item = HeaderInfo>,
|
2018-03-04 03:19:54 +03:00
|
|
|
{
|
2018-01-27 10:48:53 +03:00
|
|
|
// Convert iterator to vector, so we can append to it if necessary
|
2018-10-17 02:55:40 +03:00
|
|
|
let needed_block_count = DIFFICULTY_ADJUST_WINDOW as usize + 1;
|
2018-10-13 23:57:01 +03:00
|
|
|
let mut last_n: Vec<HeaderInfo> = cursor.into_iter().take(needed_block_count).collect();
|
2018-01-27 10:48:53 +03:00
|
|
|
|
|
|
|
// Only needed just after blockchain launch... basically ensures there's
|
|
|
|
// always enough data by simulating perfectly timed pre-genesis
|
|
|
|
// blocks at the genesis difficulty as needed.
|
2018-10-19 22:39:54 +03:00
|
|
|
let n = last_n.len();
|
|
|
|
if needed_block_count > n {
|
|
|
|
let last_ts_delta = if n > 1 {
|
|
|
|
last_n[0].timestamp - last_n[1].timestamp
|
2018-01-27 10:48:53 +03:00
|
|
|
} else {
|
2018-10-19 22:39:54 +03:00
|
|
|
BLOCK_TIME_SEC
|
|
|
|
};
|
|
|
|
let last_diff = last_n[0].difficulty;
|
2018-07-05 15:18:09 +03:00
|
|
|
|
2018-10-19 22:39:54 +03:00
|
|
|
// fill in simulated blocks with values from the previous real block
|
|
|
|
let mut last_ts = last_n.last().unwrap().timestamp;
|
|
|
|
for _ in n..needed_block_count {
|
|
|
|
last_ts = last_ts.saturating_sub(last_ts_delta);
|
|
|
|
last_n.push(HeaderInfo::from_ts_diff(last_ts, last_diff.clone()));
|
2018-01-27 10:48:53 +03:00
|
|
|
}
|
|
|
|
}
|
2018-10-19 22:39:54 +03:00
|
|
|
last_n.reverse();
|
2018-01-27 10:48:53 +03:00
|
|
|
last_n
|
|
|
|
}
|