Add testnet blockspacing rule
This commit is contained in:
parent
51038f5810
commit
73e8b542c0
|
@ -30,8 +30,9 @@ use std::kinds::marker;
|
||||||
|
|
||||||
use blockdata::block::{Block, BlockHeader};
|
use blockdata::block::{Block, BlockHeader};
|
||||||
use blockdata::transaction::Transaction;
|
use blockdata::transaction::Transaction;
|
||||||
use blockdata::constants::{DIFFCHANGE_INTERVAL, DIFFCHANGE_TIMESPAN, max_target, genesis_block};
|
use blockdata::constants::{DIFFCHANGE_INTERVAL, DIFFCHANGE_TIMESPAN,
|
||||||
use network::constants::Network;
|
TARGET_BLOCK_SPACING, max_target, genesis_block};
|
||||||
|
use network::constants::{Network, BitcoinTestnet};
|
||||||
use network::serialize::{Serializable, SerializeIter};
|
use network::serialize::{Serializable, SerializeIter};
|
||||||
use util::BitArray;
|
use util::BitArray;
|
||||||
use util::error::{BitcoinResult, BlockNotFound, DuplicateHash, PrevHashNotFound};
|
use util::error::{BitcoinResult, BlockNotFound, DuplicateHash, PrevHashNotFound};
|
||||||
|
@ -491,9 +492,25 @@ impl Blockchain {
|
||||||
if target > max { target = max };
|
if target > max { target = max };
|
||||||
// Compactify (make expressible in the 8+24 nBits float format
|
// Compactify (make expressible in the 8+24 nBits float format
|
||||||
satoshi_the_precision(&target)
|
satoshi_the_precision(&target)
|
||||||
} else {
|
// On non-diffchange blocks, Testnet has a rule that any 20-minute-long
|
||||||
|
// block intervals result the difficulty
|
||||||
|
} else if self.network == BitcoinTestnet &&
|
||||||
|
block.header.time > prev.block.header.time + 2*TARGET_BLOCK_SPACING {
|
||||||
|
max_target(self.network)
|
||||||
|
// On the other hand, if we are in Testnet and the block interval is less
|
||||||
|
// than 20 minutes, we need to scan backward to find a block for which the
|
||||||
|
// previous rule did not apply, to find the "real" difficulty.
|
||||||
|
} else if self.network == BitcoinTestnet {
|
||||||
|
// Scan back DIFFCHANGE_INTERVAL blocks
|
||||||
|
let mut scan = prev.clone();
|
||||||
|
while scan.height % DIFFCHANGE_INTERVAL != 0 &&
|
||||||
|
scan.required_difficulty == max_target(self.network) {
|
||||||
|
scan = scan.prev(&self.tree).unwrap();
|
||||||
|
}
|
||||||
|
scan.required_difficulty
|
||||||
// Otherwise just use the last block's difficulty
|
// Otherwise just use the last block's difficulty
|
||||||
prev.required_difficulty
|
} else {
|
||||||
|
prev.required_difficulty
|
||||||
};
|
};
|
||||||
// Create node
|
// Create node
|
||||||
let ret = Rc::new(BlockchainNode {
|
let ret = Rc::new(BlockchainNode {
|
||||||
|
|
|
@ -33,6 +33,7 @@ use util::uint::Uint256;
|
||||||
|
|
||||||
pub static MAX_SEQUENCE: u32 = 0xFFFFFFFF;
|
pub static MAX_SEQUENCE: u32 = 0xFFFFFFFF;
|
||||||
pub static COIN_VALUE: u64 = 100000000;
|
pub static COIN_VALUE: u64 = 100000000;
|
||||||
|
pub static TARGET_BLOCK_SPACING: u32 = 600;
|
||||||
pub static DIFFCHANGE_INTERVAL: u32 = 2016;
|
pub static DIFFCHANGE_INTERVAL: u32 = 2016;
|
||||||
pub static DIFFCHANGE_TIMESPAN: u32 = 14 * 24 * 3600;
|
pub static DIFFCHANGE_TIMESPAN: u32 = 14 * 24 * 3600;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue