feature: Add the MinimumDifficulty consensus parameter
This commit is contained in:
parent
04044be6d1
commit
396d209638
|
|
@ -10,9 +10,11 @@
|
||||||
//! `Network` and `BlockHeight`.
|
//! `Network` and `BlockHeight`.
|
||||||
|
|
||||||
pub mod genesis;
|
pub mod genesis;
|
||||||
|
pub mod minimum_difficulty;
|
||||||
pub mod network_upgrade;
|
pub mod network_upgrade;
|
||||||
|
|
||||||
pub use genesis::*;
|
pub use genesis::*;
|
||||||
|
pub use minimum_difficulty::*;
|
||||||
pub use network_upgrade::*;
|
pub use network_upgrade::*;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
//! The minimum difficulty block rule for Zcash.
|
||||||
|
|
||||||
|
use zebra_chain::types::BlockHeight;
|
||||||
|
use zebra_chain::{Network, Network::*};
|
||||||
|
|
||||||
|
/// The testnet block height when minimum difficulty blocks start being
|
||||||
|
/// accepted.
|
||||||
|
pub(crate) const TESTNET_MINIMUM_DIFFICULTY_HEIGHT: BlockHeight = BlockHeight(299_188);
|
||||||
|
|
||||||
|
/// The Zcash Testnet consensus rules were changed to allow
|
||||||
|
/// minimum-difficulty blocks, shortly after Testnet Sapling activation.
|
||||||
|
/// See ZIP-205 and ZIP-208 for details.
|
||||||
|
///
|
||||||
|
/// This change represents a hard-fork on Testnet, but it doesn't appear on
|
||||||
|
/// Mainnet, so we handle it as an independent consensus rule change.
|
||||||
|
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq)]
|
||||||
|
pub enum MinimumDifficulty {
|
||||||
|
/// Minimum difficulty blocks are rejected.
|
||||||
|
///
|
||||||
|
/// Always returned for Mainnet blocks.
|
||||||
|
Rejected,
|
||||||
|
/// Minimum difficulty blocks are allowed.
|
||||||
|
///
|
||||||
|
/// Only allowed for Testnet blocks.
|
||||||
|
AllowedOnTestnet,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MinimumDifficulty {
|
||||||
|
/// Returns the current minimum difficulty rule for `network` and `height`.
|
||||||
|
pub fn current(network: Network, height: BlockHeight) -> MinimumDifficulty {
|
||||||
|
use MinimumDifficulty::*;
|
||||||
|
|
||||||
|
match network {
|
||||||
|
Mainnet => Rejected,
|
||||||
|
Testnet if (height >= TESTNET_MINIMUM_DIFFICULTY_HEIGHT) => AllowedOnTestnet,
|
||||||
|
Testnet => Rejected,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -183,3 +183,44 @@ fn branch_id_consistent(network: Network) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn minimum_difficulty_mainnet() {
|
||||||
|
minimum_difficulty(Mainnet)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn minimum_difficulty_testnet() {
|
||||||
|
minimum_difficulty(Testnet)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Test MinimumDifficulty
|
||||||
|
fn minimum_difficulty(network: Network) {
|
||||||
|
use MinimumDifficulty::*;
|
||||||
|
|
||||||
|
let allowed_if_testnet = match network {
|
||||||
|
Mainnet => Rejected,
|
||||||
|
Testnet => AllowedOnTestnet,
|
||||||
|
};
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
MinimumDifficulty::current(network, BlockHeight(0)),
|
||||||
|
Rejected
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
MinimumDifficulty::current(network, BlockHeight(299_187)),
|
||||||
|
Rejected
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
MinimumDifficulty::current(network, BlockHeight(299_188)),
|
||||||
|
allowed_if_testnet
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
MinimumDifficulty::current(network, BlockHeight(299_189)),
|
||||||
|
allowed_if_testnet
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
MinimumDifficulty::current(network, BlockHeight::MAX),
|
||||||
|
allowed_if_testnet
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue