155 lines
5.1 KiB
Rust
155 lines
5.1 KiB
Rust
//! Network methods for fetching blockchain vectors.
|
|
//!
|
|
|
|
use std::collections::BTreeMap;
|
|
|
|
use crate::{block::Block, parameters::Network, serialization::ZcashDeserializeInto};
|
|
|
|
use zebra_test::vectors::{
|
|
BLOCK_MAINNET_1046400_BYTES, BLOCK_MAINNET_653599_BYTES, BLOCK_MAINNET_982681_BYTES,
|
|
BLOCK_TESTNET_1116000_BYTES, BLOCK_TESTNET_583999_BYTES, BLOCK_TESTNET_925483_BYTES,
|
|
CONTINUOUS_MAINNET_BLOCKS, CONTINUOUS_TESTNET_BLOCKS, MAINNET_BLOCKS,
|
|
MAINNET_FINAL_SAPLING_ROOTS, MAINNET_FINAL_SPROUT_ROOTS,
|
|
SAPLING_FINAL_ROOT_MAINNET_1046400_BYTES, SAPLING_FINAL_ROOT_TESTNET_1116000_BYTES,
|
|
TESTNET_BLOCKS, TESTNET_FINAL_SAPLING_ROOTS, TESTNET_FINAL_SPROUT_ROOTS,
|
|
};
|
|
|
|
/// Network methods for fetching blockchain vectors.
|
|
impl Network {
|
|
/// Returns true if network is of type Mainnet.
|
|
pub fn is_mainnet(&self) -> bool {
|
|
matches!(self, Network::Mainnet)
|
|
}
|
|
|
|
/// Returns iterator over blocks.
|
|
pub fn block_iter(&self) -> std::collections::btree_map::Iter<'static, u32, &'static [u8]> {
|
|
if self.is_mainnet() {
|
|
MAINNET_BLOCKS.iter()
|
|
} else {
|
|
TESTNET_BLOCKS.iter()
|
|
}
|
|
}
|
|
|
|
///
|
|
pub fn block_map(&self) -> BTreeMap<u32, &'static [u8]> {
|
|
if self.is_mainnet() {
|
|
zebra_test::vectors::MAINNET_BLOCKS.clone()
|
|
} else {
|
|
zebra_test::vectors::TESTNET_BLOCKS.clone()
|
|
}
|
|
}
|
|
|
|
/// Returns genesis block for chain.
|
|
pub fn gen_block(&self) -> std::option::Option<&&[u8]> {
|
|
if self.is_mainnet() {
|
|
MAINNET_BLOCKS.get(&0)
|
|
} else {
|
|
TESTNET_BLOCKS.get(&0)
|
|
}
|
|
}
|
|
|
|
/// Returns block bytes
|
|
pub fn test_block(&self, main_height: u32, test_height: u32) -> Option<Block> {
|
|
match (self.is_mainnet(), main_height, test_height) {
|
|
(true, 653_599, _) => BLOCK_MAINNET_653599_BYTES.zcash_deserialize_into().ok(),
|
|
(true, 982_681, _) => BLOCK_MAINNET_982681_BYTES.zcash_deserialize_into().ok(),
|
|
(false, _, 583_999) => BLOCK_TESTNET_583999_BYTES.zcash_deserialize_into().ok(),
|
|
(false, _, 925_483) => BLOCK_TESTNET_925483_BYTES.zcash_deserialize_into().ok(),
|
|
_ => None,
|
|
}
|
|
}
|
|
|
|
/// Returns iterator over blockchain.
|
|
pub fn blockchain_iter(&self) -> std::collections::btree_map::Iter<'_, u32, &[u8]> {
|
|
if self.is_mainnet() {
|
|
CONTINUOUS_MAINNET_BLOCKS.iter()
|
|
} else {
|
|
CONTINUOUS_TESTNET_BLOCKS.iter()
|
|
}
|
|
}
|
|
|
|
/// Returns BTreemap of blockchain.
|
|
pub fn blockchain_map(&self) -> &BTreeMap<u32, &'static [u8]> {
|
|
if self.is_mainnet() {
|
|
&CONTINUOUS_MAINNET_BLOCKS
|
|
} else {
|
|
&CONTINUOUS_TESTNET_BLOCKS
|
|
}
|
|
}
|
|
|
|
/// Returns iterator over blocks and sapling roots.
|
|
pub fn block_sapling_roots_iter(
|
|
&self,
|
|
) -> (
|
|
std::collections::btree_map::Iter<'_, u32, &[u8]>,
|
|
std::collections::BTreeMap<u32, &[u8; 32]>,
|
|
) {
|
|
if self.is_mainnet() {
|
|
(MAINNET_BLOCKS.iter(), MAINNET_FINAL_SAPLING_ROOTS.clone())
|
|
} else {
|
|
(TESTNET_BLOCKS.iter(), TESTNET_FINAL_SAPLING_ROOTS.clone())
|
|
}
|
|
}
|
|
|
|
/// Returns BTreemap of blocks and sapling roots.
|
|
pub fn block_sapling_roots_map(
|
|
&self,
|
|
) -> (
|
|
&std::collections::BTreeMap<u32, &'static [u8]>,
|
|
&std::collections::BTreeMap<u32, &'static [u8; 32]>,
|
|
) {
|
|
if self.is_mainnet() {
|
|
(&*MAINNET_BLOCKS, &*MAINNET_FINAL_SAPLING_ROOTS)
|
|
} else {
|
|
(&*TESTNET_BLOCKS, &*TESTNET_FINAL_SAPLING_ROOTS)
|
|
}
|
|
}
|
|
|
|
/// Returns block and sapling root bytes
|
|
pub fn test_block_sapling_roots(
|
|
&self,
|
|
main_height: u32,
|
|
test_height: u32,
|
|
) -> Option<(&[u8], [u8; 32])> {
|
|
match (self.is_mainnet(), main_height, test_height) {
|
|
(true, 1_046_400, _) => Some((
|
|
&BLOCK_MAINNET_1046400_BYTES[..],
|
|
*SAPLING_FINAL_ROOT_MAINNET_1046400_BYTES,
|
|
)),
|
|
(false, _, 1_116_000) => Some((
|
|
&BLOCK_TESTNET_1116000_BYTES[..],
|
|
*SAPLING_FINAL_ROOT_TESTNET_1116000_BYTES,
|
|
)),
|
|
_ => None,
|
|
}
|
|
}
|
|
|
|
/// Returns BTreemap of blocks and sprout roots, and last split height.
|
|
pub fn block_sprout_roots_height(
|
|
&self,
|
|
) -> (
|
|
&std::collections::BTreeMap<u32, &'static [u8]>,
|
|
&std::collections::BTreeMap<u32, &'static [u8; 32]>,
|
|
u32,
|
|
) {
|
|
// The mainnet block height at which the first JoinSplit occurred.
|
|
const MAINNET_FIRST_JOINSPLIT_HEIGHT: u32 = 396;
|
|
|
|
// The testnet block height at which the first JoinSplit occurred.
|
|
const TESTNET_FIRST_JOINSPLIT_HEIGHT: u32 = 2259;
|
|
if self.is_mainnet() {
|
|
(
|
|
&*MAINNET_BLOCKS,
|
|
&*MAINNET_FINAL_SPROUT_ROOTS,
|
|
MAINNET_FIRST_JOINSPLIT_HEIGHT,
|
|
)
|
|
} else {
|
|
(
|
|
&*TESTNET_BLOCKS,
|
|
&*TESTNET_FINAL_SPROUT_ROOTS,
|
|
TESTNET_FIRST_JOINSPLIT_HEIGHT,
|
|
)
|
|
}
|
|
}
|
|
}
|