From efb681ebe21e035df8f0689d27a499ebc045cccf Mon Sep 17 00:00:00 2001 From: Avi Dessauer Date: Tue, 3 Sep 2024 07:29:49 -0700 Subject: [PATCH 01/12] Update to 2.0.0-rc4 and rename BlockBody to BlockBodyV1 Start introducing the V2 block format Fix clippy lints Make BlockV2 serde prop tests Make Era stuff work Fix tests Fix end era v2 BlockHeaderV2 proptests More Tests --- Cargo.toml | 12 +- rust-toolchain.toml | 2 +- src/block.rs | 389 ++++++++++++++++++++++++--- src/block_header.rs | 544 +++++++++++++++++++++++++++++++++++--- src/consensus.rs | 183 ++++++++++++- src/crypto.rs | 62 ++--- src/hash.rs | 21 +- src/json_compatibility.rs | 53 ++-- src/kernel.rs | 5 +- src/merkle_proof.rs | 22 +- tests/integration.rs | 42 +-- 11 files changed, 1138 insertions(+), 197 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 429f77b..55d454d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] base16 = { version = "0.2.1", default-features = false, features = ["alloc"] } blake2b_simd = { version = "1.0.2", default-features = false } -casper-types = "4.0.1" +casper-types = { git = "https://github.com/casper-network/casper-node.git", branch = "release-2.0.0-rc4" } ed25519-dalek = { version = "2.0.0", default-features = false, features = [ "alloc", "zeroize", @@ -17,6 +17,7 @@ k256 = { version = "0.13.1", default-features = false, features = [ "sha256", ] } serde = { version = "1.0.195", default-features = false, features = ["derive"] } +serde-map-to-array = "1" time = { version = "0.3.31", default-features = false, features = [ "serde", "formatting", @@ -25,10 +26,11 @@ time = { version = "0.3.31", default-features = false, features = [ [dev-dependencies] bincode = "1.3.3" -casper-hashing = "3.0.0" -casper-execution-engine = "7.0.1" -casper-types = { version = "4.0.1", features = ["gens"] } -casper-node = "1.5.6" +# casper-hashing = "3.0.0" +casper-execution-engine = { git = "https://github.com/casper-network/casper-node.git", branch = "release-2.0.0-rc4" } +casper-types = { git = "https://github.com/casper-network/casper-node.git", branch = "release-2.0.0-rc4", features = ["gens"] } +casper-node = { git = "https://github.com/casper-network/casper-node.git", branch = "release-2.0.0-rc4" } +casper-storage = { git = "https://github.com/casper-network/casper-node.git", branch = "release-2.0.0-rc4" } hex = "0.4.3" once_cell = "1.19.0" serde_json = "1.0.111" diff --git a/rust-toolchain.toml b/rust-toolchain.toml index c1f5c7b..73cb934 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "1.75.0" +channel = "stable" components = ["rustfmt", "clippy"] diff --git a/src/block.rs b/src/block.rs index 6bf8176..6b9fdec 100644 --- a/src/block.rs +++ b/src/block.rs @@ -6,18 +6,17 @@ use casper_types::{crypto::gens::public_key_arb, SecretKey}; use proptest::prelude::*; use casper_types::{ - bytesrepr::{FromBytes, ToBytes}, - EraId, PublicKey, Signature, + bytesrepr::{self, FromBytes, ToBytes}, + EraId, PublicKey, RewardedSignatures, Signature, TransactionHash, }; use super::{ - block_header::{BlockHash, BlockHeader}, + block_header::{BlockHash, BlockHeaderV1}, crypto::{verify, SignatureVerificationError}, hash::Digest, }; -#[derive(Clone, Debug, PartialOrd, Ord, Eq, PartialEq)] -#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, PartialOrd, Ord, Eq, PartialEq, serde::Serialize, serde::Deserialize)] // See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/block.rs#L1324-L1332 pub struct BlockSignatures { block_hash: BlockHash, @@ -102,7 +101,7 @@ impl Arbitrary for BlockSignatures { #[derive(Debug, Clone, PartialEq, Eq)] // See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/block.rs#L1184-L1188 pub struct BlockHeaderWithSignatures { - block_header: BlockHeader, + block_header: BlockHeaderV1, block_signatures: BlockSignatures, } @@ -120,12 +119,12 @@ pub enum BlockHeaderWithSignaturesConstructionError { impl BlockHeaderWithSignatures { pub fn new( - block_header: BlockHeader, + block_header: BlockHeaderV1, block_signatures: BlockSignatures, ) -> Result { if block_header.era_id() != block_signatures.era_id() { return Err(BlockHeaderWithSignaturesConstructionError::InvalidEraId { - header_era_id: block_header.era_id().clone(), + header_era_id: block_header.era_id(), signatures_era_id: block_signatures.era_id(), }); } @@ -144,7 +143,7 @@ impl BlockHeaderWithSignatures { }) } - pub fn block_header(&self) -> &BlockHeader { + pub fn block_header(&self) -> &BlockHeaderV1 { &self.block_header } @@ -159,10 +158,10 @@ impl Arbitrary for BlockHeaderWithSignatures { type Strategy = BoxedStrategy; fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - (any::(), any::()) + (any::(), any::()) .prop_map(|(block_header, mut block_signatures)| { block_signatures.block_hash = block_header.block_hash(); - block_signatures.era_id = block_header.era_id().clone(); + block_signatures.era_id = block_header.era_id(); BlockHeaderWithSignatures { block_header, block_signatures, @@ -177,15 +176,15 @@ impl Arbitrary for BlockHeaderWithSignatures { )] #[cfg_attr(test, derive(proptest_derive::Arbitrary))] // See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/deploy/deploy_hash.rs#L32 -pub struct DeployHash(Digest); +pub struct DeployHash(pub(crate) Digest); // See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/deploy/deploy_hash.rs#L89-L101 impl ToBytes for DeployHash { - fn write_bytes(&self, writer: &mut Vec) -> Result<(), casper_types::bytesrepr::Error> { + fn write_bytes(&self, writer: &mut Vec) -> Result<(), bytesrepr::Error> { self.0.write_bytes(writer) } - fn to_bytes(&self) -> Result, casper_types::bytesrepr::Error> { + fn to_bytes(&self) -> Result, bytesrepr::Error> { self.0.to_bytes() } @@ -196,26 +195,120 @@ impl ToBytes for DeployHash { // See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/deploy/deploy_hash.rs#L103-L107 impl FromBytes for DeployHash { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), casper_types::bytesrepr::Error> { + fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { Digest::from_bytes(bytes).map(|(inner, remainder)| (DeployHash(inner), remainder)) } } #[derive(Clone, PartialEq, Eq, Debug, PartialOrd, Ord, serde::Serialize, serde::Deserialize)] +#[allow(clippy::large_enum_variant)] +pub enum BlockBody { + /// The legacy, initial version of the body portion of a block. + #[serde(rename = "Version1")] + V1(BlockBodyV1), + /// The version 2 of the body portion of a block, which includes the + /// `past_finality_signatures`. + #[serde(rename = "Version2")] + V2(BlockBodyV2), +} + +/// Tag for block body v1. +pub const BLOCK_BODY_V1_TAG: u8 = 0; +/// Tag for block body v2. +pub const BLOCK_BODY_V2_TAG: u8 = 1; + +impl BlockBody { + pub fn hash(&self) -> Digest { + match self { + BlockBody::V1(v1) => v1.hash(), + BlockBody::V2(v2) => v2.hash(), + } + } +} + +impl From for BlockBody { + fn from(block_body: BlockBodyV1) -> Self { + BlockBody::V1(block_body) + } +} + +impl From for BlockBody { + fn from(block_body: BlockBodyV2) -> Self { + BlockBody::V2(block_body) + } +} + +impl ToBytes for BlockBody { + fn to_bytes(&self) -> Result, bytesrepr::Error> { + let mut buffer = bytesrepr::allocate_buffer(self)?; + match self { + BlockBody::V1(v1) => { + buffer.insert(0, BLOCK_BODY_V1_TAG); + buffer.extend(v1.to_bytes()?); + } + BlockBody::V2(v2) => { + buffer.insert(0, BLOCK_BODY_V2_TAG); + buffer.extend(v2.to_bytes()?); + } + } + Ok(buffer) + } + + fn serialized_length(&self) -> usize { + 1 + match self { + BlockBody::V1(v1) => v1.serialized_length(), + BlockBody::V2(v2) => v2.serialized_length(), + } + } +} + +impl FromBytes for BlockBody { + fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { + let (tag, remainder) = u8::from_bytes(bytes)?; + match tag { + BLOCK_BODY_V1_TAG => { + let (body, remainder): (BlockBodyV1, _) = FromBytes::from_bytes(remainder)?; + Ok((Self::V1(body), remainder)) + } + BLOCK_BODY_V2_TAG => { + let (body, remainder): (BlockBodyV2, _) = FromBytes::from_bytes(remainder)?; + Ok((Self::V2(body), remainder)) + } + _ => Err(bytesrepr::Error::Formatting), + } + } +} + +#[cfg(test)] +impl Arbitrary for BlockBody { + type Parameters = (); + type Strategy = BoxedStrategy; + + fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { + prop_oneof![ + any::().prop_map(BlockBody::V1), + any::().prop_map(BlockBody::V2), + ] + .boxed() + } +} + +#[derive(Clone, PartialEq, Eq, Debug, PartialOrd, Ord, serde::Serialize, serde::Deserialize)] +// See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/block.rs#L1204C14-L1204C15 // See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/block.rs#L1204C14-L1204C15 -pub struct BlockBody { +pub struct BlockBodyV1 { proposer: PublicKey, deploy_hashes: Vec, transfer_hashes: Vec, } -impl BlockBody { +impl BlockBodyV1 { pub fn new( proposer: PublicKey, deploy_hashes: Vec, transfer_hashes: Vec, ) -> Self { - BlockBody { + BlockBodyV1 { proposer, deploy_hashes, transfer_hashes, @@ -240,7 +333,7 @@ impl BlockBody { } #[cfg(test)] -impl Arbitrary for BlockBody { +impl Arbitrary for BlockBodyV1 { type Parameters = (); type Strategy = BoxedStrategy; @@ -250,7 +343,7 @@ impl Arbitrary for BlockBody { prop::collection::vec(any::(), 0..5), prop::collection::vec(any::(), 0..5), ) - .prop_map(|(proposer, deploy_hashes, transfer_hashes)| BlockBody { + .prop_map(|(proposer, deploy_hashes, transfer_hashes)| BlockBodyV1 { proposer, deploy_hashes, transfer_hashes, @@ -260,9 +353,9 @@ impl Arbitrary for BlockBody { } // See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/block.rs#L1292-L1306 -impl ToBytes for BlockBody { - fn to_bytes(&self) -> Result, casper_types::bytesrepr::Error> { - let mut buffer = casper_types::bytesrepr::allocate_buffer(self)?; +impl ToBytes for BlockBodyV1 { + fn to_bytes(&self) -> Result, bytesrepr::Error> { + let mut buffer = bytesrepr::allocate_buffer(self)?; buffer.extend(self.proposer.to_bytes()?); buffer.extend(self.deploy_hashes.to_bytes()?); buffer.extend(self.transfer_hashes.to_bytes()?); @@ -277,12 +370,12 @@ impl ToBytes for BlockBody { } // See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/block.rs#L1308-L1321 -impl FromBytes for BlockBody { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), casper_types::bytesrepr::Error> { +impl FromBytes for BlockBodyV1 { + fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { let (proposer, bytes) = PublicKey::from_bytes(bytes)?; let (deploy_hashes, bytes) = Vec::::from_bytes(bytes)?; let (transfer_hashes, bytes) = Vec::::from_bytes(bytes)?; - let body = BlockBody { + let body = BlockBodyV1 { proposer, deploy_hashes, transfer_hashes, @@ -291,12 +384,141 @@ impl FromBytes for BlockBody { } } +/// The body portion of a block. Version 2. +#[derive(Clone, PartialEq, Eq, Debug, PartialOrd, Ord, serde::Serialize, serde::Deserialize)] +pub struct BlockBodyV2 { + /// Map of transactions mapping categories to a list of transaction hashes. + transactions: BTreeMap>, + /// List of identifiers for finality signatures for a particular past block. + rewarded_signatures: RewardedSignatures, +} + +impl BlockBodyV2 { + pub fn new( + transactions: BTreeMap>, + rewarded_signatures: RewardedSignatures, + ) -> Self { + BlockBodyV2 { + transactions, + rewarded_signatures, + } + } + + pub fn transactions(&self) -> &BTreeMap> { + &self.transactions + } + + pub fn rewarded_signatures(&self) -> &RewardedSignatures { + &self.rewarded_signatures + } + + pub fn hash(&self) -> Digest { + Digest::hash(&self.to_bytes().unwrap()) + } +} + +impl ToBytes for BlockBodyV2 { + fn write_bytes(&self, writer: &mut Vec) -> Result<(), bytesrepr::Error> { + self.transactions.write_bytes(writer)?; + self.rewarded_signatures.write_bytes(writer)?; + Ok(()) + } + + fn to_bytes(&self) -> Result, bytesrepr::Error> { + let mut buffer = bytesrepr::allocate_buffer(self)?; + self.write_bytes(&mut buffer)?; + Ok(buffer) + } + + fn serialized_length(&self) -> usize { + self.transactions.serialized_length() + self.rewarded_signatures.serialized_length() + } +} + +impl FromBytes for BlockBodyV2 { + fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { + let (transactions, bytes) = FromBytes::from_bytes(bytes)?; + let (rewarded_signatures, bytes) = RewardedSignatures::from_bytes(bytes)?; + let body = BlockBodyV2 { + transactions, + rewarded_signatures, + }; + Ok((body, bytes)) + } +} + +#[cfg(test)] +impl Arbitrary for BlockBodyV2 { + type Parameters = (); + type Strategy = BoxedStrategy; + + fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { + fn transaction_category_arb() -> impl Strategy { + use casper_types::TransactionCategory; + + prop_oneof![ + Just(TransactionCategory::Mint as u8), + Just(TransactionCategory::Auction as u8), + Just(TransactionCategory::InstallUpgrade as u8), + Just(TransactionCategory::Large as u8), + Just(TransactionCategory::Medium as u8), + Just(TransactionCategory::Small as u8), + ] + } + + ( + prop::collection::btree_map( + transaction_category_arb(), + prop::collection::vec( + prop_oneof!( + any::() + .prop_map(|hash| TransactionHash::from_raw(hash.0.into())), + any::<[u8; crate::hash::DIGEST_LENGTH]>() + .prop_map(TransactionHash::from_raw), + ), + 0..5, + ), + 0..5, + ), + // validator set + prop::collection::btree_set(public_key_arb(), 0..10), + // indices of validators who signed + prop::collection::vec(any::(), 0..10), + ) + .prop_map(|(transactions, validator_set, signer_indices)| { + let validator_set: Vec<_> = validator_set.into_iter().collect(); + + // prop::Index.get panics if the collection is empty + use alloc::collections::BTreeSet; + let signing_validators: BTreeSet<_> = if validator_set.is_empty() { + BTreeSet::new() + } else { + signer_indices + .into_iter() + .map(|index| index.get(&validator_set)) + .cloned() + .collect() + }; + + let rewarded_signatures = RewardedSignatures::new([ + casper_types::SingleBlockRewardedSignatures::from_validator_set( + &signing_validators, + &validator_set, + ), + ]); + + BlockBodyV2::new(transactions, rewarded_signatures) + }) + .boxed() + } +} + // Data structure reflecting the JSON representation of a block's body. // See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L2268-L2277 #[derive(Clone, PartialEq, Eq, Debug)] pub struct Block { block_header_with_signatures: BlockHeaderWithSignatures, - body: BlockBody, + body: BlockBodyV1, } #[derive(Debug)] @@ -310,7 +532,7 @@ pub enum BlockConstructionError { impl Block { pub fn new( block_header_with_signatures: BlockHeaderWithSignatures, - body: BlockBody, + body: BlockBodyV1, ) -> Result { let header_block_hash = block_header_with_signatures.block_header().body_hash(); let body_hash = body.hash(); @@ -330,7 +552,7 @@ impl Block { &self.block_header_with_signatures } - pub fn body(&self) -> &BlockBody { + pub fn body(&self) -> &BlockBodyV1 { &self.body } } @@ -341,7 +563,7 @@ impl Arbitrary for Block { type Strategy = BoxedStrategy; fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - (any::(), any::()) + (any::(), any::()) .prop_map(|(header, body)| Block { block_header_with_signatures: header, body, @@ -361,12 +583,12 @@ mod test { use crate::{block_header::BlockHash, crypto::sign, hash::DIGEST_LENGTH}; - use super::{BlockBody, BlockSignatures, DeployHash}; + use super::{BlockBody, BlockBodyV1, BlockBodyV2, BlockSignatures, DeployHash}; #[proptest] fn serde_json_block_signatures_round_trip(block_signatures: BlockSignatures) { let serialized_block_signatures = serde_json::to_string(&block_signatures).unwrap(); - let casper_types_block_signatures: casper_node::types::BlockSignatures = + let casper_types_block_signatures: casper_types::BlockSignaturesV1 = serde_json::from_str(&serialized_block_signatures).unwrap(); let serialized_casper_types_block_signatures = serde_json::to_string(&casper_types_block_signatures).unwrap(); @@ -382,7 +604,7 @@ mod test { #[proptest] fn bincode_block_signatures_round_trip(block_signatures: BlockSignatures) { let serialized_block_signatures = bincode::serialize(&block_signatures).unwrap(); - let casper_types_block_signatures: casper_node::types::BlockSignatures = + let casper_types_block_signatures: casper_types::BlockSignaturesV1 = bincode::deserialize(&serialized_block_signatures).unwrap(); let serialized_casper_types_block_signatures = bincode::serialize(&casper_types_block_signatures).unwrap(); @@ -437,7 +659,7 @@ mod test { #[proptest] fn serde_json_deploy_hash_round_trip_casper_node(deploy_hash: DeployHash) { let serialized_deploy_hash = serde_json::to_string(&deploy_hash).unwrap(); - let casper_node_deploy_hash: casper_node::types::DeployHash = + let casper_node_deploy_hash: casper_types::DeployHash = serde_json::from_str(&serialized_deploy_hash).unwrap(); let serialized_casper_node_deploy_hash = serde_json::to_string(&casper_node_deploy_hash).unwrap(); @@ -453,7 +675,7 @@ mod test { #[proptest] fn bincode_deploy_hash_round_trip_casper_node(deploy_hash: DeployHash) { let serialized_deploy_hash = bincode::serialize(&deploy_hash).unwrap(); - let casper_node_deploy_hash: casper_node::types::DeployHash = + let casper_node_deploy_hash: casper_types::DeployHash = bincode::deserialize(&serialized_deploy_hash).unwrap(); let serialized_casper_node_deploy_hash = bincode::serialize(&casper_node_deploy_hash).unwrap(); @@ -469,7 +691,7 @@ mod test { let casper_types_deploy_hash: casper_types::DeployHash = casper_types::bytesrepr::deserialize(serialized_deploy_hash.clone()).unwrap(); let serialized_casper_types_deploy_hash = - casper_types::bytesrepr::serialize(&casper_types_deploy_hash).unwrap(); + casper_types::bytesrepr::serialize(casper_types_deploy_hash).unwrap(); assert_eq!(serialized_deploy_hash, serialized_casper_types_deploy_hash); let deserialized_deploy_hash: DeployHash = casper_types::bytesrepr::deserialize(serialized_casper_types_deploy_hash.clone()) @@ -480,10 +702,10 @@ mod test { #[proptest] fn bytesrepr_deploy_hash_round_trip_casper_node(deploy_hash: DeployHash) { let serialized_deploy_hash = deploy_hash.to_bytes().unwrap(); - let casper_node_deploy_hash: casper_node::types::DeployHash = + let casper_node_deploy_hash: casper_types::DeployHash = casper_types::bytesrepr::deserialize(serialized_deploy_hash.clone()).unwrap(); let serialized_casper_node_deploy_hash = - casper_types::bytesrepr::serialize(&casper_node_deploy_hash).unwrap(); + casper_types::bytesrepr::serialize(casper_node_deploy_hash).unwrap(); assert_eq!(serialized_deploy_hash, serialized_casper_node_deploy_hash); let deserialized_deploy_hash: DeployHash = casper_types::bytesrepr::deserialize(serialized_casper_node_deploy_hash.clone()) @@ -491,10 +713,34 @@ mod test { assert_eq!(deploy_hash, deserialized_deploy_hash); } + #[proptest] + fn serde_json_block_body_v1_round_trip(block_body: BlockBodyV1) { + let serialized_block_body = serde_json::to_string(&block_body).unwrap(); + let casper_node_block_body: casper_types::BlockBodyV1 = + serde_json::from_str(&serialized_block_body).unwrap(); + let serialized_node_block_body = serde_json::to_string(&casper_node_block_body).unwrap(); + assert_eq!(serialized_block_body, serialized_node_block_body); + let deserialized_block_body: BlockBodyV1 = + serde_json::from_str(&serialized_node_block_body).unwrap(); + assert_eq!(block_body, deserialized_block_body); + } + + #[proptest] + fn serde_json_block_body_v2_round_trip(block_body: BlockBodyV2) { + let serialized_block_body = serde_json::to_string(&block_body).unwrap(); + let casper_node_block_body: casper_types::BlockBodyV2 = + serde_json::from_str(&serialized_block_body).unwrap(); + let serialized_node_block_body = serde_json::to_string(&casper_node_block_body).unwrap(); + assert_eq!(serialized_block_body, serialized_node_block_body); + let deserialized_block_body: BlockBodyV2 = + serde_json::from_str(&serialized_node_block_body).unwrap(); + assert_eq!(block_body, deserialized_block_body); + } + #[proptest] fn serde_json_block_body_round_trip(block_body: BlockBody) { let serialized_block_body = serde_json::to_string(&block_body).unwrap(); - let casper_node_block_body: casper_node::types::BlockBody = + let casper_node_block_body: casper_types::BlockBody = serde_json::from_str(&serialized_block_body).unwrap(); let serialized_node_block_body = serde_json::to_string(&casper_node_block_body).unwrap(); assert_eq!(serialized_block_body, serialized_node_block_body); @@ -503,10 +749,36 @@ mod test { assert_eq!(block_body, deserialized_block_body); } + #[proptest] + fn bincode_block_body_v1_round_trip(block_body: BlockBodyV1) { + let serialized_block_body = bincode::serialize(&block_body).unwrap(); + let casper_node_block_body: casper_types::BlockBodyV1 = + bincode::deserialize(&serialized_block_body).unwrap(); + let serialized_casper_node_block_body = + bincode::serialize(&casper_node_block_body).unwrap(); + assert_eq!(serialized_block_body, serialized_casper_node_block_body); + let deserialized_block_body: BlockBodyV1 = + bincode::deserialize(&serialized_casper_node_block_body).unwrap(); + assert_eq!(block_body, deserialized_block_body); + } + + #[proptest] + fn bincode_block_body_v2_round_trip(block_body: BlockBodyV2) { + let serialized_block_body = bincode::serialize(&block_body).unwrap(); + let casper_node_block_body: casper_types::BlockBodyV2 = + bincode::deserialize(&serialized_block_body).unwrap(); + let serialized_casper_node_block_body = + bincode::serialize(&casper_node_block_body).unwrap(); + assert_eq!(serialized_block_body, serialized_casper_node_block_body); + let deserialized_block_body: BlockBodyV2 = + bincode::deserialize(&serialized_casper_node_block_body).unwrap(); + assert_eq!(block_body, deserialized_block_body); + } + #[proptest] fn bincode_block_body_round_trip(block_body: BlockBody) { let serialized_block_body = bincode::serialize(&block_body).unwrap(); - let casper_node_block_body: casper_node::types::BlockBody = + let casper_node_block_body: casper_types::BlockBody = bincode::deserialize(&serialized_block_body).unwrap(); let serialized_casper_node_block_body = bincode::serialize(&casper_node_block_body).unwrap(); @@ -516,10 +788,38 @@ mod test { assert_eq!(block_body, deserialized_block_body); } + #[proptest] + fn bytesrepr_block_body_v1_round_trip(block_body: BlockBodyV1) { + let serialized_block_body = block_body.to_bytes().unwrap(); + let casper_node_block_body: casper_types::BlockBodyV1 = + casper_types::bytesrepr::deserialize(serialized_block_body.clone()).unwrap(); + let serialized_casper_node_block_body = + casper_types::bytesrepr::serialize(&casper_node_block_body).unwrap(); + assert_eq!(serialized_block_body, serialized_casper_node_block_body); + let deserialized_block_body: BlockBodyV1 = + casper_types::bytesrepr::deserialize(serialized_casper_node_block_body.clone()) + .unwrap(); + assert_eq!(block_body, deserialized_block_body); + } + + #[proptest] + fn bytesrepr_block_body_v2_round_trip(block_body: BlockBodyV2) { + let serialized_block_body = block_body.to_bytes().unwrap(); + let casper_node_block_body: casper_types::BlockBodyV2 = + casper_types::bytesrepr::deserialize(serialized_block_body.clone()).unwrap(); + let serialized_casper_node_block_body = + casper_types::bytesrepr::serialize(&casper_node_block_body).unwrap(); + assert_eq!(serialized_block_body, serialized_casper_node_block_body); + let deserialized_block_body: BlockBodyV2 = + casper_types::bytesrepr::deserialize(serialized_casper_node_block_body.clone()) + .unwrap(); + assert_eq!(block_body, deserialized_block_body); + } + #[proptest] fn bytesrepr_block_body_round_trip(block_body: BlockBody) { let serialized_block_body = block_body.to_bytes().unwrap(); - let casper_node_block_body: casper_node::types::BlockBody = + let casper_node_block_body: casper_types::BlockBody = casper_types::bytesrepr::deserialize(serialized_block_body.clone()).unwrap(); let serialized_casper_node_block_body = casper_types::bytesrepr::serialize(&casper_node_block_body).unwrap(); @@ -534,9 +834,12 @@ mod test { fn block_body_hash_agree(block_body: BlockBody) { let block_body_hash = block_body.hash(); let serialized_block_body = block_body.to_bytes().unwrap(); - let casper_node_block_body: casper_node::types::BlockBody = + let casper_node_block_body: casper_types::BlockBody = casper_types::bytesrepr::deserialize(serialized_block_body).unwrap(); - let casper_node_block_body_hash = casper_node_block_body.hash(); + let casper_node_block_body_hash = match casper_node_block_body { + casper_types::BlockBody::V1(v1) => v1.hash(), + casper_types::BlockBody::V2(v2) => v2.hash(), + }; assert_eq!( block_body_hash.as_ref(), casper_node_block_body_hash.as_ref() diff --git a/src/block_header.rs b/src/block_header.rs index 7f83bf3..1ae7680 100644 --- a/src/block_header.rs +++ b/src/block_header.rs @@ -3,11 +3,13 @@ use alloc::{string::String, vec::Vec}; #[cfg(test)] use proptest::{arbitrary::Arbitrary, prelude::*}; -use casper_types::bytesrepr::{FromBytes, ToBytes}; -use casper_types::{EraId, ProtocolVersion}; +use casper_types::bytesrepr::{self, FromBytes, ToBytes}; +use casper_types::{EraId, ProtocolVersion, PublicKey}; use time::OffsetDateTime; -use super::consensus::EraEnd; +use crate::consensus::EraEndV2; + +use super::consensus::EraEndV1; use super::hash::Digest; use super::hash::DIGEST_LENGTH; @@ -131,36 +133,202 @@ impl FromBytes for Timestamp { } } +#[derive(Clone, Debug, Eq, PartialEq)] +#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] +pub enum BlockHeader { + /// The legacy, initial version of the header portion of a block. + #[cfg_attr(test, serde(rename = "Version1"))] + V1(BlockHeaderV1), + /// The version 2 of the header portion of a block. + #[cfg_attr(test, serde(rename = "Version2"))] + V2(BlockHeaderV2), +} + +/// Tag for block header v1. +pub const BLOCK_HEADER_V1_TAG: u8 = 0; +/// Tag for block header v2. +pub const BLOCK_HEADER_V2_TAG: u8 = 1; + +impl BlockHeader { + /// Returns the hash of this block header. + pub fn block_hash(&self) -> BlockHash { + match self { + BlockHeader::V1(v1) => v1.block_hash(), + BlockHeader::V2(v2) => v2.block_hash(), + } + } + + /// Returns the parent block's hash. + pub fn parent_hash(&self) -> &BlockHash { + match self { + BlockHeader::V1(v1) => v1.parent_hash(), + BlockHeader::V2(v2) => v2.parent_hash(), + } + } + + /// Returns the root hash of global state after the deploys in this block have been executed. + pub fn state_root_hash(&self) -> &Digest { + match self { + BlockHeader::V1(v1) => v1.state_root_hash(), + BlockHeader::V2(v2) => v2.state_root_hash(), + } + } + + /// Returns the hash of the block's body. + pub fn body_hash(&self) -> &Digest { + match self { + BlockHeader::V1(v1) => v1.body_hash(), + BlockHeader::V2(v2) => v2.body_hash(), + } + } + + /// Returns a random bit needed for initializing a future era. + pub fn random_bit(&self) -> bool { + match self { + BlockHeader::V1(v1) => v1.random_bit(), + BlockHeader::V2(v2) => v2.random_bit(), + } + } + + /// Returns a seed needed for initializing a future era. + pub fn accumulated_seed(&self) -> &Digest { + match self { + BlockHeader::V1(v1) => v1.accumulated_seed(), + BlockHeader::V2(v2) => v2.accumulated_seed(), + } + } + + /// Returns the timestamp from when the block was proposed. + pub fn timestamp(&self) -> Timestamp { + match self { + BlockHeader::V1(v1) => v1.timestamp(), + BlockHeader::V2(v2) => v2.timestamp(), + } + } + + /// Returns the era ID in which this block was created. + pub fn era_id(&self) -> EraId { + match self { + BlockHeader::V1(v1) => v1.era_id(), + BlockHeader::V2(v2) => v2.era_id(), + } + } + + /// Returns the height of this block, i.e. the number of ancestors. + pub fn height(&self) -> u64 { + match self { + BlockHeader::V1(v1) => v1.height(), + BlockHeader::V2(v2) => v2.height(), + } + } + + /// Returns the protocol version of the network from when this block was created. + pub fn protocol_version(&self) -> ProtocolVersion { + match self { + BlockHeader::V1(v1) => v1.protocol_version(), + BlockHeader::V2(v2) => v2.protocol_version(), + } + } +} + +impl From for BlockHeader { + fn from(header: BlockHeaderV1) -> Self { + BlockHeader::V1(header) + } +} + +impl From for BlockHeader { + fn from(header: BlockHeaderV2) -> Self { + BlockHeader::V2(header) + } +} + +impl ToBytes for BlockHeader { + fn to_bytes(&self) -> Result, bytesrepr::Error> { + let mut buffer = bytesrepr::allocate_buffer(self)?; + match self { + BlockHeader::V1(v1) => { + buffer.insert(0, BLOCK_HEADER_V1_TAG); + buffer.extend(v1.to_bytes()?); + } + BlockHeader::V2(v2) => { + buffer.insert(0, BLOCK_HEADER_V2_TAG); + buffer.extend(v2.to_bytes()?); + } + } + Ok(buffer) + } + + fn serialized_length(&self) -> usize { + 1 + match self { + BlockHeader::V1(v1) => v1.serialized_length(), + BlockHeader::V2(v2) => v2.serialized_length(), + } + } +} + +impl FromBytes for BlockHeader { + fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { + let (tag, remainder) = u8::from_bytes(bytes)?; + match tag { + BLOCK_HEADER_V1_TAG => { + let (header, remainder): (BlockHeaderV1, _) = FromBytes::from_bytes(remainder)?; + Ok((Self::V1(header), remainder)) + } + BLOCK_HEADER_V2_TAG => { + let (header, remainder): (BlockHeaderV2, _) = FromBytes::from_bytes(remainder)?; + Ok((Self::V2(header), remainder)) + } + _ => Err(bytesrepr::Error::Formatting), + } + } +} + +#[cfg(test)] +impl Arbitrary for BlockHeader { + type Parameters = (); + type Strategy = BoxedStrategy; + + fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { + prop_oneof![ + any::().prop_map(BlockHeader::V1), + any::().prop_map(BlockHeader::V2), + ] + .boxed() + } +} + #[derive(Clone, Eq, PartialEq, Debug)] #[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] // See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L813-L828 -pub struct BlockHeader { +pub struct BlockHeaderV1 { parent_hash: BlockHash, state_root_hash: Digest, body_hash: Digest, random_bit: bool, accumulated_seed: Digest, - era_end: Option, + era_end: Option, timestamp: Timestamp, era_id: EraId, height: u64, protocol_version: ProtocolVersion, } -impl BlockHeader { +impl BlockHeaderV1 { + #[allow(clippy::too_many_arguments)] pub fn new( parent_hash: BlockHash, state_root_hash: Digest, body_hash: Digest, random_bit: bool, accumulated_seed: Digest, - era_end: Option, + era_end: Option, timestamp: Timestamp, era_id: EraId, height: u64, protocol_version: ProtocolVersion, ) -> Self { - BlockHeader { + BlockHeaderV1 { parent_hash, state_root_hash, body_hash, @@ -194,7 +362,7 @@ impl BlockHeader { &self.accumulated_seed } - pub fn era_end(&self) -> Option<&EraEnd> { + pub fn era_end(&self) -> Option<&EraEndV1> { self.era_end.as_ref() } @@ -220,23 +388,24 @@ impl BlockHeader { } #[cfg(test)] -impl Arbitrary for BlockHeader { +fn arb_protocolversion() -> impl Strategy { + (0..=255u32, 0..=255u32, 0..=255u32) + .prop_map(|(major, minor, patch)| ProtocolVersion::from_parts(major, minor, patch)) +} + +#[cfg(test)] +impl Arbitrary for BlockHeaderV1 { type Parameters = (); type Strategy = BoxedStrategy; fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - fn arb_protocolversion() -> impl Strategy { - (0..=255u32, 0..=255u32, 0..=255u32) - .prop_map(|(major, minor, patch)| ProtocolVersion::from_parts(major, minor, patch)) - } - ( any::(), any::(), any::(), any::(), any::(), - any::>(), + any::>(), any::(), any::(), // EraId any::(), // height @@ -256,7 +425,7 @@ impl Arbitrary for BlockHeader { protocol_version, )| { let era_id = EraId::from(era_id); - BlockHeader { + BlockHeaderV1 { parent_hash, state_root_hash, body_hash, @@ -274,7 +443,7 @@ impl Arbitrary for BlockHeader { } } -impl ToBytes for BlockHeader { +impl ToBytes for BlockHeaderV1 { fn to_bytes(&self) -> Result, casper_types::bytesrepr::Error> { let mut buffer = casper_types::bytesrepr::allocate_buffer(self)?; buffer.extend(self.parent_hash.to_bytes()?); @@ -304,19 +473,19 @@ impl ToBytes for BlockHeader { } } -impl FromBytes for BlockHeader { +impl FromBytes for BlockHeaderV1 { fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), casper_types::bytesrepr::Error> { let (parent_hash, remainder) = BlockHash::from_bytes(bytes)?; let (state_root_hash, remainder) = Digest::from_bytes(remainder)?; let (body_hash, remainder) = Digest::from_bytes(remainder)?; let (random_bit, remainder) = bool::from_bytes(remainder)?; let (accumulated_seed, remainder) = Digest::from_bytes(remainder)?; - let (era_end, remainder) = Option::::from_bytes(remainder)?; + let (era_end, remainder) = Option::::from_bytes(remainder)?; let (timestamp, remainder) = Timestamp::from_bytes(remainder)?; let (era_id, remainder) = EraId::from_bytes(remainder)?; let (height, remainder) = u64::from_bytes(remainder)?; let (protocol_version, remainder) = ProtocolVersion::from_bytes(remainder)?; - let block_header = BlockHeader { + let block_header = BlockHeaderV1 { parent_hash, state_root_hash, body_hash, @@ -332,6 +501,264 @@ impl FromBytes for BlockHeader { } } +/// The header portion of a block. +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] +pub struct BlockHeaderV2 { + /// The parent block's hash. + pub parent_hash: BlockHash, + /// The root hash of global state after the deploys in this block have been executed. + pub state_root_hash: Digest, + /// The hash of the block's body. + pub body_hash: Digest, + /// A random bit needed for initializing a future era. + pub random_bit: bool, + /// A seed needed for initializing a future era. + pub accumulated_seed: Digest, + /// The `EraEnd` of a block if it is a switch block. + pub era_end: Option, + /// The timestamp from when the block was proposed. + pub timestamp: Timestamp, + /// The era ID in which this block was created. + pub era_id: EraId, + /// The height of this block, i.e. the number of ancestors. + pub height: u64, + /// The protocol version of the network from when this block was created. + pub protocol_version: ProtocolVersion, + /// The public key of the validator which proposed the block. + pub proposer: PublicKey, + /// The gas price of the era + pub current_gas_price: u8, + /// The most recent switch block hash. + pub last_switch_block_hash: Option, +} + +impl BlockHeaderV2 { + /// Returns the hash of this block header. + pub fn block_hash(&self) -> BlockHash { + self.compute_block_hash() + } + + /// Returns the parent block's hash. + pub fn parent_hash(&self) -> &BlockHash { + &self.parent_hash + } + + /// Returns the root hash of global state after the deploys in this block have been executed. + pub fn state_root_hash(&self) -> &Digest { + &self.state_root_hash + } + + /// Returns the hash of the block's body. + pub fn body_hash(&self) -> &Digest { + &self.body_hash + } + + /// Returns a random bit needed for initializing a future era. + pub fn random_bit(&self) -> bool { + self.random_bit + } + + /// Returns a seed needed for initializing a future era. + pub fn accumulated_seed(&self) -> &Digest { + &self.accumulated_seed + } + + /// Returns the `EraEnd` of a block if it is a switch block. + pub fn era_end(&self) -> Option<&EraEndV2> { + self.era_end.as_ref() + } + + /// Returns the timestamp from when the block was proposed. + pub fn timestamp(&self) -> Timestamp { + self.timestamp + } + + /// Returns the era ID in which this block was created. + pub fn era_id(&self) -> EraId { + self.era_id + } + + /// Returns the era ID in which the next block would be created (i.e. this block's era ID, or + /// its successor if this is a switch block). + pub fn next_block_era_id(&self) -> EraId { + if self.era_end.is_some() { + self.era_id.successor() + } else { + self.era_id + } + } + + /// Returns the height of this block, i.e. the number of ancestors. + pub fn height(&self) -> u64 { + self.height + } + + /// Returns the protocol version of the network from when this block was created. + pub fn protocol_version(&self) -> ProtocolVersion { + self.protocol_version + } + + /// Returns `true` if this block is the last one in the current era. + pub fn is_switch_block(&self) -> bool { + self.era_end.is_some() + } + + /// Returns the public key of the validator which proposed the block. + pub fn proposer(&self) -> &PublicKey { + &self.proposer + } + + /// Returns `true` if this block is the Genesis block, i.e. has height 0 and era 0. + pub fn is_genesis(&self) -> bool { + self.era_id().is_genesis() && self.height() == 0 + } + + /// Returns the gas price for the given block. + pub fn current_gas_price(&self) -> u8 { + self.current_gas_price + } + + pub(crate) fn compute_block_hash(&self) -> BlockHash { + let serialized_header = self + .to_bytes() + .unwrap_or_else(|error| panic!("should serialize block header: {}", error)); + BlockHash::from(Digest::hash(&serialized_header)) + } +} + +impl ToBytes for BlockHeaderV2 { + fn write_bytes(&self, writer: &mut Vec) -> Result<(), bytesrepr::Error> { + self.parent_hash.write_bytes(writer)?; + self.state_root_hash.write_bytes(writer)?; + self.body_hash.write_bytes(writer)?; + self.random_bit.write_bytes(writer)?; + self.accumulated_seed.write_bytes(writer)?; + self.era_end.write_bytes(writer)?; + self.timestamp.write_bytes(writer)?; + self.era_id.write_bytes(writer)?; + self.height.write_bytes(writer)?; + self.protocol_version.write_bytes(writer)?; + self.proposer.write_bytes(writer)?; + self.current_gas_price.write_bytes(writer)?; + self.last_switch_block_hash.write_bytes(writer) + } + + fn to_bytes(&self) -> Result, bytesrepr::Error> { + let mut buffer = bytesrepr::allocate_buffer(self)?; + self.write_bytes(&mut buffer)?; + Ok(buffer) + } + + fn serialized_length(&self) -> usize { + self.parent_hash.serialized_length() + + self.state_root_hash.serialized_length() + + self.body_hash.serialized_length() + + self.random_bit.serialized_length() + + self.accumulated_seed.serialized_length() + + self.era_end.serialized_length() + + self.timestamp.serialized_length() + + self.era_id.serialized_length() + + self.height.serialized_length() + + self.protocol_version.serialized_length() + + self.proposer.serialized_length() + + self.current_gas_price.serialized_length() + + self.last_switch_block_hash.serialized_length() + } +} + +impl FromBytes for BlockHeaderV2 { + fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { + let (parent_hash, remainder) = BlockHash::from_bytes(bytes)?; + let (state_root_hash, remainder) = Digest::from_bytes(remainder)?; + let (body_hash, remainder) = Digest::from_bytes(remainder)?; + let (random_bit, remainder) = bool::from_bytes(remainder)?; + let (accumulated_seed, remainder) = Digest::from_bytes(remainder)?; + let (era_end, remainder) = Option::from_bytes(remainder)?; + let (timestamp, remainder) = Timestamp::from_bytes(remainder)?; + let (era_id, remainder) = EraId::from_bytes(remainder)?; + let (height, remainder) = u64::from_bytes(remainder)?; + let (protocol_version, remainder) = ProtocolVersion::from_bytes(remainder)?; + let (proposer, remainder) = PublicKey::from_bytes(remainder)?; + let (current_gas_price, remainder) = u8::from_bytes(remainder)?; + let (last_switch_block_hash, remainder) = Option::from_bytes(remainder)?; + let block_header = BlockHeaderV2 { + parent_hash, + state_root_hash, + body_hash, + random_bit, + accumulated_seed, + era_end, + timestamp, + era_id, + height, + protocol_version, + proposer, + current_gas_price, + last_switch_block_hash, + }; + Ok((block_header, remainder)) + } +} + +#[cfg(test)] +impl Arbitrary for BlockHeaderV2 { + type Parameters = (); + type Strategy = BoxedStrategy; + + fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { + ( + // this tuple is needed because prop_map only supports tuples of arity <= 12 + (any::(), any::()), + any::(), + any::(), + any::(), + any::>(), + any::(), + any::(), + any::(), + arb_protocolversion(), + casper_types::crypto::gens::public_key_arb(), + 0..=255u8, + any::>(), + ) + .prop_map( + |( + (parent_hash, state_root_hash), + body_hash, + random_bit, + accumulated_seed, + era_end, + timestamp, + era_id, + height, + protocol_version, + proposer, + current_gas_price, + last_switch_block_hash, + )| { + let era_id = EraId::from(era_id); + BlockHeaderV2 { + parent_hash, + state_root_hash, + body_hash, + random_bit, + accumulated_seed, + era_end, + timestamp, + era_id, + height, + protocol_version, + proposer, + current_gas_price, + last_switch_block_hash, + } + }, + ) + .boxed() + } +} + #[cfg(test)] mod test { extern crate std; @@ -340,7 +767,7 @@ mod test { use casper_types::bytesrepr::{deserialize_from_slice, ToBytes}; use test_strategy::proptest; - use super::{BlockHeader, Timestamp}; + use super::{BlockHeaderV1, Timestamp}; #[proptest] fn serde_json_timestamp_round_trip(timestamp: Timestamp) { @@ -381,46 +808,95 @@ mod test { } #[proptest] - fn serde_json_block_header_round_trip(block_header: BlockHeader) { + fn serde_json_block_header_v1_round_trip(block_header: BlockHeaderV1) { + let serialized_block_header = serde_json::to_string(&block_header).unwrap(); + let casper_node_block_header: casper_types::BlockHeaderV1 = + serde_json::from_str(&serialized_block_header).unwrap(); + let serialized_casper_node_block_header = + serde_json::to_string(&casper_node_block_header).unwrap(); + let deserialized_block_header: BlockHeaderV1 = + serde_json::from_str(&serialized_casper_node_block_header).unwrap(); + assert_eq!(block_header, deserialized_block_header); + } + + #[proptest] + fn serde_json_block_header_round_trip(block_header: super::BlockHeader) { let serialized_block_header = serde_json::to_string(&block_header).unwrap(); - let casper_node_block_header: casper_node::types::BlockHeader = + let casper_node_block_header: casper_types::BlockHeader = serde_json::from_str(&serialized_block_header).unwrap(); let serialized_casper_node_block_header = serde_json::to_string(&casper_node_block_header).unwrap(); - let deserialized_block_header: BlockHeader = + let deserialized_block_header: super::BlockHeader = serde_json::from_str(&serialized_casper_node_block_header).unwrap(); assert_eq!(block_header, deserialized_block_header); } #[proptest] - fn bincode_block_header_round_trip(block_header: BlockHeader) { + fn bincode_block_header_v1_round_trip(block_header: BlockHeaderV1) { let serialized_block_header = bincode::serialize(&block_header).unwrap(); - let casper_node_block_header: casper_node::types::BlockHeader = + let casper_node_block_header: casper_types::BlockHeaderV1 = bincode::deserialize(&serialized_block_header).unwrap(); let serialized_casper_node_block_header = bincode::serialize(&casper_node_block_header).unwrap(); assert_eq!(serialized_block_header, serialized_casper_node_block_header); - let deserialized_block_header: BlockHeader = + let deserialized_block_header: BlockHeaderV1 = bincode::deserialize(&serialized_casper_node_block_header).unwrap(); assert_eq!(block_header, deserialized_block_header); } #[proptest] - fn bytesrepr_block_header_round_trip(block_header: BlockHeader) { + fn bincode_block_header_round_trip(block_header: super::BlockHeader) { + let serialized_block_header = bincode::serialize(&block_header).unwrap(); + let casper_node_block_header: casper_types::BlockHeader = + bincode::deserialize(&serialized_block_header).unwrap(); + let serialized_casper_node_block_header = + bincode::serialize(&casper_node_block_header).unwrap(); + assert_eq!(serialized_block_header, serialized_casper_node_block_header); + let deserialized_block_header: super::BlockHeader = + bincode::deserialize(&serialized_casper_node_block_header).unwrap(); + assert_eq!(block_header, deserialized_block_header); + } + + #[proptest] + fn bytesrepr_block_header_v1_round_trip(block_header: BlockHeaderV1) { let serialized_block_header = block_header.to_bytes().unwrap(); - let casper_node_block_header: casper_node::types::BlockHeader = + let casper_node_block_header: casper_types::BlockHeaderV1 = deserialize_from_slice(&serialized_block_header).unwrap(); let serialized_casper_node_block_header = casper_node_block_header.to_bytes().unwrap(); assert_eq!(serialized_block_header, serialized_casper_node_block_header); - let deserialized_block_header: BlockHeader = + let deserialized_block_header: BlockHeaderV1 = deserialize_from_slice(&serialized_casper_node_block_header).unwrap(); assert_eq!(block_header, deserialized_block_header) } #[proptest] - fn block_header_hash_agree(block_header: BlockHeader) { - let casper_node_block_header: casper_node::types::BlockHeader = - deserialize_from_slice(&block_header.to_bytes().unwrap()).unwrap(); + fn bytesrepr_block_header_round_trip(block_header: super::BlockHeader) { + let serialized_block_header = block_header.to_bytes().unwrap(); + let casper_node_block_header: casper_types::BlockHeader = + deserialize_from_slice(&serialized_block_header).unwrap(); + let serialized_casper_node_block_header = casper_node_block_header.to_bytes().unwrap(); + assert_eq!(serialized_block_header, serialized_casper_node_block_header); + let deserialized_block_header: super::BlockHeader = + deserialize_from_slice(&serialized_casper_node_block_header).unwrap(); + assert_eq!(block_header, deserialized_block_header) + } + + #[proptest] + fn block_header_v1_hash_agree(block_header: BlockHeaderV1) { + let casper_node_block_header: casper_types::BlockHeaderV1 = + deserialize_from_slice(block_header.to_bytes().unwrap()).unwrap(); + let block_hash = block_header.block_hash(); + let casper_block_hash = casper_node_block_header.block_hash(); + assert_eq!( + <[u8; 32]>::from(block_hash).to_vec(), + casper_block_hash.as_ref().to_owned() + ); + } + + #[proptest] + fn block_header_hash_agree(block_header: super::BlockHeader) { + let casper_node_block_header: casper_types::BlockHeader = + deserialize_from_slice(block_header.to_bytes().unwrap()).unwrap(); let block_hash = block_header.block_hash(); let casper_block_hash = casper_node_block_header.block_hash(); assert_eq!( diff --git a/src/consensus.rs b/src/consensus.rs index 297aa44..e02eaac 100644 --- a/src/consensus.rs +++ b/src/consensus.rs @@ -4,15 +4,23 @@ use alloc::{collections::BTreeMap, vec::Vec}; use proptest::prelude::*; use casper_types::{ - bytesrepr::{FromBytes, ToBytes}, + bytesrepr::{self, FromBytes, ToBytes}, PublicKey, U512, }; +#[cfg(test)] +use serde_map_to_array::BTreeMapToArray; +use serde_map_to_array::KeyValueLabels; + #[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] // See https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/components/consensus/consensus_protocol.rs#L105-L115 pub struct EraReport { pub(crate) equivocators: Vec, + #[cfg_attr( + test, + serde(with = "BTreeMapToArray::") + )] pub(crate) rewards: BTreeMap, pub(crate) inactive_validators: Vec, } @@ -54,7 +62,8 @@ impl Arbitrary for EraReport { proptest::collection::btree_map( casper_types::crypto::gens::public_key_arb(), any::(), - 0..5, + // Must have at least one reward or deserialization will fail. + 1..5, ), proptest::collection::vec(casper_types::crypto::gens::public_key_arb(), 0..5), ) @@ -103,17 +112,21 @@ impl FromBytes for EraReport { #[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)] #[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] // See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L748-L753 -pub struct EraEnd { +pub struct EraEndV1 { pub(crate) era_report: EraReport, + #[cfg_attr( + test, + serde(with = "BTreeMapToArray::") + )] pub(crate) next_era_validator_weights: BTreeMap, } -impl EraEnd { +impl EraEndV1 { pub fn new( era_report: EraReport, next_era_validator_weights: BTreeMap, ) -> Self { - EraEnd { + EraEndV1 { era_report, next_era_validator_weights, } @@ -128,8 +141,15 @@ impl EraEnd { } } +pub struct NextEraValidatorLabels; + +impl KeyValueLabels for NextEraValidatorLabels { + const KEY: &'static str = "validator"; + const VALUE: &'static str = "weight"; +} + #[cfg(test)] -impl Arbitrary for EraEnd { +impl Arbitrary for EraEndV1 { type Parameters = (); type Strategy = BoxedStrategy; @@ -139,10 +159,11 @@ impl Arbitrary for EraEnd { proptest::collection::btree_map( casper_types::crypto::gens::public_key_arb(), any::().prop_map(U512::from), - 0..5, + // Must have at least one validator or deserialization will fail. + 1..5, ), ) - .prop_map(|(era_report, next_era_validator_weights)| EraEnd { + .prop_map(|(era_report, next_era_validator_weights)| EraEndV1 { era_report, next_era_validator_weights, }) @@ -151,7 +172,7 @@ impl Arbitrary for EraEnd { } // See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L774-L785 -impl ToBytes for EraEnd { +impl ToBytes for EraEndV1 { fn to_bytes(&self) -> Result, casper_types::bytesrepr::Error> { let mut buffer = casper_types::bytesrepr::allocate_buffer(self)?; buffer.extend(self.era_report.to_bytes()?); @@ -165,11 +186,11 @@ impl ToBytes for EraEnd { } // See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L787-L797 -impl FromBytes for EraEnd { +impl FromBytes for EraEndV1 { fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), casper_types::bytesrepr::Error> { let (era_report, bytes) = EraReport::from_bytes(bytes)?; let (next_era_validator_weights, bytes) = BTreeMap::::from_bytes(bytes)?; - let era_end = EraEnd { + let era_end = EraEndV1 { era_report, next_era_validator_weights, }; @@ -177,6 +198,133 @@ impl FromBytes for EraEnd { } } +pub struct EraRewardsLabels; + +impl KeyValueLabels for EraRewardsLabels { + const KEY: &'static str = "validator"; + const VALUE: &'static str = "amount"; +} + +/// Information related to the end of an era, and validator weights for the following era. +#[derive(Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug)] +#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] +pub struct EraEndV2 { + /// The set of equivocators. + pub equivocators: Vec, + /// Validators that haven't produced any unit during the era. + pub inactive_validators: Vec, + /// The validators for the upcoming era and their respective weights. + #[cfg_attr( + test, + serde(with = "BTreeMapToArray::") + )] + pub next_era_validator_weights: BTreeMap, + /// The rewards distributed to the validators. + pub rewards: BTreeMap>, + pub next_era_gas_price: u8, +} + +impl ToBytes for EraEndV2 { + fn write_bytes(&self, writer: &mut Vec) -> Result<(), bytesrepr::Error> { + let EraEndV2 { + equivocators, + inactive_validators, + next_era_validator_weights, + rewards, + next_era_gas_price, + } = self; + + equivocators.write_bytes(writer)?; + inactive_validators.write_bytes(writer)?; + next_era_validator_weights.write_bytes(writer)?; + rewards.write_bytes(writer)?; + next_era_gas_price.write_bytes(writer)?; + + Ok(()) + } + + fn to_bytes(&self) -> Result, bytesrepr::Error> { + let mut buffer = bytesrepr::allocate_buffer(self)?; + self.write_bytes(&mut buffer)?; + Ok(buffer) + } + + fn serialized_length(&self) -> usize { + let EraEndV2 { + equivocators, + inactive_validators, + next_era_validator_weights, + rewards, + next_era_gas_price, + } = self; + + equivocators.serialized_length() + + inactive_validators.serialized_length() + + next_era_validator_weights.serialized_length() + + rewards.serialized_length() + + next_era_gas_price.serialized_length() + } +} + +impl FromBytes for EraEndV2 { + fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { + let (equivocators, bytes) = Vec::from_bytes(bytes)?; + let (inactive_validators, bytes) = Vec::from_bytes(bytes)?; + let (next_era_validator_weights, bytes) = BTreeMap::from_bytes(bytes)?; + let (rewards, bytes) = BTreeMap::from_bytes(bytes)?; + let (next_era_gas_price, bytes) = u8::from_bytes(bytes)?; + let era_end = EraEndV2 { + equivocators, + inactive_validators, + next_era_validator_weights, + rewards, + next_era_gas_price, + }; + + Ok((era_end, bytes)) + } +} + +#[cfg(test)] +impl Arbitrary for EraEndV2 { + type Parameters = (); + type Strategy = BoxedStrategy; + + fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { + ( + proptest::collection::vec(casper_types::crypto::gens::public_key_arb(), 0..5), + proptest::collection::vec(casper_types::crypto::gens::public_key_arb(), 0..5), + proptest::collection::btree_map( + casper_types::crypto::gens::public_key_arb(), + any::().prop_map(U512::from), + 1..5, + ), + proptest::collection::btree_map( + casper_types::crypto::gens::public_key_arb(), + proptest::collection::vec(any::().prop_map(U512::from), 1..5), + 1..5, + ), + any::(), + ) + .prop_map( + |( + equivocators, + inactive_validators, + next_era_validator_weights, + rewards, + next_era_gas_price, + )| EraEndV2 { + equivocators, + inactive_validators, + next_era_validator_weights, + rewards, + next_era_gas_price, + }, + ) + .boxed() + } +} + #[cfg(test)] mod test { extern crate std; @@ -184,12 +332,19 @@ mod test { use casper_types::bytesrepr::{deserialize_from_slice, ToBytes}; use test_strategy::proptest; - use super::EraEnd; + use super::EraEndV1; + + #[proptest] + fn bytesrepr_era_end_v1_round_trip(era_end: EraEndV1) { + let serialized = era_end.to_bytes().unwrap(); + let deserialized: EraEndV1 = deserialize_from_slice(&serialized).unwrap(); + assert_eq!(era_end, deserialized) + } #[proptest] - fn bytesrepr_era_end_round_trip(era_end: EraEnd) { + fn bytesrepr_era_end_v2_round_trip(era_end: super::EraEndV2) { let serialized = era_end.to_bytes().unwrap(); - let deserialized: EraEnd = deserialize_from_slice(&serialized).unwrap(); + let deserialized: super::EraEndV2 = deserialize_from_slice(&serialized).unwrap(); assert_eq!(era_end, deserialized) } } diff --git a/src/crypto.rs b/src/crypto.rs index 460949b..8a79e3c 100644 --- a/src/crypto.rs +++ b/src/crypto.rs @@ -76,9 +76,8 @@ mod test { fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { prop_oneof![ - any::<[u8; CasperPublicKey::ED25519_LENGTH]>().prop_map(|bytes| { - RealSecretKey::Ed25519(Ed25519SecretKey::try_from(bytes).unwrap()) - }), + any::<[u8; CasperPublicKey::ED25519_LENGTH]>() + .prop_map(|bytes| { RealSecretKey::Ed25519(Ed25519SecretKey::from(bytes)) }), any::<[u8; CasperSecretKey::SECP256K1_LENGTH]>() .prop_filter("Cannot make a secret key from [0u8; 32]", |bytes| bytes != &[0u8; CasperSecretKey::SECP256K1_LENGTH]) @@ -107,15 +106,13 @@ mod test { fn sign_and_verify(real_secret_key: RealSecretKey, message: Vec) { let casper_secret_key = CasperSecretKey::from(real_secret_key); let signature = sign(&casper_secret_key, &message); - assert_eq!( - verify( - &CasperPublicKey::from(&casper_secret_key), - &message, - &signature - ) - .unwrap(), - () + + verify( + &CasperPublicKey::from(&casper_secret_key), + &message, + &signature, ) + .unwrap(); } #[proptest] @@ -136,16 +133,13 @@ mod test { CasperSecretKey::ed25519_from_bytes([0u8; CasperSecretKey::ED25519_LENGTH]).unwrap(); let message = "this shouldn't work for the good public key"; let bad_signature = sign(&bad_secret_key, message); - assert_eq!( - verify( - &CasperPublicKey::from(&bad_secret_key), - message, - &bad_signature - ) - .unwrap(), - (), - "Bad secret key should be able to verify its own signature" - ); + verify( + &CasperPublicKey::from(&bad_secret_key), + message, + &bad_signature, + ) + .unwrap_or_else(|_| panic!("Bad secret key should be able to verify its own signature")); + let good_public_key = CasperPublicKey::from( &CasperSecretKey::ed25519_from_bytes([1u8; CasperSecretKey::ED25519_LENGTH]).unwrap(), ); @@ -163,16 +157,14 @@ mod test { .unwrap(); let message = "this shouldn't work for the good public key"; let bad_signature = sign(&bad_secret_key, message); - assert_eq!( - verify( - &CasperPublicKey::from(&bad_secret_key), - message, - &bad_signature - ) - .unwrap(), - (), - "Bad secret key should be able to verify its own signature" - ); + + verify( + &CasperPublicKey::from(&bad_secret_key), + message, + &bad_signature, + ) + .unwrap_or_else(|_| panic!("Bad secret key should be able to verify its own signature")); + let good_public_key = CasperPublicKey::from( &CasperSecretKey::secp256k1_from_bytes([2u8; CasperSecretKey::SECP256K1_LENGTH]) .unwrap(), @@ -197,12 +189,12 @@ mod test { fn should_not_verify_different_signature_schemes() { let message = "should not work because the signatures are different types"; let secret_bytes = [1u8; 32]; - let ed25519_secret_key = CasperSecretKey::ed25519_from_bytes(&secret_bytes).unwrap(); + let ed25519_secret_key = CasperSecretKey::ed25519_from_bytes(secret_bytes).unwrap(); let secp256k1_public_key = - CasperPublicKey::from(&CasperSecretKey::secp256k1_from_bytes(&secret_bytes).unwrap()); - let ed25519_signature = sign(&ed25519_secret_key, &message); + CasperPublicKey::from(&CasperSecretKey::secp256k1_from_bytes(secret_bytes).unwrap()); + let ed25519_signature = sign(&ed25519_secret_key, message); assert!( - verify(&secp256k1_public_key, &message, &ed25519_signature).is_err(), + verify(&secp256k1_public_key, message, &ed25519_signature).is_err(), "should not verify different types of public keys and signatures" ) } diff --git a/src/hash.rs b/src/hash.rs index 9c1bc2c..439fe21 100644 --- a/src/hash.rs +++ b/src/hash.rs @@ -8,7 +8,8 @@ const CHUNK_SIZE_BYTES: usize = 8 * 1024 * 1024; const CHUNK_DATA_ZEROED: [u8; CHUNK_SIZE_BYTES] = [0u8; CHUNK_SIZE_BYTES]; #[derive(Clone, Default, Ord, PartialOrd, Eq, PartialEq, Hash, Debug)] -// See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/hashing/src/lib.rs#L48 +// For 1.* See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/hashing/src/lib.rs#L48 +// For casper 2.0 rc4 see https://github.com/casper-network/casper-node/blob/4e2ddf485e5cec830f9ff402b052f5f55801eb54/types/src/digest.rs#L54 #[cfg_attr(test, derive(proptest_derive::Arbitrary))] pub struct Digest([u8; DIGEST_LENGTH]); @@ -130,14 +131,12 @@ impl serde::Serialize for Digest { impl<'de> serde::Deserialize<'de> for Digest { fn deserialize>(deserializer: D) -> Result { - let bytes: Vec; - - if deserializer.is_human_readable() { + let bytes: Vec = if deserializer.is_human_readable() { let hex_string = String::deserialize(deserializer)?; - bytes = base16::decode(hex_string.as_bytes()).map_err(serde::de::Error::custom)?; + base16::decode(hex_string.as_bytes()).map_err(serde::de::Error::custom)? } else { - bytes = >::deserialize(deserializer)?; - } + >::deserialize(deserializer)? + }; let data = <[u8; DIGEST_LENGTH]>::try_from(bytes.as_ref()).map_err(serde::de::Error::custom)?; @@ -158,7 +157,7 @@ mod test { #[proptest] fn serde_json_digest_round_trip(timestamp: Digest) { let serialized_digest = serde_json::to_string(×tamp).unwrap(); - let casper_hashing_digest: casper_hashing::Digest = + let casper_hashing_digest: casper_types::Digest = serde_json::from_str(&serialized_digest).unwrap(); let serialized_casper_hashing_digest = serde_json::to_string(&casper_hashing_digest).unwrap(); @@ -171,7 +170,7 @@ mod test { #[proptest] fn bincode_timestamp_round_trip(timestamp: Digest) { let serialized_timestamp = bincode::serialize(×tamp).unwrap(); - let casper_types_timestamp: casper_hashing::Digest = + let casper_types_timestamp: casper_types::Digest = bincode::deserialize(&serialized_timestamp).unwrap(); let serialized_casper_types_timestamp = bincode::serialize(&casper_types_timestamp).unwrap(); @@ -184,7 +183,7 @@ mod test { #[proptest] fn bytesrepr_digest_round_trip(digest: Digest) { let serialized_digest = digest.to_bytes().unwrap(); - let casper_hashing_digest: casper_hashing::Digest = + let casper_hashing_digest: casper_types::Digest = deserialize_from_slice(&serialized_digest).unwrap(); let serialized_casper_hashing_digest = casper_hashing_digest.to_bytes().unwrap(); let deserialized_digest: Digest = @@ -195,7 +194,7 @@ mod test { #[proptest] fn hashing_agrees_with_casper_hashing(data: Vec) { let digest = Digest::hash(&data); - let casper_digest = casper_hashing::Digest::hash(&data); + let casper_digest = casper_types::Digest::hash(&data); assert_eq!( <[u8; DIGEST_LENGTH]>::from(digest), <[u8; DIGEST_LENGTH]>::from(casper_digest) diff --git a/src/json_compatibility.rs b/src/json_compatibility.rs index faa9954..4ae6757 100644 --- a/src/json_compatibility.rs +++ b/src/json_compatibility.rs @@ -7,11 +7,11 @@ use serde::{Deserialize, Serialize}; use crate::{ block::{ - Block, BlockBody, BlockConstructionError, BlockHeaderWithSignatures, + Block, BlockBodyV1, BlockConstructionError, BlockHeaderWithSignatures, BlockHeaderWithSignaturesConstructionError, BlockSignatures, }, - block_header::{BlockHash, BlockHeader, Timestamp}, - consensus::{EraEnd, EraReport}, + block_header::{BlockHash, BlockHeaderV1, Timestamp}, + consensus::{EraEndV1, EraReport}, crypto::SignatureVerificationError, hash::Digest, }; @@ -82,10 +82,7 @@ impl From for JsonEraReport { } = era_report; let rewards = rewards .into_iter() - .map(|(validator, amount)| Reward { - validator: validator, - amount: amount, - }) + .map(|(validator, amount)| Reward { validator, amount }) .collect(); JsonEraReport { equivocators, @@ -131,8 +128,8 @@ impl JsonEraEnd { } } -impl From for JsonEraEnd { - fn from(era_end: EraEnd) -> Self { +impl From for JsonEraEnd { + fn from(era_end: EraEndV1) -> Self { let era_report = JsonEraReport::from(era_end.era_report); let next_era_validator_weights = era_end .next_era_validator_weights @@ -149,7 +146,7 @@ impl From for JsonEraEnd { } } -impl From for EraEnd { +impl From for EraEndV1 { fn from(json_data: JsonEraEnd) -> Self { let era_report = EraReport::from(json_data.era_report); let next_era_validator_weights = json_data @@ -157,7 +154,7 @@ impl From for EraEnd { .iter() .map(|validator_weight| (validator_weight.validator.clone(), validator_weight.weight)) .collect(); - EraEnd { + EraEndV1 { era_report, next_era_validator_weights, } @@ -222,8 +219,8 @@ impl JsonBlockHeader { } } -impl From for JsonBlockHeader { - fn from(block_header: BlockHeader) -> Self { +impl From for JsonBlockHeader { + fn from(block_header: BlockHeaderV1) -> Self { JsonBlockHeader { parent_hash: block_header.parent_hash().clone(), state_root_hash: block_header.state_root_hash().clone(), @@ -239,7 +236,7 @@ impl From for JsonBlockHeader { } } -impl From for BlockHeader { +impl From for BlockHeaderV1 { fn from(block_header: JsonBlockHeader) -> Self { let JsonBlockHeader { parent_hash, @@ -253,8 +250,8 @@ impl From for BlockHeader { height, protocol_version, } = block_header; - let era_end = era_end.map(EraEnd::from); - BlockHeader::new( + let era_end = era_end.map(EraEndV1::from); + BlockHeaderV1::new( parent_hash, state_root_hash, body_hash, @@ -308,7 +305,7 @@ impl From for (PublicKey, Signature) { pub struct JsonBlock { hash: BlockHash, header: JsonBlockHeader, - body: BlockBody, + body: BlockBodyV1, proofs: Vec, } @@ -321,7 +318,7 @@ impl JsonBlock { &self.header } - pub fn body(&self) -> &BlockBody { + pub fn body(&self) -> &BlockBodyV1 { &self.body } @@ -342,8 +339,8 @@ impl From for JsonBlock { .block_header_with_signatures() .block_signatures() .proofs() - .into_iter() - .map(|(pubkey, signature)| JsonProof::from((pubkey.clone(), signature.clone()))) + .iter() + .map(|(pubkey, signature)| JsonProof::from((pubkey.clone(), *signature))) .collect(); JsonBlock { hash, @@ -379,7 +376,7 @@ impl TryFrom for Block { body, proofs, } = json_block; - let block_header = BlockHeader::from(header); + let block_header = BlockHeaderV1::from(header); let header_hash = block_header.block_hash(); if block_hash != header_hash { return Err(JsonBlockConversionError::InvalidBlockHash { @@ -405,7 +402,7 @@ impl TryFrom for Block { } let header = BlockHeaderWithSignatures::new(block_header, block_signatures) .map_err(JsonBlockConversionError::BlockHeaderWithSignaturesConstructionError)?; - Ok(Block::new(header, body).map_err(JsonBlockConversionError::BlockConstructionError)?) + Block::new(header, body).map_err(JsonBlockConversionError::BlockConstructionError) } } @@ -416,8 +413,8 @@ mod test { use test_strategy::proptest; use crate::{ - block_header::BlockHeader, - consensus::{EraEnd, EraReport}, + block_header::BlockHeaderV1, + consensus::{EraEndV1, EraReport}, }; use super::{JsonBlockHeader, JsonEraEnd, JsonEraReport}; @@ -430,16 +427,16 @@ mod test { } #[proptest] - fn era_end_round_trip(era_end: EraEnd) { + fn era_end_round_trip(era_end: EraEndV1) { let json_era_end = JsonEraEnd::from(era_end.clone()); - let round_trip_era_end = EraEnd::from(json_era_end); + let round_trip_era_end = EraEndV1::from(json_era_end); assert_eq!(era_end, round_trip_era_end); } #[proptest] - fn block_header_round_trip(block_header: BlockHeader) { + fn block_header_round_trip(block_header: BlockHeaderV1) { let json_block_header = JsonBlockHeader::from(block_header.clone()); - let round_trip_block_header = BlockHeader::from(json_block_header); + let round_trip_block_header = BlockHeaderV1::from(json_block_header); assert_eq!(block_header, round_trip_block_header); } } diff --git a/src/kernel.rs b/src/kernel.rs index 1af6c6f..989888a 100644 --- a/src/kernel.rs +++ b/src/kernel.rs @@ -39,7 +39,6 @@ impl EraInfo { pub fn new(era_id: EraId, validator_weights: BTreeMap) -> Self { let total_weight = validator_weights .values() - .into_iter() .fold(U512::from(0), |acc, x| acc + x); Self { era_id, @@ -52,6 +51,7 @@ impl EraInfo { self.era_id } + #[allow(clippy::result_large_err)] pub fn validate( &self, block_header_with_signatures: &BlockHeaderWithSignatures, @@ -88,7 +88,7 @@ impl EraInfo { } Err(BlockSignaturesValidationError::InsufficientWeight { bad_signature_weight: block_signature_weight, - total_weight: self.total_weight.clone(), + total_weight: self.total_weight, }) } } @@ -140,6 +140,7 @@ impl LightClientKernel { } } + #[allow(clippy::result_large_err)] pub fn update( &mut self, block_header_with_signatures: &BlockHeaderWithSignatures, diff --git a/src/merkle_proof.rs b/src/merkle_proof.rs index 734451d..8f901ee 100644 --- a/src/merkle_proof.rs +++ b/src/merkle_proof.rs @@ -93,6 +93,12 @@ pub type PointerBlockArray = [PointerBlockValue; RADIX]; #[cfg_attr(test, derive(proptest_derive::Arbitrary))] pub struct PointerBlock(PointerBlockArray); +impl Default for PointerBlock { + fn default() -> Self { + Self::new() + } +} + impl PointerBlock { pub fn new() -> Self { PointerBlock([ @@ -460,7 +466,7 @@ impl Arbitrary for TrieMerkleProof { proptest::collection::vec(::arbitrary(), 1..=6), ) .prop_map(|(key, value, proof_steps)| { - TrieMerkleProof::new(key, value, proof_steps.into()) + TrieMerkleProof::new(key, value, proof_steps) }) .boxed() } @@ -535,11 +541,11 @@ impl<'a, 'b> QueryInfo<'a, 'b> { } pub fn key(&self) -> &'a Key { - &self.key + self.key } pub fn stored_value(&self) -> &'b StoredValue { - &self.stored_value + self.stored_value } } @@ -594,7 +600,7 @@ pub fn process_query_proofs<'a>( mod test { extern crate std; - use casper_execution_engine::storage::trie::merkle_proof::TrieMerkleProof as CasperTrieMerkleProof; + use casper_types::global_state::TrieMerkleProof as CasperTrieMerkleProof; use casper_types::{bytesrepr::ToBytes, Key, StoredValue}; use test_strategy::proptest; @@ -626,10 +632,14 @@ mod test { casper_types::bytesrepr::deserialize(serialized_trie_merkle_proof.clone()).unwrap(); let trie_merkle_root_bytes: [u8; DIGEST_LENGTH] = trie_merkle_proof.compute_state_hash().unwrap().into(); - let casper_trie_merkle_root_bytes: [u8; DIGEST_LENGTH] = casper_trie_merkle_proof - .compute_state_hash() + + let casper_trie_merkle_root_bytes: [u8; DIGEST_LENGTH] = + casper_storage::global_state::trie_store::operations::compute_state_hash( + &casper_trie_merkle_proof, + ) .unwrap() .into(); + assert_eq!(trie_merkle_root_bytes, casper_trie_merkle_root_bytes); } } diff --git a/tests/integration.rs b/tests/integration.rs index 77afb95..37620b0 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -1,8 +1,8 @@ use std::collections::BTreeMap; use casper_litmus::{ - block::{Block, BlockBody}, - block_header::BlockHeader, + block::{Block, BlockBodyV1}, + block_header::BlockHeaderV1, json_compatibility::{JsonBlock, JsonBlockHeader}, kernel::LightClientKernel, merkle_proof::{process_query_proofs, TrieMerkleProof}, @@ -50,33 +50,36 @@ fn first_entry_in_blocks_map_is_correct() { fn json_block_header_round_trip() { let json_block: JsonBlock = serde_json::from_str(include_str!("assets/blocks/block-0.json")).unwrap(); - let converted_block_header = BlockHeader::from(json_block.header().clone()); + let converted_block_header = BlockHeaderV1::from(json_block.header().clone()); let reconstituted_json_block_header = JsonBlockHeader::from(converted_block_header.clone()); assert_eq!(json_block.header(), &reconstituted_json_block_header); } #[test] fn parse_and_validate_hash_of_block() { - let casper_node_json_block: casper_node::types::JsonBlock = + let casper_node_json_block: serde_json::Value = serde_json::from_str(include_str!("mainnet/blocks/block-0.json")).unwrap(); - let casper_node_block_header = - casper_node::types::BlockHeader::from(casper_node_json_block.header.clone()); + + let casper_node_block: casper_types::BlockV1 = + serde_json::from_value(casper_node_json_block.clone()).unwrap(); + + let casper_node_block_header = casper_node_block.header(); assert_eq!( casper_node_block_header.block_hash().as_ref(), - casper_node_json_block.hash.as_ref(), + casper_node_block.hash().as_ref(), "Casper node block hash mismatch" ); let block_header_bytes = casper_node_block_header.to_bytes().unwrap(); - let deserialized_block_header: BlockHeader = + let deserialized_block_header: BlockHeaderV1 = deserialize_from_slice(&block_header_bytes).unwrap(); assert_eq!( deserialized_block_header.block_hash().as_ref(), - casper_node_json_block.hash.as_ref(), + casper_node_block.hash().as_ref(), "JSON block hash mismatch" ); let json_block: JsonBlock = serde_json::from_str(include_str!("mainnet/blocks/block-0.json")).unwrap(); - let converted_block_header = BlockHeader::from(json_block.header().clone()); + let converted_block_header = BlockHeaderV1::from(json_block.header().clone()); assert_eq!( deserialized_block_header, converted_block_header, "Block header mismatch" @@ -85,25 +88,28 @@ fn parse_and_validate_hash_of_block() { #[test] fn parse_and_validate_hash_of_block_body() { - let casper_node_json_block: casper_node::types::JsonBlock = + let casper_node_json_block: serde_json::Value = serde_json::from_str(include_str!("mainnet/blocks/block-0.json")).unwrap(); - let casper_node_block_body = - casper_node::types::BlockBody::from(casper_node_json_block.body.clone()); + let casper_node_block_body: casper_types::BlockBodyV1 = + serde_json::from_value(casper_node_json_block["body"].clone()).unwrap(); + let body_hash: casper_types::Digest = + serde_json::from_value(casper_node_json_block["header"]["body_hash"].clone()).unwrap(); + assert_eq!( casper_node_block_body.hash().as_ref(), - casper_node_json_block.header.body_hash.as_ref(), + body_hash.as_ref(), "Casper node block body hash mismatch" ); let block_body_bytes = casper_node_block_body.to_bytes().unwrap(); - let deserialized_block_body: BlockBody = deserialize_from_slice(&block_body_bytes).unwrap(); + let deserialized_block_body: BlockBodyV1 = deserialize_from_slice(&block_body_bytes).unwrap(); assert_eq!( deserialized_block_body.hash().as_ref(), - casper_node_json_block.header.body_hash.as_ref(), + body_hash.as_ref(), "JSON block body hash mismatch" ); let json_block: JsonBlock = serde_json::from_str(include_str!("mainnet/blocks/block-0.json")).unwrap(); - let converted_block_body = BlockBody::from(json_block.body().clone()); + let converted_block_body = json_block.body().clone(); assert_eq!( deserialized_block_body, converted_block_body, "Block body mismatch" @@ -146,7 +152,7 @@ fn query_proofs() { if let casper_types::StoredValue::Account(account) = query_info.stored_value() { assert_eq!( "account-hash-c39d7a6202e5558ffbf327985c55a95f606db48115599a216987b73daf409076", - serde_json::to_value(&account.account_hash()) + serde_json::to_value(account.account_hash()) .expect("should convert to serde_json::Value") .as_str() .expect("should be a string"), From f18ef7a168b1ad1b3b6b2e2fc8a4fcb1848d54be Mon Sep 17 00:00:00 2001 From: Avi Dessauer Date: Mon, 16 Sep 2024 19:20:32 -0700 Subject: [PATCH 02/12] Update casper to feat-2.0 branch, delete 1.0 tests --- Cargo.toml | 9 +- tests/integration.rs | 78 +----- tests/mainnet/blocks/block-0.json | 424 ------------------------------ 3 files changed, 5 insertions(+), 506 deletions(-) delete mode 100644 tests/mainnet/blocks/block-0.json diff --git a/Cargo.toml b/Cargo.toml index 55d454d..c7f8f02 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] base16 = { version = "0.2.1", default-features = false, features = ["alloc"] } blake2b_simd = { version = "1.0.2", default-features = false } -casper-types = { git = "https://github.com/casper-network/casper-node.git", branch = "release-2.0.0-rc4" } +casper-types = { git = "https://github.com/casper-network/casper-node.git", branch = "feat-2.0" } ed25519-dalek = { version = "2.0.0", default-features = false, features = [ "alloc", "zeroize", @@ -27,10 +27,9 @@ time = { version = "0.3.31", default-features = false, features = [ [dev-dependencies] bincode = "1.3.3" # casper-hashing = "3.0.0" -casper-execution-engine = { git = "https://github.com/casper-network/casper-node.git", branch = "release-2.0.0-rc4" } -casper-types = { git = "https://github.com/casper-network/casper-node.git", branch = "release-2.0.0-rc4", features = ["gens"] } -casper-node = { git = "https://github.com/casper-network/casper-node.git", branch = "release-2.0.0-rc4" } -casper-storage = { git = "https://github.com/casper-network/casper-node.git", branch = "release-2.0.0-rc4" } +casper-execution-engine = { git = "https://github.com/casper-network/casper-node.git", branch = "feat-2.0" } +casper-types = { git = "https://github.com/casper-network/casper-node.git", branch = "feat-2.0", features = ["gens"] } +casper-storage = { git = "https://github.com/casper-network/casper-node.git", branch = "feat-2.0" } hex = "0.4.3" once_cell = "1.19.0" serde_json = "1.0.111" diff --git a/tests/integration.rs b/tests/integration.rs index 37620b0..d528743 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -1,7 +1,7 @@ use std::collections::BTreeMap; use casper_litmus::{ - block::{Block, BlockBodyV1}, + block::Block, block_header::BlockHeaderV1, json_compatibility::{JsonBlock, JsonBlockHeader}, kernel::LightClientKernel, @@ -31,21 +31,6 @@ static BLOCKS_MAP: Lazy> = Lazy::new(|| { blocks }); -#[test] -fn parse_block() { - let json_block: JsonBlock = - serde_json::from_str(include_str!("assets/blocks/block-0.json")).unwrap(); - assert_eq!(json_block.header().era_id(), EraId::new(0)); -} - -#[test] -fn first_entry_in_blocks_map_is_correct() { - let first_block = BLOCKS_MAP.get(&0).unwrap(); - let json_block: JsonBlock = - serde_json::from_str(include_str!("assets/blocks/block-0.json")).unwrap(); - assert_eq!(first_block, &json_block); -} - #[test] fn json_block_header_round_trip() { let json_block: JsonBlock = @@ -55,67 +40,6 @@ fn json_block_header_round_trip() { assert_eq!(json_block.header(), &reconstituted_json_block_header); } -#[test] -fn parse_and_validate_hash_of_block() { - let casper_node_json_block: serde_json::Value = - serde_json::from_str(include_str!("mainnet/blocks/block-0.json")).unwrap(); - - let casper_node_block: casper_types::BlockV1 = - serde_json::from_value(casper_node_json_block.clone()).unwrap(); - - let casper_node_block_header = casper_node_block.header(); - assert_eq!( - casper_node_block_header.block_hash().as_ref(), - casper_node_block.hash().as_ref(), - "Casper node block hash mismatch" - ); - let block_header_bytes = casper_node_block_header.to_bytes().unwrap(); - let deserialized_block_header: BlockHeaderV1 = - deserialize_from_slice(&block_header_bytes).unwrap(); - assert_eq!( - deserialized_block_header.block_hash().as_ref(), - casper_node_block.hash().as_ref(), - "JSON block hash mismatch" - ); - let json_block: JsonBlock = - serde_json::from_str(include_str!("mainnet/blocks/block-0.json")).unwrap(); - let converted_block_header = BlockHeaderV1::from(json_block.header().clone()); - assert_eq!( - deserialized_block_header, converted_block_header, - "Block header mismatch" - ); -} - -#[test] -fn parse_and_validate_hash_of_block_body() { - let casper_node_json_block: serde_json::Value = - serde_json::from_str(include_str!("mainnet/blocks/block-0.json")).unwrap(); - let casper_node_block_body: casper_types::BlockBodyV1 = - serde_json::from_value(casper_node_json_block["body"].clone()).unwrap(); - let body_hash: casper_types::Digest = - serde_json::from_value(casper_node_json_block["header"]["body_hash"].clone()).unwrap(); - - assert_eq!( - casper_node_block_body.hash().as_ref(), - body_hash.as_ref(), - "Casper node block body hash mismatch" - ); - let block_body_bytes = casper_node_block_body.to_bytes().unwrap(); - let deserialized_block_body: BlockBodyV1 = deserialize_from_slice(&block_body_bytes).unwrap(); - assert_eq!( - deserialized_block_body.hash().as_ref(), - body_hash.as_ref(), - "JSON block body hash mismatch" - ); - let json_block: JsonBlock = - serde_json::from_str(include_str!("mainnet/blocks/block-0.json")).unwrap(); - let converted_block_body = json_block.body().clone(); - assert_eq!( - deserialized_block_body, converted_block_body, - "Block body mismatch" - ); -} - #[test] fn update_kernel_one() { let mut kernel = LightClientKernel::new(BLOCKS_MAP.get(&0).unwrap().hash().clone()); diff --git a/tests/mainnet/blocks/block-0.json b/tests/mainnet/blocks/block-0.json deleted file mode 100644 index f015aee..0000000 --- a/tests/mainnet/blocks/block-0.json +++ /dev/null @@ -1,424 +0,0 @@ -{ - "hash": "7494328c5d331695cf6abe2c90a0dfd509057a108462ea62b4d3ec9d2e9fbc1b", - "header": { - "parent_hash": "e2992f47bb06ab92c91d80fb752dd9f2bc40a45ff9de757965c11ad5f9073387", - "state_root_hash": "21c9c31dbb4b11324d7aa53548413316a6dfce583879d29363bd7c4694fe5477", - "body_hash": "efe6cf07ecd309a550e013187999134a495fa0b5b84909c1cfba31a0bfd1249f", - "random_bit": false, - "accumulated_seed": "b51adfc73bbd40950663bba73f23694cf671f46abfce6a7fc4156a72b90c7c20", - "era_end": null, - "timestamp": "2024-03-12T21:08:42.112Z", - "era_id": 12774, - "height": 2742283, - "protocol_version": "1.5.6" - }, - "body": { - "proposer": "0106ca7c39cd272dbf21a86eeb3b36b7c26e2e9b94af64292419f7862936bca2ca", - "deploy_hashes": [ - "bd0b76a1d969a4560bfa26fef94a78192a72ad7346bc12537d5185eeec96c810" - ], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "0100e3cb74e8feb5f27b6f69ff3b57aedd7201f52480b0ab0d6a2813d8e7cd32d7", - "signature": "013c8ff99c7d50e94faca7a553dcef20eb9e859062cc9e0f4a195171b9a44237607b506c8494d91f6e9cc138630ee37c2dea4669516b4d2e541a1065340487a20e" - }, - { - "public_key": "01018525deae6091abccab6704a0fa44e12c495eec9e8fe6929862e1b75580e715", - "signature": "0172eb050136ac7955a252be89215d995a53993ef149bd3b3f4d05085f957e5bee47a749bf44ba31fd480c8b74998d0691ec4f3a242941cf910a262e4407693807" - }, - { - "public_key": "0102ba1de25e8737b48076e96d9933e9d26f7dc279127de2ffc191ffd3b4eb8b4d", - "signature": "01087e3898b49f43dd03bd27e2dcedc95465cc59e95303eeb0c4b41e71959898782467c38da406bfd7641a0fdd20fa4ae2ef1febf57f46c7c6b68602659e56af00" - }, - { - "public_key": "0106618e1493f73ee0bc67ffbad4ba4e3863b995d61786d9b9a68ec7676f697981", - "signature": "01121d21b4b28d59e69aa4d119a48aa391e8a01346cbd9dbf007b4f59616bc0ee6f784378f6554483158ecd4afe8d5fbf3d0f319a714655c0bccd144b97082f806" - }, - { - "public_key": "0106ca7c39cd272dbf21a86eeb3b36b7c26e2e9b94af64292419f7862936bca2ca", - "signature": "01f8d9e94723c4827f22d247454b83daf06ac613d1f2dd3d31ab50b26b69e7afdfa2c75cc7892dd06f85a054e199121dec9445920ddbd5113a3c70e9805c214c07" - }, - { - "public_key": "01075ec8809c691a1d1b0250ba9ea75da5460e3df43c3172771c6975c989457159", - "signature": "010411ad89ca43792985a8b989b6f2cdaf6f3f6907b9d7622e9cf8318c1dcd75bac5dcd0507c81b5d115aa6fa3935b2b42a0451de17f276392a074f9e1befe6a01" - }, - { - "public_key": "0109b48a169e6163078a07b6248f330133236c6e390fe915813c187c3f268c213e", - "signature": "01a18929f43b08f84bca65e90f0e7a426169636c262fb8439292a3080259f5affd67fdf658fa2f8b0e92a34ec66335752ac0c487c0aca7127c3f3dbd444654700c" - }, - { - "public_key": "010e5669b070545e2b32bc66363b9d3d4390fca56bf52a05f1411b7fa18ca311c7", - "signature": "017ec9190b3f10b7b5f0b3d0a5656577806afd03c6ab464fc7428d1ee66402897270423448cc5339fbe14c53a38342539b3a794065f703296108f33342be93070f" - }, - { - "public_key": "01101ef8635fb189ae3c734ca699dcbb97f7f844b9b96f260642a734b85d4c1c85", - "signature": "0158d9e35af1daa0e49c206e8f4483eb55ac21e21167e95dedb3ae3b03867f4f26bf2fe6c897ff6672f930422265edf4be39d05192c8135d9ad21cd0d2d1123901" - }, - { - "public_key": "0110b5a63ba0279423ddbf60164a37b581880167437cce225ab00ff62782904e4b", - "signature": "016b849c6e8a0812f6536878bde95be683154239cf21327d1ef8dc3bb85387da44031f9d3d00d88de8385e1843de1cb18eaf44b1ec00b19230abf019a451af8104" - }, - { - "public_key": "01125eb55aa8cb1561df502cc99339c9fe9fc8fa5cb8950243d66d6f66f8f1c03b", - "signature": "016f5323d22c40f7f425febbab993941aa876d8bc3193848c0b0187e6147b4ba7915e6e749d758a45762745d8b05aee6ab7caaa0338dc0a322592baf679640b60c" - }, - { - "public_key": "011691f57529dd47a82530ad9c4a60f5efd993dd3f3e582fd2f775fb1a79c6d955", - "signature": "010222c51677039ba053fea17c16b2b33d0bb71a62a0a32431f694a6d97448420f4b2073e338b741f6600b44f53b615068b67197c797f8c89fcb80e481cf63cf0f" - }, - { - "public_key": "011fbadf1d9d7f8246c36647722423690bc9b28e438d3f08f85bab006771ba2229", - "signature": "0122b19365f999ede7c0a44af5629003968f5aafb9830d3b28418dbe799f5d1007d2ca061ff126c7b87bca83c6e614f4bacdd8950fa6a19cd1719127e4de55af07" - }, - { - "public_key": "0120117923f323fbecec03f6761fcd8df5d967b36a10aaefb1efad636afed60a85", - "signature": "01652508356e31557019953f6ee1e9e58383b5e8ddd983d29ef7513c9efda46e6cf6f7f457f0aa0b6bc7c725d14b8f2981fdc42208577ef89bfff100a0e1744006" - }, - { - "public_key": "0128d6b2c3ccda8e674f73ccf57b6b20a23b5e4439634071c9361992c679a94ab6", - "signature": "0144a2f4a6be0c4c9c14c488605351f42888da91e07fa0c362e69895040282bc8617271dc9a84f3e270fda612cfdd046519c024f942b695bea0faad1d079981b07" - }, - { - "public_key": "012b365e09c5d75187b4abc25c4aa28109133bab6a256ef4abe24348073e590d80", - "signature": "0185c3de0b3f68b779071eeed510765a9cf9b15ec6140dc487abef7be3d47f1e3a37b5836444c64edd31a5f76909d2b8cc4c8f1485727c402430fd10950111f60a" - }, - { - "public_key": "012d58e05b2057a84115709e0a6ccf000c6a83b4e8dfa389a680c1ab001864f1f2", - "signature": "01c18d0dc7093e7e141dfa59695192859714ccc353d2d1d728afe308392a6d969d198e3418f52481b0c03a226f571395578024447b8a92d15ac45b45372e73d504" - }, - { - "public_key": "012dad6e750391c0d12891afa4f27386a1adfd118068b396165ad8eb9f6a85f1e5", - "signature": "01a4ff22d9d93c71fbd35971af0e067c41ee813849d7d5385225285896c519a788bb0dd28d2ba8dadbb4e4d0cbd5c286888bab07f58a85285e6112dceb7be4ea0d" - }, - { - "public_key": "01309f108cab2d5b62defdc7c031c8c6e4f1c8094effeeab155a0a944ef5890fce", - "signature": "018e7b2962274e071f16f9769ba5157252ae6527c8210190ecde03c248ecb61fc8d8b952c0806746e9a107a91250213d3a40d20a94e62349ec63d346d0aec4cc09" - }, - { - "public_key": "01358a7e107668ae2eb092dcfbeb97d2ec3cc8354d2a77bc8f232fff6630a826c3", - "signature": "016eece425b924072efc6abbfd8dd2a785d8552af301602ee107b48af510de04666305f09893024af1e2b7950711337f43e325170196dd1a42e9c30c099e899908" - }, - { - "public_key": "013941026c5347ca9eb6ddfdad57d2c305c21108b2f3d97a6bb6e52440a1be9664", - "signature": "01d7f2e9137ca7375c60a593f3d9c9b3e41ba482e30475b4b7c4c8a8a9689c7058f96a9ad776cf7218be8d5d3d0ae0325df8b8bf5b7dfd24177cfe7d12ede1bc0c" - }, - { - "public_key": "013fab19aaf6a5a4ce4adeab0f5a9f16e3e977521ca6edb846122a8913a2b5c2b8", - "signature": "01993f0ac14ae98c6cdbd8e6c5aed755acd1a878c1aeee02fd3ebe1b32c2e3902ec2919b930058f2305a6002684e928032fb8a2a79c606770c05d7318e50559f05" - }, - { - "public_key": "01421fb44078c2eb8d7d3414b81d4d9e81b49983eb96644a9978782b9aab0468b4", - "signature": "010f759e86265bf08f5cc58cfca561fb8b6a265dd23e9709c5f77930962c6b858acb511c54f9b06f0f2351b5409f78feec354633e8acf776134231a54c12133306" - }, - { - "public_key": "0142c89726fb2feef762b07e9c89c25a1bb6d336039d6f70d7e90701e8dfa042f9", - "signature": "015298c8285248ff30af364ec75942ca284b13620dcf801e430f3a84137d1ddc8776652084d21dfc98c1ded9ee506d4d9986dc94b3421dc343764f2c8b68067a0d" - }, - { - "public_key": "0144e35abc4886168a53338539a8a3649ab1257d9f0c235ce38961624a025d40dd", - "signature": "0140d9fffdb3b5c8eddfcb4be39114b40b6f5bfe7be44f92276eabbba7d422c89a1cec0d1064e8945754232c0075358e1191111d7ce156c3354b0685dacc090001" - }, - { - "public_key": "0145fb72c75e1b459839555d70356a5e6172e706efa204d86c86050e2f7878960f", - "signature": "01ba712be93c41cc6a5b93c798d1fba48bba620911af2000fbfa6c7ab5c585595e75d9604a5b17de8202e8581f51b9d896c31add5f28b55eb713a53810e312030b" - }, - { - "public_key": "0146389ae32053b98ca99efcb06df6e79560abc4a75a088794d2c9920ba3618159", - "signature": "019f32a7e341690ef532e8b3917fa8a0dde1e1200600a42f7560debdd76f10a283a455f2af07c4ba391f4b47d6a94c17a196ed1ae5f9b00a4f244586fc95346805" - }, - { - "public_key": "0148d2b4f68adf837cb06f08925ed4d30aa830cc66b88533d38adefdd66b4d51c5", - "signature": "0161dc87cff7f85b5678b33a19474f4d5a4c7606daa741b04ef621fb302e2f560768a449c91d744c6a79fef722502fd26d9bbacf12cb8827766b347320289c210d" - }, - { - "public_key": "0148d7e78359ee29d8250ecab3865e8ef72381f3fc606f0b6202d393a358e8d537", - "signature": "01e04ac8dae4f873d5b27ec2131237079be6c4cf6d9d7389bd1be3a8a9a13108b73427636f9565607a415672b8a298b37e8ed7bc95c161decd092eb675a3d14d05" - }, - { - "public_key": "014cc13f0164ae8317311a856d5539ce8342930a3d0a6d1fe3cac0c5436206427e", - "signature": "01d3ca4bcf143123de7db07fddcdd86b733db0d55d06b5c1e49da4dc51f684b8ea985fa4e93e9b0fa0e9f6973c0cafb7d0d5b0036db85b70564f19c4215f82eb05" - }, - { - "public_key": "014fa95d1e60f8a5af1e4118aa14011c61b05847b32548aa0e0419f2daf09c8923", - "signature": "017e98fd4737e41240c21d6b60529d73566b25466ca613715e7e87bfdf033ae6867105cfc2a7f69b59aa99574152962e3b233a3f84536accd6f254cd0b762b3c01" - }, - { - "public_key": "0154a09e1ecc084b3e972d98ea67bb86f154cb5ac3ab04d9a3853f85c557b4af20", - "signature": "01c09250eb247a39386ed28ce4c97ddb99620f65b1f60ed947aefc2cf2cb5fbf28e9a243102ccd3e1d36128b935db634c650994bb270dc0442171999531b6ab90f" - }, - { - "public_key": "0154d7afd43a7b1033259f7a1675edbc3e1c998927d6835e045e7d57e64cabfb32", - "signature": "0124e9fc164aa5ea58726aa70769abde6d7f6f04d9c15e5c4e852237b6b61615cbbb97045da5e1a8b36e02d6c56adbf50e5d7c4da366ac9da41260f8ab561e3502" - }, - { - "public_key": "0154e5b45eaade5fc8f0afd45624e4b69973d999b42292ca1993d323c98e067732", - "signature": "01a4a7f38803f22363bad006047c3d9f8b1b65921bb24aa1a3df92ba7d31ed4ff27b239b545306cb8d08d31259a9180f6a099ae0d4fddac22facd6599eda77e70f" - }, - { - "public_key": "01567348f4bd7819db883dafe50d0b13d90382d00e02255370db131584fc180de6", - "signature": "0192ce27f485adbd614fe7b0ae496c51acba74e70299c42ad266eddb9468e7f46b663683b616514ce2b2cfa75d1084838c290f29f29d6f8532e5d5350f669a9404" - }, - { - "public_key": "0158a3a7e14ecabb01486e4b3b379afbe95ca00225f754d3e4ecf70422f67470af", - "signature": "01e81986324683b8d4cc491af6096b9531d82ee91febce11423641b881c8e6dbcd5f257f44cdc953f0374e0d60b11a57843d0f4c169295843604fbe7c4c89fef04" - }, - { - "public_key": "0158ed3b452164d0f79e65e05cec9052f6b0acb6c470159bd9ed41037bd20c0100", - "signature": "01fb83d24f70dbd1f5c3777f38b8b110f06117d76fdf2e7b1cf94e589445d8341d58eb056794239a902c9731d5c0e81b1d01f67760fd1f94536d09a0a1541a160d" - }, - { - "public_key": "015c6a4f1b5290e5cd0f63ca6c69226334b38782fdaddd3cbb95e4574f3fbfda03", - "signature": "01bcdf497ba0a3935d19b698841d8a68ce2952b0ab8a79fa2c13230f00d4db796780d2b4d8daff91f43ad5da6e8f2ce427751304d9c9c2d2fda0a52e2153ec5c0e" - }, - { - "public_key": "015d2c1e1cff298962c98d53aa9296376daa58de8a7dffa754487467f4c64d0fae", - "signature": "01429cf7edc2d1388ee9df107f304ebc94d4059d7a622dba70741f8ed8f51682e9c9c9b89300397bdd2f5c557b9a14ed74244ac912ed8e5c5289c2abd868a59d05" - }, - { - "public_key": "015da78bc6315643fbcf57d87a50853c67d8b271b615f38f6538f78a844cc4501d", - "signature": "01734fbe3114b375e3cab4c0d0275756f5731b42ba8342ff74d70c060f59e48dea187e2114ae1fd81b20fdbae0b9b23307b3e3f7a4e1b1c62abb928efd23bd4207" - }, - { - "public_key": "0163498976e39a0cce15dbe9788e357db04c734bc6fbef4ad2623a014159782ba0", - "signature": "0159068bb0a69cd4fca57ca62eb82423dfd1c4cb38535e10b360d4ed650c2403e0bee31ca8ecd2ae7b314ca774afd796a2cfc3790cb0616adf5b45423aa8a97507" - }, - { - "public_key": "01669e9e4329ed78e951eb02ca94bb34064af53ebcd64c90d2622cb83345814e4a", - "signature": "01f95b39722f7854d8843a2b8375458e63e50b5b84a9b72147d918341a3f1b515b6d08d3c5856c881d76c4e631e50a1b643f012e54eac1420795abceb606b4e60a" - }, - { - "public_key": "01692afe9954e71ae3049827fcd1e60add077330455edd7aa03705348bd73528e1", - "signature": "012d31664abcbd2083cbb76d6cd1ab5c2d298594637275ff731a9161bb74e1187a62ddd4afd68f9794fd0a06434f8d0282e7dd46fa7cb3140620b8ab8941b44109" - }, - { - "public_key": "016c2dc7038a44912763f52c52e7649bcdfb92a7427a7733f4c2e69e7229afecf3", - "signature": "0102f80abead264eedd941329dee1598c4ba584fc446c958d48078ffaed407f73ddd5e24c9f364980af425aebafdd3540ad5b05c9a2d1294519e1de1b4af961603" - }, - { - "public_key": "016ee08e3f25921bf062b3fe3cabd736c266f8437d418299d61ccad11c6387c8b4", - "signature": "01a46ed9c7edd5f60af12c4808fad08f5f5aa62e2514390626ca3b3293a31ab36b3e7d54630b89815ab3f08cddcca2a663e574cf55fa2a1b57a664fa92e89ba906" - }, - { - "public_key": "016f60a2395e9100c37c8dc2ebfec9bc1f13e3651e5836bad9f20c95ac223777fd", - "signature": "0188b951ef86b26d2fe99ebfed094f00d48d012ddff168d963cd06a88f85e6b609ddf0189bb6b4d509683108b657bf528a8e5f5e183c7efc4e6339cc5c42068206" - }, - { - "public_key": "01703c76b37952e117fea297ab20a60d9c61fb2fb03d4dcf87553089008343fb6c", - "signature": "01cd146d654c015a906dc095082e76b5bcead4b2d83170486ae80717a0ea7a64181f6d6bad688cee99688ae35fb8b25da19a24f88e80da7c91a1cce7ae07d3840a" - }, - { - "public_key": "017399e6fe6c16d6807bcf5706a35ae6eff577c1ecc06436dde4a39b0ffe9859a0", - "signature": "018cf0cb4621e909ea188b4f66bae11ab5ec1537edad18b22ccee61fc7fa55e047781d45fa2be365f1758234efec9b9f6a09e7f3a406e06d636add1a0c523aac0e" - }, - { - "public_key": "017a684f6787e78e68c0063aad5a4fb26448b340d36c0e8aa79d67d82ce03dad28", - "signature": "01f86b7eb31b9ad77da277697c95b403b2e1d89f763f116ad78fc54e7a901cb28fa34305dddc069a19f61bbc0b2a8441b1124e6814869358c8d248fce31684b201" - }, - { - "public_key": "017b3bc41d74d2ac402f572420913328e8ada6608522680000bb6d7340793a71ed", - "signature": "01a1197b23233804d6bebeddec3cc777964d19dd55bff1dc3feb21bf31cca09872d07b84e9a6f572a7e4373219d096a7da3a9d4443df7b9fd137d36ccacdf9cd0c" - }, - { - "public_key": "017d96b9a63abcb61c870a4f55187a0a7ac24096bdb5fc585c12a686a4d892009e", - "signature": "0177862283f119df717712eeb52d6805add2db34b50000a8512b370a417e47ae9fd2e0257968d37dbdf5f6e69713a9a60ae91b501ca01f993af5312b7b63375904" - }, - { - "public_key": "017d9aa0b86413d7ff9a9169182c53f0bacaa80d34c211adab007ed4876af17077", - "signature": "01eee5b7e5fdc5d744f78eb1699cab486152a962f143442b0275172afb603448892402df8d859d0f668a859979e3644f5fc6212371f66f9fb56a140655adc46201" - }, - { - "public_key": "017e84cda47902c0291560f80b0afbeb0df9d7b1aa940bc45baf883bf31dc159fb", - "signature": "0189806c9751f84c332efdac1070533efdb8626d1bdf83337eba3cdf4b934f95ceda21e40885ae7a0a3fc802e96898f2eaf19228581e27ec1291340d263488340e" - }, - { - "public_key": "0181f0cc8a0e029d2f59cd3118729d022cdd530bb4c8cdcf5de8d8c7c3331e0d11", - "signature": "014ad8f164d1ee510ed2a55933a64a6c27014c4836413fa1408176f539a1b1e8038cd7a523227d54aad5bb1835b7a195b9be82866b2a3d25e05635da7179e7e202" - }, - { - "public_key": "01832ba5de98bf18e3e0e9816a091878379e57e962069d5ec1a2d1daa05f652fb0", - "signature": "01379228449527bc1846cad4b31b86310ddc037df675a947ffb178b9748e8ed5cb71a9f77764fc2cf0eb9c5a500ce7854f8879286bcae41068a56bed6165097c01" - }, - { - "public_key": "018af60e4c80d9292ca60034f95e620b213d02c3bf90b72770c2584ee52bdf9e0d", - "signature": "01e5151446d3be9cabc996079ee21a6285eec39863a6243bfa30ddf5c746cf82a5f00f29d2f84f7a62461ee04f633fab34e00f4f3482c6c906d7996dae6b120c01" - }, - { - "public_key": "018d78dfb68f4edc0d654768fe8f2d84e6b244de7664e0a30ece3c438fd0747f30", - "signature": "01f837be31a04d1b590ad0f49c0975343fec41b84c637751ad7c0e7b0283a9a72d51715270a151b8453dd36760fc82b263466a1b7bade789def02b1e299a02d501" - }, - { - "public_key": "018eaa46e69cb19325d4cb9a2cec9440241e4ae83f3ca06fe9b8e4cc35704e4900", - "signature": "01f49928a72d3c1c8df28ee34339da7251f1b36331875a6ddf4c44a3a0e36f7e90bc2bba8e56537cca8a3525aa0ab337ec18c297a6a39ddc3211457025ffa3440d" - }, - { - "public_key": "0195904aa95f0a775126f4b5ac564ba28734231caf696fd20582042fb0497d2385", - "signature": "01049d76db603a8857c14ebd2bdc05a4c0371fdd6604b7674129eccd27566bf617c689954145c9472a3d47f83cf0e0ab6381f7d58b85d579d49a68f82a37106e05" - }, - { - "public_key": "01974787ce4ba017dbe6497da9214db82c73aec88a3ca636b7c3b27f365ffbd6ad", - "signature": "01dae0b4715d21bdf84cce28d00681be25b956a0e11bc1a66171e0e30cd151062500ffd6dcb89b9bf6422963489914f2ad4a3428c68a0c64e1b9d907fa9cc9740a" - }, - { - "public_key": "019945dfe9840841882fa57a19e47f2a091e181c85e35e8acb1c0b7e3cebc7184a", - "signature": "01683f82a8df39ebe194af3fa9529db4d939bf6569595f82562fc60e0d702fdfe5cd7ccb5b447c38e681b6b1f225c47e550aedf68eab71f7318a717e8f43f46a01" - }, - { - "public_key": "019a85d7370f913f0a9f55a12da2b031d8c0a36752cd8fd7ff0b47cff0d4fc57bd", - "signature": "01f43e0e47cfc186c269b50aa432650f428815aba07917cbaeed49dc3498e2fb80ba0f722a85ab44addf510d17ac293dd1321f4b3e8ef6d16dd7d6ee374353fe08" - }, - { - "public_key": "01a3536b5794be5b53972a9bbb56795cb7a4af385a3f1cddb29e253cbcf73586f6", - "signature": "01f907ba070eee9719c5193d6f24c0026765b53e9f907df61dfa53db55f32d0107a5282f60da608109d2b0f214115403c4ec4e0af9602afffe89a57ca7f145ab01" - }, - { - "public_key": "01a8dacb750bcd59ab828143e52b011c38799f8c6a90c61a63793b39dde4b4839a", - "signature": "01a2330cec8ed313992af7deb1b5832980ffe182184470b35784888159a00829f9ad6b73a1e40a27214cedc6cd65fd22a565f18fb519133e7b5f37f2da28db2103" - }, - { - "public_key": "01aa17f7b9889480b1bd34c3f94f263b229c7a9b01dd4dda19c2dd1d38d176c7a0", - "signature": "016ca1bf47182ce50582be0267b066c501c23022fc86b2e10df445696362ae3f74a3bd93e243a23df98a6e5d631486976a5ee21890f558bedf390051d68a3ffe0e" - }, - { - "public_key": "01ad002e37667f90aa982396ebdfcc7d3eea99731241eaad8a0dc20f453f72975a", - "signature": "01024a8d9ecfbd27073acd60478d477b865923fa57f201dab9e4681a695803bd8ebe40b8291529e45ae393a6d03237f380a4562e556f03190220c9ba700287bf0e" - }, - { - "public_key": "01aea86e5fccdf72daa7c65cc8b3d2ca96a006a0dcd70d3617f85fef00b9d78464", - "signature": "01f7a284ce47a0b68888e8425bdbb8a3ae363dc70e8c38219e34e6ad675550e11df46ee7f7b68599d724348191704fd534a06a7c7d3323a5a498286bb2320d2f0f" - }, - { - "public_key": "01b118ef7d8718ccb554a7f8523365f9ae2afb4a7d50ee87a1403136d4d2506907", - "signature": "010b225f61a8a7edc72bee19b8c1538f4d387b784acd69615b0980a01fc1230686ac09c116bd7595c9c565934fd870c34b80cd2d2f014dc5423d9ed4647837570a" - }, - { - "public_key": "01b5d00a38e1783345ffe0bfa8423e026b76480683e0b19966ee47c7f68a827c00", - "signature": "018a7b267fbbd27937cea76f0b4bb67a17b822088944a00a4dd2d1add6acd5635bb8f10ebac85916c7ff94f73ffb6ed8d963392aed81a34f78449c33bea8cf5605" - }, - { - "public_key": "01b71b2d746681b4e0f44ef137d72ee0d42122b08ef569dc65bb0395cb624f99e5", - "signature": "0143f02b5c33a30aa95bea8fa9e2aef877f15db014996a0ee2dce301c7774d1beec602f936a7bef94c2ddd14e9c7b8be7ad9d0f3b33a99f51e1b63af4b984cd400" - }, - { - "public_key": "01b7773ecc2c7b984fa90d75b17f01f2bce563499c4d7b102e75361e2a1fad2f40", - "signature": "01b9d6ae571178dd6386f788de7152e71d58c05c7edffea61fa1b5485ba9771ea8be5cf0b3b594d99bb5adcc928ee1aa8d1d5d4f378a57c588d7d6392d33fa2101" - }, - { - "public_key": "01b7ab364d6d8b7ca29dda70c3a7ddd66b83b8520491629f426b171805c590dfdc", - "signature": "0120c617e1586b99d9caba2f59f1f87badcddf5f11af019cdfd62ca8ae88da6d437fd96bd2efdca0bc4690ba8c3bee6937905919d4aa8051d942f4c702aad04a02" - }, - { - "public_key": "01b9c7300de94c2245e77bae27e84d1549618bc400f6acfe58bb7ec42bc491d160", - "signature": "019d7f15c074500d28abac06127f5f70dd4fadf258e47b785801fa50533bfe2c8e7211241f34d6599319b7e87ffea210ab5ba097fbdeda39503e17559be4a92402" - }, - { - "public_key": "01bc4f13011da02b4bbf9974225f6b1ff8235a65806ae05f684266da6a136c521b", - "signature": "01a8b5105508cf8ce2a4ec5d19a33b836fb014667400577c47e8ba88886f7b26e944d9f760cffb7e5268e484ed590ee4a9a703dac5a731fed2d575df97ca596b0e" - }, - { - "public_key": "01bd483c29aba4fd119bd552475362f37a7d4a0d8a2adcd9fe89c37d2c74c10c1f", - "signature": "01f25cdeb98e38f1bdd183d029f9ca98a613c207befef5f36ddb35bef4537a6abb9434ed9305ae63d570d03aa7fe935289e136ba5460127ac35f3400cf42a6cd06" - }, - { - "public_key": "01c375b425a36de25dc325c9182861679db2f634abcacd9ae2ee27b84ba62ac1f7", - "signature": "014c1bef370b5ea832cf3077164941fd53af33e9c0e12f3b58fa2b2595e90b37180600f5e6ea9fb89269db3e9234470b300a1070178a1578508da3852d4d1a4e04" - }, - { - "public_key": "01c3bd0f019a8917ec8bcc00e94002ac0abe962caa12e1a0a0e028935533bb4328", - "signature": "01ce88a83818512591b77332d5d15525081c9797155dadc75871ee3c1af4c8b64e549d53474f70de57b09ff81128405c94e212d129c0111a3a3937ac50797b9400" - }, - { - "public_key": "01c6a9ead0b10bc11c2ebabc5be039f45bbc536e76eec7a44d96dfa42ba81cdd38", - "signature": "01fef25ee4dc568b9c0400f187440a844e0660762b4c0d262553d2268b4fc89f6744cb206b3e0d7e71b31113ca877425848ade59251d46dedadcd27800ffe60d00" - }, - { - "public_key": "01c86a32f711b172f93a23b31b0e88884883574043a03ff0fcabf4527108587d6b", - "signature": "01a066e0fb1ad6e427938e15e7280aab012f4a95b1e3d41562a0ba3d6242dd2914aac947435aff57bb88c0867547ebb01128314e234cf181ee24c2c13cd7a99a0e" - }, - { - "public_key": "01c8be540a643e6c9df283dd2d2d6be67748f69a3c7bb6cf34471c899b8e858c9a", - "signature": "01cb5eaa0da49b3027aabc5c22686a43636b2684906581877da31283494c1fec7b0e65658439e9fc79f15c2f340dfbace6e4a2594bfeb4914fd474bc86435d2106" - }, - { - "public_key": "01c94932ec3ff43f3744b9a98532c9a2f80bab1a67e43db95ed1182ec61a4f966a", - "signature": "011b79e59b3805701b79db32baefcbf4cde59438cea7f241cb432b6cd7f3cbe29694c32ecb6b2686a25c6749c67aea95ccaa5c9bc7620c147f4f106780a3196e05" - }, - { - "public_key": "01c9d4ecac1606970fa3c8fa8079aa1c04fd5371d55adf96fc6d3952fc27e8bc04", - "signature": "0169198f9f8a7c08a1a97cdd436f6a857ceae59a69209db9d0e43d9aa6d180cb83e3e0ca1e918f63c78916c0c88cd5bd85b94b11d3d416a365f22be08e04b1cb0b" - }, - { - "public_key": "01cb41ee07d1827e243588711d45040fe46402bf3901fb550abfd08d1341700270", - "signature": "01d857b9db3dab16985eda383239b3b8f7ecfaed5adb1838ec06b5dce4d5230b62266173c14cb6c26ca57c85d96b6a3123f739538388d66f7c9c3e2871642c3a05" - }, - { - "public_key": "01cfb69e5f24eef21f479599391286bbb10134baec42b0d2be1ba8e041f2c57a96", - "signature": "01acd3f3834051c5243f64fa194158aa07450582e2985d88479514e418a5050ad7c0d370df3c6752c2db26f5c339f9ec117df14a9acdb88840b88a593e57259007" - }, - { - "public_key": "01d00d2d59c18dab882b1141cb3dbcf1f05078ffedda0551c53c6a3cc1191e4672", - "signature": "010fd5dce4b9b07121b2169e4e3962a9e17f49f2271d6780276e288028b79c8d68856f2aa41196bee01ccad42d6a8d6f9e1a8ab5fe0fe77b101e2f899e6a86ec00" - }, - { - "public_key": "01d0f221c7601b0c93b8bfe7ed534237a0a2910abad2065d27803e953726929ca8", - "signature": "018b881475e16ccb4a80d5e6a68a7f963586cf580e36fa85993e8861470392a99b564b0d7314bf948d2211cffccf399e1fac6d66cc8eedaaa1dd95bc44cd3ab70e" - }, - { - "public_key": "01d1cf9fdcc6cf1e0c55cb4b8e576bc23bdad8ed4fccc50a409a0d16b3975e16cf", - "signature": "015409400c3217d366a99d74a1bf4d4ae2711a599fb4016d1bb89ad7e7be115ac0369d9752ff050a240b627a148305551b6dd31400b891310bc26961ba23cf6209" - }, - { - "public_key": "01d208f5c225bc554a01634c7c124b2729e94beadd307d36219f0108da60f433b0", - "signature": "01d9f95333dd09cedb44aec243a7904b40da8f708509287db77c2905754b7aa81dd8946d822aadbadb10317ab37609fca68c0701bd8b00aa1e01e7cec7c357ef01" - }, - { - "public_key": "01d29e446d9651a41bb2829ac8a21cf9da1eec8531ed57a492b6f1439dbb4d8a16", - "signature": "01580c77041d2deeacea6faccdb14a99bcf8cccd2b894ee5967582dce724ad3ee50c460919046a5858e3f0feb832d12555b41789d0f4809c8bdf19a7122209b202" - }, - { - "public_key": "01d548e27d07445f219b30c3583d6186f45da801e838e3890a8c950d3daa092f29", - "signature": "01f43e4a050e5b345e9569dc9b5788064623d9b1f00087b8be8529685c1a044129c892080c33f00183cad1f2b68855772ddc8803af60e38a6a6b81550687a82701" - }, - { - "public_key": "01dc22c79d13be95f8868ae60d74c372a3ca5288bdf62f58b2ddb7de32faa74c05", - "signature": "01442e1521919d665e897919f6acb320c1a35e14bb5435add280baf5a1745da2c70eece7e34dd5bb0c06bb8614dc029b52c76f39aeba7f4b5a6766a4156069440a" - }, - { - "public_key": "01de03eff88a86da29abfb9eb84af58f3b908db49ca9a7cee72a6b2179e3c63559", - "signature": "012560e2dd95dbe231c2127184de981644192eade684e6d6f89a5895a4e93ab4978f69a6fc1bfe7f73ff1c475c84d25c5a8082bcdf07d9bf95f34acf981a637d08" - }, - { - "public_key": "01df81e1ecb702749c629aadc62082be23203bed47ea49bcfa0f3d98c3d8b349b8", - "signature": "01fc48cbc7e887a2916ac952f3c1bdf22ae1984260bbd6c7b952c61244f42d7bb269c55322ef9e0f9dfbb6c6ec2ae6144b0bb5c87bf884b06c25a3c63129b90a07" - }, - { - "public_key": "01e412246798e9c3040233a89d47e7647d762fd0b4bcc0ec0286a55ba4d6768713", - "signature": "01161438fe1664cd658db4f01f452989975809999f1b5c9f94fd844e6e805c0c5d628c4053077646a4ece6f7ff573fcd0bd6d45b6c9b5c4434e2f04b6c3c797909" - }, - { - "public_key": "01e6315e4e7d58929c52d9398934feca14b43be0b71d31ca80d202276862bd50fe", - "signature": "01cc6e52173aa666eecdd45ed4b98ee8988521fcd1b2c611839859381b0a6ba50f82e7ac2bc34cd9de8b92e2f0de6ff1a3b18568131997b7d46f9e7fbf327b9601" - }, - { - "public_key": "01e8121a2586a6add8a65990080633adfa4e0d32088d36d7fb6f6d3ede1bd7b823", - "signature": "018db27813db42f88a70bccd385f1aaecbd4c25f269fa4c4ac207df8a8e6a43436fbfd2e8b69313cf70cd6f7a8383ffd5a2db7b9b105a1101f58e2c6f7be233a0a" - }, - { - "public_key": "01ee3d205fe314de0739fac7264c97af5ccc4cffec391cae5bcb6f87e2dc2df079", - "signature": "01d7349c0a4b54030049b9713e5705aaca4c68357996570c4812897b05c047b133638586e9654e3f11e4ee6e05885ac5b2d09ef1ae0a5dcb0368edb15499a8740a" - }, - { - "public_key": "01f340df2c32f25391e8f7924a99e93cab3a6f230ff7af1cacbfc070772cbebd94", - "signature": "018aed086a03f0eb6815e9ab51b52c0448dc790261698a486edada205f5a949410fc6d7dd2a285da0bd5f86bb340c89d2cec55102cb783c3350e4198e419797501" - }, - { - "public_key": "01fe19d0fd010dfecc4f2a812c396bef932cd8f11b3855cc5ec3f6bd9545d58894", - "signature": "01048f2d98f7f59a25047c0e8207f6b1a20af85b222ec64b90e6c6f74f93d8c127f5c1b495394e647a9099d407bb8ecee29e7752e7ad1baca976abb14e1481a206" - }, - { - "public_key": "020377bc3ad54b5505971e001044ea822a3f6f307f8dc93fa45a05b7463c0a053bed", - "signature": "0237debde306c2d4c7bfca7480da5c19208f20733b8afeda23cb688f432369c62b24d9b520b16fe0960ccb74ba2826f16b862b5e46c1bd2d2fc27e9caadd4083ab" - } - ] -} From 301f3f4d8a65ee34bf45b819f8431686c789e753 Mon Sep 17 00:00:00 2001 From: Avi Dessauer Date: Mon, 16 Sep 2024 20:08:12 -0700 Subject: [PATCH 03/12] Delete LightClientKernel & Use casper_types::JsonBlockWithSignatures --- src/kernel.rs | 157 +++---------------------------------------- tests/integration.rs | 48 ------------- 2 files changed, 8 insertions(+), 197 deletions(-) diff --git a/src/kernel.rs b/src/kernel.rs index 989888a..3ab6814 100644 --- a/src/kernel.rs +++ b/src/kernel.rs @@ -1,11 +1,7 @@ use alloc::collections::BTreeMap; -use casper_types::{EraId, PublicKey, U512}; -use core::option::Option; +use casper_types::{EraId, JsonBlockWithSignatures, PublicKey, U512}; -use crate::{ - block::BlockHeaderWithSignatures, - crypto::{verify, SignatureVerificationError}, -}; +use crate::crypto::{verify, SignatureVerificationError}; use super::block_header::BlockHash; @@ -54,24 +50,19 @@ impl EraInfo { #[allow(clippy::result_large_err)] pub fn validate( &self, - block_header_with_signatures: &BlockHeaderWithSignatures, + JsonBlockWithSignatures { block, proofs }: JsonBlockWithSignatures, ) -> Result<(), BlockSignaturesValidationError> { let mut block_signature_weight = U512::from(0); - let block_header = block_header_with_signatures.block_header(); - if block_header.era_id() != self.era_id { + if block.era_id() != self.era_id { return Err(BlockSignaturesValidationError::WrongEraId { trusted_era_id: self.era_id, - block_header_era_id: block_header_with_signatures.block_header().era_id(), + block_header_era_id: block.era_id(), }); } // See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L2465-L2474 - let mut signature_data = block_header.block_hash().as_ref().to_vec(); - signature_data.extend_from_slice(&block_header.era_id().to_le_bytes()); - for (public_key, signature) in block_header_with_signatures - .block_signatures() - .proofs() - .iter() - { + let mut signature_data = block.hash().inner().into_vec(); + signature_data.extend_from_slice(&block.era_id().to_le_bytes()); + for (public_key, signature) in proofs.iter() { if let Some(validator_weight) = self.validator_weights.get(public_key) { block_signature_weight += *validator_weight; } else { @@ -107,135 +98,3 @@ impl ParentHashAndCurrentHeight { self.current_height } } - -pub struct LightClientKernel { - latest_block_hash: BlockHash, - parent_hash_and_current_height: Option, - era_info: Option, -} - -#[derive(Debug)] -pub enum LightClientUpdateError { - InvalidBlockHashWhenInitializing, - InvalidBlockHashWhenWalkingBack, - BlockInPastWhenProgressing { - bad_block_height: u64, - current_height: u64, - }, - InvalidSignatures(BlockSignaturesValidationError), -} - -impl From for LightClientUpdateError { - fn from(block_signature_validation_error: BlockSignaturesValidationError) -> Self { - LightClientUpdateError::InvalidSignatures(block_signature_validation_error) - } -} - -impl LightClientKernel { - pub fn new(latest_block_hash: BlockHash) -> Self { - LightClientKernel { - latest_block_hash, - parent_hash_and_current_height: None, - era_info: None, - } - } - - #[allow(clippy::result_large_err)] - pub fn update( - &mut self, - block_header_with_signatures: &BlockHeaderWithSignatures, - ) -> Result<(), LightClientUpdateError> { - let block_header = block_header_with_signatures.block_header(); - match (&self.parent_hash_and_current_height, &self.era_info) { - // parent_hash_and_current_height are not set, check the latest block has the correct trusted hash and set them - (None, _) => { - if self.latest_block_hash == block_header.block_hash() { - let parent_hash = block_header.parent_hash().clone(); - let current_height = block_header.height(); - self.parent_hash_and_current_height = Some(ParentHashAndCurrentHeight { - parent_hash, - current_height, - }); - if let Some(era_end) = block_header.era_end() { - self.era_info = Some(EraInfo::new( - block_header.era_id().successor(), - era_end.next_era_validator_weights().clone(), - )); - } - Ok(()) - } else { - Err(LightClientUpdateError::InvalidBlockHashWhenInitializing) - } - } - // If the parent_hash_and_current_height are set, but there's no `EraInfo`, then the update effectively walks the light-client back in history by a block. - // If the block_header_with_metadata has an era_end, use that to set `EraInfo`. - ( - Some(ParentHashAndCurrentHeight { - parent_hash, - current_height: _, - }), - None, - ) => { - if parent_hash == &block_header.block_hash() { - self.latest_block_hash = parent_hash.clone(); - let parent_hash = block_header.parent_hash().clone(); - let current_height = block_header.height(); - self.parent_hash_and_current_height = Some(ParentHashAndCurrentHeight { - parent_hash, - current_height, - }); - if let Some(era_end) = block_header.era_end() { - self.era_info = Some(EraInfo::new( - block_header.era_id().successor(), - era_end.next_era_validator_weights().clone(), - )); - } - Ok(()) - } else { - Err(LightClientUpdateError::InvalidBlockHashWhenWalkingBack) - } - } - // If the era_info is set, then the light client progresses by checking if the block is in the current era and has proper finality signatures. If it is and it has a height higher than the kernel, progress the light client. - ( - Some(ParentHashAndCurrentHeight { - parent_hash: _, - current_height, - }), - Some(era_info), - ) => { - if block_header.height() <= *current_height { - Err(LightClientUpdateError::BlockInPastWhenProgressing { - bad_block_height: block_header.height(), - current_height: *current_height, - }) - } else { - era_info.validate(block_header_with_signatures)?; - self.latest_block_hash = block_header.block_hash(); - self.parent_hash_and_current_height = Some(ParentHashAndCurrentHeight { - parent_hash: block_header.parent_hash().clone(), - current_height: block_header.height(), - }); - if let Some(era_end) = block_header.era_end() { - self.era_info = Some(EraInfo::new( - block_header.era_id().successor(), - era_end.next_era_validator_weights().clone(), - )); - } - Ok(()) - } - } - } - } - - pub fn latest_block_hash(&self) -> &BlockHash { - &self.latest_block_hash - } - - pub fn parent_hash_and_current_height(&self) -> Option<&ParentHashAndCurrentHeight> { - self.parent_hash_and_current_height.as_ref() - } - - pub fn era_info(&self) -> Option<&EraInfo> { - self.era_info.as_ref() - } -} diff --git a/tests/integration.rs b/tests/integration.rs index d528743..a72274c 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -1,35 +1,8 @@ -use std::collections::BTreeMap; - use casper_litmus::{ - block::Block, block_header::BlockHeaderV1, json_compatibility::{JsonBlock, JsonBlockHeader}, - kernel::LightClientKernel, merkle_proof::{process_query_proofs, TrieMerkleProof}, }; -use casper_types::{ - bytesrepr::{deserialize_from_slice, ToBytes}, - EraId, -}; - -use once_cell::sync::Lazy; - -static BLOCKS_MAP: Lazy> = Lazy::new(|| { - let mut blocks = BTreeMap::new(); - let cwd = std::env::current_dir().unwrap(); - let this_files_directory = std::path::Path::new(&(file!())).parent().unwrap(); - let blocks_path = cwd.join(this_files_directory).join("assets/blocks"); - for entry in std::fs::read_dir(blocks_path).unwrap() { - let entry = entry.unwrap(); - let path = entry.path(); - if path.is_file() { - let data = std::fs::read_to_string(path).unwrap(); - let json_block: JsonBlock = serde_json::from_str(&data).unwrap(); - blocks.insert(json_block.header().height(), json_block); - } - } - blocks -}); #[test] fn json_block_header_round_trip() { @@ -40,27 +13,6 @@ fn json_block_header_round_trip() { assert_eq!(json_block.header(), &reconstituted_json_block_header); } -#[test] -fn update_kernel_one() { - let mut kernel = LightClientKernel::new(BLOCKS_MAP.get(&0).unwrap().hash().clone()); - let json_block: JsonBlock = - serde_json::from_str(include_str!("assets/blocks/block-0.json")).unwrap(); - let block = Block::try_from(json_block.clone()).unwrap(); - let result = kernel.update(block.block_header_with_signatures()); - assert!(result.is_ok()); -} - -#[test] -fn update_kernel_history() { - let mut kernel = LightClientKernel::new(BLOCKS_MAP.get(&0).unwrap().hash().clone()); - for height in 0..BLOCKS_MAP.len() { - let json_block = BLOCKS_MAP.get(&(height as u64)).unwrap(); - let block = Block::try_from(json_block.clone()).unwrap(); - kernel.update(block.block_header_with_signatures()).unwrap(); - assert_eq!(kernel.latest_block_hash(), json_block.hash()); - } -} - #[test] fn query_proofs() { let proofs_hex = include_str!("assets/query_merkle_proofs.txt"); From cbdc7ff4e6b2bafb12c179bf1aec8bfc306c9dbd Mon Sep 17 00:00:00 2001 From: Avi Dessauer Date: Mon, 16 Sep 2024 20:25:11 -0700 Subject: [PATCH 04/12] Switch to std, use casper_types, delete duplicated types --- Cargo.toml | 4 +- src/block.rs | 848 ----------------------------------- src/block_header.rs | 907 -------------------------------------- src/consensus.rs | 2 +- src/crypto.rs | 1 - src/hash.rs | 4 +- src/json_compatibility.rs | 442 ------------------- src/kernel.rs | 19 +- src/lib.rs | 8 - src/merkle_proof.rs | 6 +- tests/integration.rs | 15 +- 11 files changed, 8 insertions(+), 2248 deletions(-) delete mode 100644 src/block.rs delete mode 100644 src/block_header.rs delete mode 100644 src/json_compatibility.rs diff --git a/Cargo.toml b/Cargo.toml index c7f8f02..9666963 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] base16 = { version = "0.2.1", default-features = false, features = ["alloc"] } blake2b_simd = { version = "1.0.2", default-features = false } -casper-types = { git = "https://github.com/casper-network/casper-node.git", branch = "feat-2.0" } +casper-types = { git = "https://github.com/casper-network/casper-node.git", branch = "feat-2.0", features = ["datasize", "json-schema", "std"] } ed25519-dalek = { version = "2.0.0", default-features = false, features = [ "alloc", "zeroize", @@ -26,9 +26,7 @@ time = { version = "0.3.31", default-features = false, features = [ [dev-dependencies] bincode = "1.3.3" -# casper-hashing = "3.0.0" casper-execution-engine = { git = "https://github.com/casper-network/casper-node.git", branch = "feat-2.0" } -casper-types = { git = "https://github.com/casper-network/casper-node.git", branch = "feat-2.0", features = ["gens"] } casper-storage = { git = "https://github.com/casper-network/casper-node.git", branch = "feat-2.0" } hex = "0.4.3" once_cell = "1.19.0" diff --git a/src/block.rs b/src/block.rs deleted file mode 100644 index 6b9fdec..0000000 --- a/src/block.rs +++ /dev/null @@ -1,848 +0,0 @@ -use alloc::{collections::BTreeMap, vec::Vec}; - -#[cfg(test)] -use casper_types::{crypto::gens::public_key_arb, SecretKey}; -#[cfg(test)] -use proptest::prelude::*; - -use casper_types::{ - bytesrepr::{self, FromBytes, ToBytes}, - EraId, PublicKey, RewardedSignatures, Signature, TransactionHash, -}; - -use super::{ - block_header::{BlockHash, BlockHeaderV1}, - crypto::{verify, SignatureVerificationError}, - hash::Digest, -}; - -#[derive(Clone, Debug, PartialOrd, Ord, Eq, PartialEq, serde::Serialize, serde::Deserialize)] -// See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/block.rs#L1324-L1332 -pub struct BlockSignatures { - block_hash: BlockHash, - era_id: EraId, - proofs: BTreeMap, -} - -impl BlockSignatures { - pub fn new( - block_hash: BlockHash, - era_id: EraId, - proofs: BTreeMap, - ) -> Result { - let mut signature_data = block_hash.as_ref().to_vec(); - signature_data.extend_from_slice(&era_id.to_le_bytes()); - for (public_key, signature) in &proofs { - verify(public_key, &signature_data, signature)?; - } - Ok(BlockSignatures { - block_hash, - era_id, - proofs, - }) - } - - pub fn block_hash(&self) -> &BlockHash { - &self.block_hash - } - - pub fn era_id(&self) -> EraId { - self.era_id - } - - pub fn proofs(&self) -> &BTreeMap { - &self.proofs - } -} - -#[cfg(test)] -impl Arbitrary for BlockSignatures { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - ( - any::(), - any::(), // EraId - prop::collection::vec( - prop_oneof![ - any::<[u8; SecretKey::ED25519_LENGTH]>() - .prop_map(|bytes| SecretKey::ed25519_from_bytes(bytes).unwrap()), - any::<[u8; SecretKey::SECP256K1_LENGTH]>() - .prop_filter("Cannot make a secret key from [0u8; 32]", |bytes| bytes - != &[0u8; SecretKey::SECP256K1_LENGTH]) - .prop_map(|bytes| SecretKey::secp256k1_from_bytes(bytes).unwrap()), - ], - 0..5, - ), - ) - .prop_map(|(block_hash, era_id, proofs)| { - let era_id = EraId::from(era_id); - let mut signature_data = block_hash.as_ref().to_vec(); - signature_data.extend_from_slice(&era_id.to_le_bytes()); - let proofs = proofs - .into_iter() - .map(|secret_key| { - let public_key = PublicKey::from(&secret_key); - let signature = crate::crypto::sign(&secret_key, &signature_data); - (public_key, signature) - }) - .collect(); - BlockSignatures { - block_hash, - era_id, - proofs, - } - }) - .boxed() - } -} - -#[derive(Debug, Clone, PartialEq, Eq)] -// See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/block.rs#L1184-L1188 -pub struct BlockHeaderWithSignatures { - block_header: BlockHeaderV1, - block_signatures: BlockSignatures, -} - -#[derive(Debug)] -pub enum BlockHeaderWithSignaturesConstructionError { - InvalidEraId { - header_era_id: EraId, - signatures_era_id: EraId, - }, - InvalidBlockHash { - header_block_hash: BlockHash, - signatures_block_hash: BlockHash, - }, -} - -impl BlockHeaderWithSignatures { - pub fn new( - block_header: BlockHeaderV1, - block_signatures: BlockSignatures, - ) -> Result { - if block_header.era_id() != block_signatures.era_id() { - return Err(BlockHeaderWithSignaturesConstructionError::InvalidEraId { - header_era_id: block_header.era_id(), - signatures_era_id: block_signatures.era_id(), - }); - } - let header_block_hash = block_header.block_hash(); - if block_signatures.block_hash() != &header_block_hash { - return Err( - BlockHeaderWithSignaturesConstructionError::InvalidBlockHash { - header_block_hash, - signatures_block_hash: block_signatures.block_hash().clone(), - }, - ); - } - Ok(BlockHeaderWithSignatures { - block_header, - block_signatures, - }) - } - - pub fn block_header(&self) -> &BlockHeaderV1 { - &self.block_header - } - - pub fn block_signatures(&self) -> &BlockSignatures { - &self.block_signatures - } -} - -#[cfg(test)] -impl Arbitrary for BlockHeaderWithSignatures { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - (any::(), any::()) - .prop_map(|(block_header, mut block_signatures)| { - block_signatures.block_hash = block_header.block_hash(); - block_signatures.era_id = block_header.era_id(); - BlockHeaderWithSignatures { - block_header, - block_signatures, - } - }) - .boxed() - } -} - -#[derive( - Clone, Default, Ord, PartialOrd, Eq, PartialEq, Debug, serde::Serialize, serde::Deserialize, -)] -#[cfg_attr(test, derive(proptest_derive::Arbitrary))] -// See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/deploy/deploy_hash.rs#L32 -pub struct DeployHash(pub(crate) Digest); - -// See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/deploy/deploy_hash.rs#L89-L101 -impl ToBytes for DeployHash { - fn write_bytes(&self, writer: &mut Vec) -> Result<(), bytesrepr::Error> { - self.0.write_bytes(writer) - } - - fn to_bytes(&self) -> Result, bytesrepr::Error> { - self.0.to_bytes() - } - - fn serialized_length(&self) -> usize { - self.0.serialized_length() - } -} - -// See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/deploy/deploy_hash.rs#L103-L107 -impl FromBytes for DeployHash { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { - Digest::from_bytes(bytes).map(|(inner, remainder)| (DeployHash(inner), remainder)) - } -} - -#[derive(Clone, PartialEq, Eq, Debug, PartialOrd, Ord, serde::Serialize, serde::Deserialize)] -#[allow(clippy::large_enum_variant)] -pub enum BlockBody { - /// The legacy, initial version of the body portion of a block. - #[serde(rename = "Version1")] - V1(BlockBodyV1), - /// The version 2 of the body portion of a block, which includes the - /// `past_finality_signatures`. - #[serde(rename = "Version2")] - V2(BlockBodyV2), -} - -/// Tag for block body v1. -pub const BLOCK_BODY_V1_TAG: u8 = 0; -/// Tag for block body v2. -pub const BLOCK_BODY_V2_TAG: u8 = 1; - -impl BlockBody { - pub fn hash(&self) -> Digest { - match self { - BlockBody::V1(v1) => v1.hash(), - BlockBody::V2(v2) => v2.hash(), - } - } -} - -impl From for BlockBody { - fn from(block_body: BlockBodyV1) -> Self { - BlockBody::V1(block_body) - } -} - -impl From for BlockBody { - fn from(block_body: BlockBodyV2) -> Self { - BlockBody::V2(block_body) - } -} - -impl ToBytes for BlockBody { - fn to_bytes(&self) -> Result, bytesrepr::Error> { - let mut buffer = bytesrepr::allocate_buffer(self)?; - match self { - BlockBody::V1(v1) => { - buffer.insert(0, BLOCK_BODY_V1_TAG); - buffer.extend(v1.to_bytes()?); - } - BlockBody::V2(v2) => { - buffer.insert(0, BLOCK_BODY_V2_TAG); - buffer.extend(v2.to_bytes()?); - } - } - Ok(buffer) - } - - fn serialized_length(&self) -> usize { - 1 + match self { - BlockBody::V1(v1) => v1.serialized_length(), - BlockBody::V2(v2) => v2.serialized_length(), - } - } -} - -impl FromBytes for BlockBody { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { - let (tag, remainder) = u8::from_bytes(bytes)?; - match tag { - BLOCK_BODY_V1_TAG => { - let (body, remainder): (BlockBodyV1, _) = FromBytes::from_bytes(remainder)?; - Ok((Self::V1(body), remainder)) - } - BLOCK_BODY_V2_TAG => { - let (body, remainder): (BlockBodyV2, _) = FromBytes::from_bytes(remainder)?; - Ok((Self::V2(body), remainder)) - } - _ => Err(bytesrepr::Error::Formatting), - } - } -} - -#[cfg(test)] -impl Arbitrary for BlockBody { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::().prop_map(BlockBody::V1), - any::().prop_map(BlockBody::V2), - ] - .boxed() - } -} - -#[derive(Clone, PartialEq, Eq, Debug, PartialOrd, Ord, serde::Serialize, serde::Deserialize)] -// See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/block.rs#L1204C14-L1204C15 -// See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/block.rs#L1204C14-L1204C15 -pub struct BlockBodyV1 { - proposer: PublicKey, - deploy_hashes: Vec, - transfer_hashes: Vec, -} - -impl BlockBodyV1 { - pub fn new( - proposer: PublicKey, - deploy_hashes: Vec, - transfer_hashes: Vec, - ) -> Self { - BlockBodyV1 { - proposer, - deploy_hashes, - transfer_hashes, - } - } - - pub fn proposer(&self) -> &PublicKey { - &self.proposer - } - - pub fn deploy_hashes(&self) -> &[DeployHash] { - &self.deploy_hashes - } - - pub fn transfer_hashes(&self) -> &[DeployHash] { - &self.transfer_hashes - } - - pub fn hash(&self) -> Digest { - Digest::hash(&self.to_bytes().unwrap()) - } -} - -#[cfg(test)] -impl Arbitrary for BlockBodyV1 { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - ( - public_key_arb(), - prop::collection::vec(any::(), 0..5), - prop::collection::vec(any::(), 0..5), - ) - .prop_map(|(proposer, deploy_hashes, transfer_hashes)| BlockBodyV1 { - proposer, - deploy_hashes, - transfer_hashes, - }) - .boxed() - } -} - -// See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/block.rs#L1292-L1306 -impl ToBytes for BlockBodyV1 { - fn to_bytes(&self) -> Result, bytesrepr::Error> { - let mut buffer = bytesrepr::allocate_buffer(self)?; - buffer.extend(self.proposer.to_bytes()?); - buffer.extend(self.deploy_hashes.to_bytes()?); - buffer.extend(self.transfer_hashes.to_bytes()?); - Ok(buffer) - } - - fn serialized_length(&self) -> usize { - self.proposer.serialized_length() - + self.deploy_hashes.serialized_length() - + self.transfer_hashes.serialized_length() - } -} - -// See: https://github.com/casper-network/casper-node/blob/edc4b45ea05526ba6dd7971da09e27754a37a230/node/src/types/block.rs#L1308-L1321 -impl FromBytes for BlockBodyV1 { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { - let (proposer, bytes) = PublicKey::from_bytes(bytes)?; - let (deploy_hashes, bytes) = Vec::::from_bytes(bytes)?; - let (transfer_hashes, bytes) = Vec::::from_bytes(bytes)?; - let body = BlockBodyV1 { - proposer, - deploy_hashes, - transfer_hashes, - }; - Ok((body, bytes)) - } -} - -/// The body portion of a block. Version 2. -#[derive(Clone, PartialEq, Eq, Debug, PartialOrd, Ord, serde::Serialize, serde::Deserialize)] -pub struct BlockBodyV2 { - /// Map of transactions mapping categories to a list of transaction hashes. - transactions: BTreeMap>, - /// List of identifiers for finality signatures for a particular past block. - rewarded_signatures: RewardedSignatures, -} - -impl BlockBodyV2 { - pub fn new( - transactions: BTreeMap>, - rewarded_signatures: RewardedSignatures, - ) -> Self { - BlockBodyV2 { - transactions, - rewarded_signatures, - } - } - - pub fn transactions(&self) -> &BTreeMap> { - &self.transactions - } - - pub fn rewarded_signatures(&self) -> &RewardedSignatures { - &self.rewarded_signatures - } - - pub fn hash(&self) -> Digest { - Digest::hash(&self.to_bytes().unwrap()) - } -} - -impl ToBytes for BlockBodyV2 { - fn write_bytes(&self, writer: &mut Vec) -> Result<(), bytesrepr::Error> { - self.transactions.write_bytes(writer)?; - self.rewarded_signatures.write_bytes(writer)?; - Ok(()) - } - - fn to_bytes(&self) -> Result, bytesrepr::Error> { - let mut buffer = bytesrepr::allocate_buffer(self)?; - self.write_bytes(&mut buffer)?; - Ok(buffer) - } - - fn serialized_length(&self) -> usize { - self.transactions.serialized_length() + self.rewarded_signatures.serialized_length() - } -} - -impl FromBytes for BlockBodyV2 { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { - let (transactions, bytes) = FromBytes::from_bytes(bytes)?; - let (rewarded_signatures, bytes) = RewardedSignatures::from_bytes(bytes)?; - let body = BlockBodyV2 { - transactions, - rewarded_signatures, - }; - Ok((body, bytes)) - } -} - -#[cfg(test)] -impl Arbitrary for BlockBodyV2 { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - fn transaction_category_arb() -> impl Strategy { - use casper_types::TransactionCategory; - - prop_oneof![ - Just(TransactionCategory::Mint as u8), - Just(TransactionCategory::Auction as u8), - Just(TransactionCategory::InstallUpgrade as u8), - Just(TransactionCategory::Large as u8), - Just(TransactionCategory::Medium as u8), - Just(TransactionCategory::Small as u8), - ] - } - - ( - prop::collection::btree_map( - transaction_category_arb(), - prop::collection::vec( - prop_oneof!( - any::() - .prop_map(|hash| TransactionHash::from_raw(hash.0.into())), - any::<[u8; crate::hash::DIGEST_LENGTH]>() - .prop_map(TransactionHash::from_raw), - ), - 0..5, - ), - 0..5, - ), - // validator set - prop::collection::btree_set(public_key_arb(), 0..10), - // indices of validators who signed - prop::collection::vec(any::(), 0..10), - ) - .prop_map(|(transactions, validator_set, signer_indices)| { - let validator_set: Vec<_> = validator_set.into_iter().collect(); - - // prop::Index.get panics if the collection is empty - use alloc::collections::BTreeSet; - let signing_validators: BTreeSet<_> = if validator_set.is_empty() { - BTreeSet::new() - } else { - signer_indices - .into_iter() - .map(|index| index.get(&validator_set)) - .cloned() - .collect() - }; - - let rewarded_signatures = RewardedSignatures::new([ - casper_types::SingleBlockRewardedSignatures::from_validator_set( - &signing_validators, - &validator_set, - ), - ]); - - BlockBodyV2::new(transactions, rewarded_signatures) - }) - .boxed() - } -} - -// Data structure reflecting the JSON representation of a block's body. -// See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L2268-L2277 -#[derive(Clone, PartialEq, Eq, Debug)] -pub struct Block { - block_header_with_signatures: BlockHeaderWithSignatures, - body: BlockBodyV1, -} - -#[derive(Debug)] -pub enum BlockConstructionError { - InvalidBlockBodyHash { - header_block_hash: Digest, - body_hash: Digest, - }, -} - -impl Block { - pub fn new( - block_header_with_signatures: BlockHeaderWithSignatures, - body: BlockBodyV1, - ) -> Result { - let header_block_hash = block_header_with_signatures.block_header().body_hash(); - let body_hash = body.hash(); - if header_block_hash != &body_hash { - return Err(BlockConstructionError::InvalidBlockBodyHash { - header_block_hash: header_block_hash.clone(), - body_hash, - }); - } - Ok(Block { - block_header_with_signatures, - body, - }) - } - - pub fn block_header_with_signatures(&self) -> &BlockHeaderWithSignatures { - &self.block_header_with_signatures - } - - pub fn body(&self) -> &BlockBodyV1 { - &self.body - } -} - -#[cfg(test)] -impl Arbitrary for Block { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - (any::(), any::()) - .prop_map(|(header, body)| Block { - block_header_with_signatures: header, - body, - }) - .boxed() - } -} - -#[cfg(test)] -mod test { - extern crate std; - - use alloc::collections::BTreeMap; - - use casper_types::{bytesrepr::ToBytes, EraId, PublicKey}; - use test_strategy::proptest; - - use crate::{block_header::BlockHash, crypto::sign, hash::DIGEST_LENGTH}; - - use super::{BlockBody, BlockBodyV1, BlockBodyV2, BlockSignatures, DeployHash}; - - #[proptest] - fn serde_json_block_signatures_round_trip(block_signatures: BlockSignatures) { - let serialized_block_signatures = serde_json::to_string(&block_signatures).unwrap(); - let casper_types_block_signatures: casper_types::BlockSignaturesV1 = - serde_json::from_str(&serialized_block_signatures).unwrap(); - let serialized_casper_types_block_signatures = - serde_json::to_string(&casper_types_block_signatures).unwrap(); - assert_eq!( - serialized_block_signatures, - serialized_casper_types_block_signatures - ); - let deserialized_block_signatures: BlockSignatures = - serde_json::from_str(&serialized_casper_types_block_signatures).unwrap(); - assert_eq!(block_signatures, deserialized_block_signatures); - } - - #[proptest] - fn bincode_block_signatures_round_trip(block_signatures: BlockSignatures) { - let serialized_block_signatures = bincode::serialize(&block_signatures).unwrap(); - let casper_types_block_signatures: casper_types::BlockSignaturesV1 = - bincode::deserialize(&serialized_block_signatures).unwrap(); - let serialized_casper_types_block_signatures = - bincode::serialize(&casper_types_block_signatures).unwrap(); - assert_eq!( - serialized_block_signatures, - serialized_casper_types_block_signatures - ); - let deserialized_block_signatures: BlockSignatures = - bincode::deserialize(&serialized_casper_types_block_signatures).unwrap(); - assert_eq!(block_signatures, deserialized_block_signatures); - } - - #[test] - fn should_verify() { - let secret_key = casper_types::SecretKey::ed25519_from_bytes([42; 32]).unwrap(); - let block_hash = BlockHash::from([42; DIGEST_LENGTH]); - let era_id = EraId::from(0); - let mut signature_data = block_hash.as_ref().to_vec(); - signature_data.extend_from_slice(&era_id.to_le_bytes()); - let signature = sign(&secret_key, signature_data); - let mut proofs = BTreeMap::new(); - proofs.insert(PublicKey::from(&secret_key), signature); - let block_signatures = BlockSignatures::new(block_hash, era_id, proofs); - assert!(block_signatures.is_ok()); - } - - #[test] - fn should_not_verify() { - let secret_key0 = casper_types::SecretKey::ed25519_from_bytes([42; 32]).unwrap(); - let secret_key1 = casper_types::SecretKey::ed25519_from_bytes([43; 32]).unwrap(); - let block_hash = BlockHash::from([42; DIGEST_LENGTH]); - let bogus_signature = sign(&secret_key1, &block_hash); - let mut proofs = BTreeMap::new(); - proofs.insert(PublicKey::from(&secret_key0), bogus_signature); - let block_signatures = BlockSignatures::new(block_hash, 0.into(), proofs); - assert!(block_signatures.is_err()); - } - - #[proptest] - fn serde_json_deploy_hash_round_trip_casper_types(deploy_hash: DeployHash) { - let serialized_deploy_hash = serde_json::to_string(&deploy_hash).unwrap(); - let casper_types_deploy_hash: casper_types::DeployHash = - serde_json::from_str(&serialized_deploy_hash).unwrap(); - let serialized_casper_types_deploy_hash = - serde_json::to_string(&casper_types_deploy_hash).unwrap(); - assert_eq!(serialized_deploy_hash, serialized_casper_types_deploy_hash); - let deserialized_deploy_hash: DeployHash = - serde_json::from_str(&serialized_casper_types_deploy_hash).unwrap(); - assert_eq!(deploy_hash, deserialized_deploy_hash); - } - - #[proptest] - fn serde_json_deploy_hash_round_trip_casper_node(deploy_hash: DeployHash) { - let serialized_deploy_hash = serde_json::to_string(&deploy_hash).unwrap(); - let casper_node_deploy_hash: casper_types::DeployHash = - serde_json::from_str(&serialized_deploy_hash).unwrap(); - let serialized_casper_node_deploy_hash = - serde_json::to_string(&casper_node_deploy_hash).unwrap(); - assert_eq!(serialized_deploy_hash, serialized_casper_node_deploy_hash); - let deserialized_deploy_hash: DeployHash = - serde_json::from_str(&serialized_casper_node_deploy_hash).unwrap(); - assert_eq!(deploy_hash, deserialized_deploy_hash); - } - - // Note: casper_node and casper_types do not have a consistent bincode serialization, so we chose to follow casper_node's serialization. - // See https://github.com/casper-network/casper-node/issues/4502 - - #[proptest] - fn bincode_deploy_hash_round_trip_casper_node(deploy_hash: DeployHash) { - let serialized_deploy_hash = bincode::serialize(&deploy_hash).unwrap(); - let casper_node_deploy_hash: casper_types::DeployHash = - bincode::deserialize(&serialized_deploy_hash).unwrap(); - let serialized_casper_node_deploy_hash = - bincode::serialize(&casper_node_deploy_hash).unwrap(); - assert_eq!(serialized_deploy_hash, serialized_casper_node_deploy_hash); - let deserialized_deploy_hash: DeployHash = - bincode::deserialize(&serialized_casper_node_deploy_hash).unwrap(); - assert_eq!(deploy_hash, deserialized_deploy_hash); - } - - #[proptest] - fn bytesrepr_deploy_hash_round_trip_casper_types(deploy_hash: DeployHash) { - let serialized_deploy_hash = deploy_hash.to_bytes().unwrap(); - let casper_types_deploy_hash: casper_types::DeployHash = - casper_types::bytesrepr::deserialize(serialized_deploy_hash.clone()).unwrap(); - let serialized_casper_types_deploy_hash = - casper_types::bytesrepr::serialize(casper_types_deploy_hash).unwrap(); - assert_eq!(serialized_deploy_hash, serialized_casper_types_deploy_hash); - let deserialized_deploy_hash: DeployHash = - casper_types::bytesrepr::deserialize(serialized_casper_types_deploy_hash.clone()) - .unwrap(); - assert_eq!(deploy_hash, deserialized_deploy_hash); - } - - #[proptest] - fn bytesrepr_deploy_hash_round_trip_casper_node(deploy_hash: DeployHash) { - let serialized_deploy_hash = deploy_hash.to_bytes().unwrap(); - let casper_node_deploy_hash: casper_types::DeployHash = - casper_types::bytesrepr::deserialize(serialized_deploy_hash.clone()).unwrap(); - let serialized_casper_node_deploy_hash = - casper_types::bytesrepr::serialize(casper_node_deploy_hash).unwrap(); - assert_eq!(serialized_deploy_hash, serialized_casper_node_deploy_hash); - let deserialized_deploy_hash: DeployHash = - casper_types::bytesrepr::deserialize(serialized_casper_node_deploy_hash.clone()) - .unwrap(); - assert_eq!(deploy_hash, deserialized_deploy_hash); - } - - #[proptest] - fn serde_json_block_body_v1_round_trip(block_body: BlockBodyV1) { - let serialized_block_body = serde_json::to_string(&block_body).unwrap(); - let casper_node_block_body: casper_types::BlockBodyV1 = - serde_json::from_str(&serialized_block_body).unwrap(); - let serialized_node_block_body = serde_json::to_string(&casper_node_block_body).unwrap(); - assert_eq!(serialized_block_body, serialized_node_block_body); - let deserialized_block_body: BlockBodyV1 = - serde_json::from_str(&serialized_node_block_body).unwrap(); - assert_eq!(block_body, deserialized_block_body); - } - - #[proptest] - fn serde_json_block_body_v2_round_trip(block_body: BlockBodyV2) { - let serialized_block_body = serde_json::to_string(&block_body).unwrap(); - let casper_node_block_body: casper_types::BlockBodyV2 = - serde_json::from_str(&serialized_block_body).unwrap(); - let serialized_node_block_body = serde_json::to_string(&casper_node_block_body).unwrap(); - assert_eq!(serialized_block_body, serialized_node_block_body); - let deserialized_block_body: BlockBodyV2 = - serde_json::from_str(&serialized_node_block_body).unwrap(); - assert_eq!(block_body, deserialized_block_body); - } - - #[proptest] - fn serde_json_block_body_round_trip(block_body: BlockBody) { - let serialized_block_body = serde_json::to_string(&block_body).unwrap(); - let casper_node_block_body: casper_types::BlockBody = - serde_json::from_str(&serialized_block_body).unwrap(); - let serialized_node_block_body = serde_json::to_string(&casper_node_block_body).unwrap(); - assert_eq!(serialized_block_body, serialized_node_block_body); - let deserialized_block_body: BlockBody = - serde_json::from_str(&serialized_node_block_body).unwrap(); - assert_eq!(block_body, deserialized_block_body); - } - - #[proptest] - fn bincode_block_body_v1_round_trip(block_body: BlockBodyV1) { - let serialized_block_body = bincode::serialize(&block_body).unwrap(); - let casper_node_block_body: casper_types::BlockBodyV1 = - bincode::deserialize(&serialized_block_body).unwrap(); - let serialized_casper_node_block_body = - bincode::serialize(&casper_node_block_body).unwrap(); - assert_eq!(serialized_block_body, serialized_casper_node_block_body); - let deserialized_block_body: BlockBodyV1 = - bincode::deserialize(&serialized_casper_node_block_body).unwrap(); - assert_eq!(block_body, deserialized_block_body); - } - - #[proptest] - fn bincode_block_body_v2_round_trip(block_body: BlockBodyV2) { - let serialized_block_body = bincode::serialize(&block_body).unwrap(); - let casper_node_block_body: casper_types::BlockBodyV2 = - bincode::deserialize(&serialized_block_body).unwrap(); - let serialized_casper_node_block_body = - bincode::serialize(&casper_node_block_body).unwrap(); - assert_eq!(serialized_block_body, serialized_casper_node_block_body); - let deserialized_block_body: BlockBodyV2 = - bincode::deserialize(&serialized_casper_node_block_body).unwrap(); - assert_eq!(block_body, deserialized_block_body); - } - - #[proptest] - fn bincode_block_body_round_trip(block_body: BlockBody) { - let serialized_block_body = bincode::serialize(&block_body).unwrap(); - let casper_node_block_body: casper_types::BlockBody = - bincode::deserialize(&serialized_block_body).unwrap(); - let serialized_casper_node_block_body = - bincode::serialize(&casper_node_block_body).unwrap(); - assert_eq!(serialized_block_body, serialized_casper_node_block_body); - let deserialized_block_body: BlockBody = - bincode::deserialize(&serialized_casper_node_block_body).unwrap(); - assert_eq!(block_body, deserialized_block_body); - } - - #[proptest] - fn bytesrepr_block_body_v1_round_trip(block_body: BlockBodyV1) { - let serialized_block_body = block_body.to_bytes().unwrap(); - let casper_node_block_body: casper_types::BlockBodyV1 = - casper_types::bytesrepr::deserialize(serialized_block_body.clone()).unwrap(); - let serialized_casper_node_block_body = - casper_types::bytesrepr::serialize(&casper_node_block_body).unwrap(); - assert_eq!(serialized_block_body, serialized_casper_node_block_body); - let deserialized_block_body: BlockBodyV1 = - casper_types::bytesrepr::deserialize(serialized_casper_node_block_body.clone()) - .unwrap(); - assert_eq!(block_body, deserialized_block_body); - } - - #[proptest] - fn bytesrepr_block_body_v2_round_trip(block_body: BlockBodyV2) { - let serialized_block_body = block_body.to_bytes().unwrap(); - let casper_node_block_body: casper_types::BlockBodyV2 = - casper_types::bytesrepr::deserialize(serialized_block_body.clone()).unwrap(); - let serialized_casper_node_block_body = - casper_types::bytesrepr::serialize(&casper_node_block_body).unwrap(); - assert_eq!(serialized_block_body, serialized_casper_node_block_body); - let deserialized_block_body: BlockBodyV2 = - casper_types::bytesrepr::deserialize(serialized_casper_node_block_body.clone()) - .unwrap(); - assert_eq!(block_body, deserialized_block_body); - } - - #[proptest] - fn bytesrepr_block_body_round_trip(block_body: BlockBody) { - let serialized_block_body = block_body.to_bytes().unwrap(); - let casper_node_block_body: casper_types::BlockBody = - casper_types::bytesrepr::deserialize(serialized_block_body.clone()).unwrap(); - let serialized_casper_node_block_body = - casper_types::bytesrepr::serialize(&casper_node_block_body).unwrap(); - assert_eq!(serialized_block_body, serialized_casper_node_block_body); - let deserialized_block_body: BlockBody = - casper_types::bytesrepr::deserialize(serialized_casper_node_block_body.clone()) - .unwrap(); - assert_eq!(block_body, deserialized_block_body); - } - - #[proptest] - fn block_body_hash_agree(block_body: BlockBody) { - let block_body_hash = block_body.hash(); - let serialized_block_body = block_body.to_bytes().unwrap(); - let casper_node_block_body: casper_types::BlockBody = - casper_types::bytesrepr::deserialize(serialized_block_body).unwrap(); - let casper_node_block_body_hash = match casper_node_block_body { - casper_types::BlockBody::V1(v1) => v1.hash(), - casper_types::BlockBody::V2(v2) => v2.hash(), - }; - assert_eq!( - block_body_hash.as_ref(), - casper_node_block_body_hash.as_ref() - ); - } -} diff --git a/src/block_header.rs b/src/block_header.rs deleted file mode 100644 index 1ae7680..0000000 --- a/src/block_header.rs +++ /dev/null @@ -1,907 +0,0 @@ -use alloc::{string::String, vec::Vec}; - -#[cfg(test)] -use proptest::{arbitrary::Arbitrary, prelude::*}; - -use casper_types::bytesrepr::{self, FromBytes, ToBytes}; -use casper_types::{EraId, ProtocolVersion, PublicKey}; -use time::OffsetDateTime; - -use crate::consensus::EraEndV2; - -use super::consensus::EraEndV1; -use super::hash::Digest; -use super::hash::DIGEST_LENGTH; - -#[derive( - Clone, Default, Ord, PartialOrd, Eq, PartialEq, Debug, serde::Serialize, serde::Deserialize, -)] -#[cfg_attr(test, derive(proptest_derive::Arbitrary))] -// See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L648 -pub struct BlockHash(Digest); - -impl BlockHash { - pub fn to_hex(&self) -> String { - self.0.to_hex() - } -} - -impl AsRef<[u8]> for BlockHash { - fn as_ref(&self) -> &[u8] { - self.0.as_ref() - } -} - -impl From for [u8; DIGEST_LENGTH] { - fn from(block_hash: BlockHash) -> Self { - block_hash.0.into() - } -} - -impl From for Digest { - fn from(block_hash: BlockHash) -> Self { - block_hash.0 - } -} - -impl From for BlockHash { - fn from(digest: Digest) -> Self { - BlockHash(digest) - } -} - -impl From<[u8; DIGEST_LENGTH]> for BlockHash { - fn from(bytes: [u8; DIGEST_LENGTH]) -> Self { - BlockHash(Digest::from(bytes)) - } -} - -impl ToBytes for BlockHash { - fn to_bytes(&self) -> Result, casper_types::bytesrepr::Error> { - self.0.to_bytes() - } - - fn serialized_length(&self) -> usize { - self.0.serialized_length() - } -} - -impl FromBytes for BlockHash { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), casper_types::bytesrepr::Error> { - let (hash, remainder) = Digest::from_bytes(bytes)?; - let block_hash = BlockHash(hash); - Ok((block_hash, remainder)) - } -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -// See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/types/src/timestamp.rs#L32-L40 -pub struct Timestamp(u64); - -#[cfg(test)] -impl Arbitrary for Timestamp { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - (0u64..=253402300799).prop_map(Timestamp).boxed() - } -} - -impl serde::Serialize for Timestamp { - fn serialize(&self, serializer: S) -> Result { - if serializer.is_human_readable() { - let datetime = OffsetDateTime::from_unix_timestamp_nanos((self.0 * 1_000_000) as i128) - .map_err(serde::ser::Error::custom)?; - // Note: this serializes to "1970-01-01T00:00:00.000000000Z" while casper_types::Timestamp serializes to "1970-01-01T00:00:00.000Z" - // On the other hand we can deserialize both formats so it doesn't really matter. - time::serde::rfc3339::serialize(&datetime, serializer) - } else { - self.0.serialize(serializer) - } - } -} - -impl<'de> serde::Deserialize<'de> for Timestamp { - fn deserialize>(deserializer: D) -> Result { - if deserializer.is_human_readable() { - let datetime = time::serde::rfc3339::deserialize(deserializer)?; - let timestamp = datetime.unix_timestamp_nanos(); - Ok(Timestamp((timestamp as u64) / 1_000_000)) - } else { - let inner = u64::deserialize(deserializer)?; - Ok(Timestamp(inner)) - } - } -} - -// See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/types/src/timestamp.rs#L208-L216 -impl ToBytes for Timestamp { - fn to_bytes(&self) -> Result, casper_types::bytesrepr::Error> { - self.0.to_bytes() - } - - fn serialized_length(&self) -> usize { - self.0.serialized_length() - } -} - -// See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/types/src/timestamp.rs#L218-L222 -impl FromBytes for Timestamp { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), casper_types::bytesrepr::Error> { - u64::from_bytes(bytes).map(|(inner, remainder)| (Timestamp(inner), remainder)) - } -} - -#[derive(Clone, Debug, Eq, PartialEq)] -#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] -pub enum BlockHeader { - /// The legacy, initial version of the header portion of a block. - #[cfg_attr(test, serde(rename = "Version1"))] - V1(BlockHeaderV1), - /// The version 2 of the header portion of a block. - #[cfg_attr(test, serde(rename = "Version2"))] - V2(BlockHeaderV2), -} - -/// Tag for block header v1. -pub const BLOCK_HEADER_V1_TAG: u8 = 0; -/// Tag for block header v2. -pub const BLOCK_HEADER_V2_TAG: u8 = 1; - -impl BlockHeader { - /// Returns the hash of this block header. - pub fn block_hash(&self) -> BlockHash { - match self { - BlockHeader::V1(v1) => v1.block_hash(), - BlockHeader::V2(v2) => v2.block_hash(), - } - } - - /// Returns the parent block's hash. - pub fn parent_hash(&self) -> &BlockHash { - match self { - BlockHeader::V1(v1) => v1.parent_hash(), - BlockHeader::V2(v2) => v2.parent_hash(), - } - } - - /// Returns the root hash of global state after the deploys in this block have been executed. - pub fn state_root_hash(&self) -> &Digest { - match self { - BlockHeader::V1(v1) => v1.state_root_hash(), - BlockHeader::V2(v2) => v2.state_root_hash(), - } - } - - /// Returns the hash of the block's body. - pub fn body_hash(&self) -> &Digest { - match self { - BlockHeader::V1(v1) => v1.body_hash(), - BlockHeader::V2(v2) => v2.body_hash(), - } - } - - /// Returns a random bit needed for initializing a future era. - pub fn random_bit(&self) -> bool { - match self { - BlockHeader::V1(v1) => v1.random_bit(), - BlockHeader::V2(v2) => v2.random_bit(), - } - } - - /// Returns a seed needed for initializing a future era. - pub fn accumulated_seed(&self) -> &Digest { - match self { - BlockHeader::V1(v1) => v1.accumulated_seed(), - BlockHeader::V2(v2) => v2.accumulated_seed(), - } - } - - /// Returns the timestamp from when the block was proposed. - pub fn timestamp(&self) -> Timestamp { - match self { - BlockHeader::V1(v1) => v1.timestamp(), - BlockHeader::V2(v2) => v2.timestamp(), - } - } - - /// Returns the era ID in which this block was created. - pub fn era_id(&self) -> EraId { - match self { - BlockHeader::V1(v1) => v1.era_id(), - BlockHeader::V2(v2) => v2.era_id(), - } - } - - /// Returns the height of this block, i.e. the number of ancestors. - pub fn height(&self) -> u64 { - match self { - BlockHeader::V1(v1) => v1.height(), - BlockHeader::V2(v2) => v2.height(), - } - } - - /// Returns the protocol version of the network from when this block was created. - pub fn protocol_version(&self) -> ProtocolVersion { - match self { - BlockHeader::V1(v1) => v1.protocol_version(), - BlockHeader::V2(v2) => v2.protocol_version(), - } - } -} - -impl From for BlockHeader { - fn from(header: BlockHeaderV1) -> Self { - BlockHeader::V1(header) - } -} - -impl From for BlockHeader { - fn from(header: BlockHeaderV2) -> Self { - BlockHeader::V2(header) - } -} - -impl ToBytes for BlockHeader { - fn to_bytes(&self) -> Result, bytesrepr::Error> { - let mut buffer = bytesrepr::allocate_buffer(self)?; - match self { - BlockHeader::V1(v1) => { - buffer.insert(0, BLOCK_HEADER_V1_TAG); - buffer.extend(v1.to_bytes()?); - } - BlockHeader::V2(v2) => { - buffer.insert(0, BLOCK_HEADER_V2_TAG); - buffer.extend(v2.to_bytes()?); - } - } - Ok(buffer) - } - - fn serialized_length(&self) -> usize { - 1 + match self { - BlockHeader::V1(v1) => v1.serialized_length(), - BlockHeader::V2(v2) => v2.serialized_length(), - } - } -} - -impl FromBytes for BlockHeader { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { - let (tag, remainder) = u8::from_bytes(bytes)?; - match tag { - BLOCK_HEADER_V1_TAG => { - let (header, remainder): (BlockHeaderV1, _) = FromBytes::from_bytes(remainder)?; - Ok((Self::V1(header), remainder)) - } - BLOCK_HEADER_V2_TAG => { - let (header, remainder): (BlockHeaderV2, _) = FromBytes::from_bytes(remainder)?; - Ok((Self::V2(header), remainder)) - } - _ => Err(bytesrepr::Error::Formatting), - } - } -} - -#[cfg(test)] -impl Arbitrary for BlockHeader { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::().prop_map(BlockHeader::V1), - any::().prop_map(BlockHeader::V2), - ] - .boxed() - } -} - -#[derive(Clone, Eq, PartialEq, Debug)] -#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] -// See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L813-L828 -pub struct BlockHeaderV1 { - parent_hash: BlockHash, - state_root_hash: Digest, - body_hash: Digest, - random_bit: bool, - accumulated_seed: Digest, - era_end: Option, - timestamp: Timestamp, - era_id: EraId, - height: u64, - protocol_version: ProtocolVersion, -} - -impl BlockHeaderV1 { - #[allow(clippy::too_many_arguments)] - pub fn new( - parent_hash: BlockHash, - state_root_hash: Digest, - body_hash: Digest, - random_bit: bool, - accumulated_seed: Digest, - era_end: Option, - timestamp: Timestamp, - era_id: EraId, - height: u64, - protocol_version: ProtocolVersion, - ) -> Self { - BlockHeaderV1 { - parent_hash, - state_root_hash, - body_hash, - random_bit, - accumulated_seed, - era_end, - timestamp, - era_id, - height, - protocol_version, - } - } - - pub fn parent_hash(&self) -> &BlockHash { - &self.parent_hash - } - - pub fn state_root_hash(&self) -> &Digest { - &self.state_root_hash - } - - pub fn body_hash(&self) -> &Digest { - &self.body_hash - } - - pub fn random_bit(&self) -> bool { - self.random_bit - } - - pub fn accumulated_seed(&self) -> &Digest { - &self.accumulated_seed - } - - pub fn era_end(&self) -> Option<&EraEndV1> { - self.era_end.as_ref() - } - - pub fn timestamp(&self) -> Timestamp { - self.timestamp - } - - pub fn era_id(&self) -> EraId { - self.era_id - } - - pub fn height(&self) -> u64 { - self.height - } - - pub fn protocol_version(&self) -> ProtocolVersion { - self.protocol_version - } - - pub fn block_hash(&self) -> BlockHash { - BlockHash(Digest::hash(&self.to_bytes().unwrap())) - } -} - -#[cfg(test)] -fn arb_protocolversion() -> impl Strategy { - (0..=255u32, 0..=255u32, 0..=255u32) - .prop_map(|(major, minor, patch)| ProtocolVersion::from_parts(major, minor, patch)) -} - -#[cfg(test)] -impl Arbitrary for BlockHeaderV1 { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - ( - any::(), - any::(), - any::(), - any::(), - any::(), - any::>(), - any::(), - any::(), // EraId - any::(), // height - arb_protocolversion(), - ) - .prop_map( - |( - parent_hash, - state_root_hash, - body_hash, - random_bit, - accumulated_seed, - era_end, - timestamp, - era_id, - height, - protocol_version, - )| { - let era_id = EraId::from(era_id); - BlockHeaderV1 { - parent_hash, - state_root_hash, - body_hash, - random_bit, - accumulated_seed, - era_end, - timestamp, - era_id, - height, - protocol_version, - } - }, - ) - .boxed() - } -} - -impl ToBytes for BlockHeaderV1 { - fn to_bytes(&self) -> Result, casper_types::bytesrepr::Error> { - let mut buffer = casper_types::bytesrepr::allocate_buffer(self)?; - buffer.extend(self.parent_hash.to_bytes()?); - buffer.extend(self.state_root_hash.to_bytes()?); - buffer.extend(self.body_hash.to_bytes()?); - buffer.extend(self.random_bit.to_bytes()?); - buffer.extend(self.accumulated_seed.to_bytes()?); - buffer.extend(self.era_end.to_bytes()?); - buffer.extend(self.timestamp.to_bytes()?); - buffer.extend(self.era_id.to_bytes()?); - buffer.extend(self.height.to_bytes()?); - buffer.extend(self.protocol_version.to_bytes()?); - Ok(buffer) - } - - fn serialized_length(&self) -> usize { - self.parent_hash.serialized_length() - + self.state_root_hash.serialized_length() - + self.body_hash.serialized_length() - + self.random_bit.serialized_length() - + self.accumulated_seed.serialized_length() - + self.era_end.serialized_length() - + self.timestamp.serialized_length() - + self.era_id.serialized_length() - + self.height.serialized_length() - + self.protocol_version.serialized_length() - } -} - -impl FromBytes for BlockHeaderV1 { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), casper_types::bytesrepr::Error> { - let (parent_hash, remainder) = BlockHash::from_bytes(bytes)?; - let (state_root_hash, remainder) = Digest::from_bytes(remainder)?; - let (body_hash, remainder) = Digest::from_bytes(remainder)?; - let (random_bit, remainder) = bool::from_bytes(remainder)?; - let (accumulated_seed, remainder) = Digest::from_bytes(remainder)?; - let (era_end, remainder) = Option::::from_bytes(remainder)?; - let (timestamp, remainder) = Timestamp::from_bytes(remainder)?; - let (era_id, remainder) = EraId::from_bytes(remainder)?; - let (height, remainder) = u64::from_bytes(remainder)?; - let (protocol_version, remainder) = ProtocolVersion::from_bytes(remainder)?; - let block_header = BlockHeaderV1 { - parent_hash, - state_root_hash, - body_hash, - random_bit, - accumulated_seed, - era_end, - timestamp, - era_id, - height, - protocol_version, - }; - Ok((block_header, remainder)) - } -} - -/// The header portion of a block. -#[derive(Clone, Debug, PartialEq, Eq)] -#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] -pub struct BlockHeaderV2 { - /// The parent block's hash. - pub parent_hash: BlockHash, - /// The root hash of global state after the deploys in this block have been executed. - pub state_root_hash: Digest, - /// The hash of the block's body. - pub body_hash: Digest, - /// A random bit needed for initializing a future era. - pub random_bit: bool, - /// A seed needed for initializing a future era. - pub accumulated_seed: Digest, - /// The `EraEnd` of a block if it is a switch block. - pub era_end: Option, - /// The timestamp from when the block was proposed. - pub timestamp: Timestamp, - /// The era ID in which this block was created. - pub era_id: EraId, - /// The height of this block, i.e. the number of ancestors. - pub height: u64, - /// The protocol version of the network from when this block was created. - pub protocol_version: ProtocolVersion, - /// The public key of the validator which proposed the block. - pub proposer: PublicKey, - /// The gas price of the era - pub current_gas_price: u8, - /// The most recent switch block hash. - pub last_switch_block_hash: Option, -} - -impl BlockHeaderV2 { - /// Returns the hash of this block header. - pub fn block_hash(&self) -> BlockHash { - self.compute_block_hash() - } - - /// Returns the parent block's hash. - pub fn parent_hash(&self) -> &BlockHash { - &self.parent_hash - } - - /// Returns the root hash of global state after the deploys in this block have been executed. - pub fn state_root_hash(&self) -> &Digest { - &self.state_root_hash - } - - /// Returns the hash of the block's body. - pub fn body_hash(&self) -> &Digest { - &self.body_hash - } - - /// Returns a random bit needed for initializing a future era. - pub fn random_bit(&self) -> bool { - self.random_bit - } - - /// Returns a seed needed for initializing a future era. - pub fn accumulated_seed(&self) -> &Digest { - &self.accumulated_seed - } - - /// Returns the `EraEnd` of a block if it is a switch block. - pub fn era_end(&self) -> Option<&EraEndV2> { - self.era_end.as_ref() - } - - /// Returns the timestamp from when the block was proposed. - pub fn timestamp(&self) -> Timestamp { - self.timestamp - } - - /// Returns the era ID in which this block was created. - pub fn era_id(&self) -> EraId { - self.era_id - } - - /// Returns the era ID in which the next block would be created (i.e. this block's era ID, or - /// its successor if this is a switch block). - pub fn next_block_era_id(&self) -> EraId { - if self.era_end.is_some() { - self.era_id.successor() - } else { - self.era_id - } - } - - /// Returns the height of this block, i.e. the number of ancestors. - pub fn height(&self) -> u64 { - self.height - } - - /// Returns the protocol version of the network from when this block was created. - pub fn protocol_version(&self) -> ProtocolVersion { - self.protocol_version - } - - /// Returns `true` if this block is the last one in the current era. - pub fn is_switch_block(&self) -> bool { - self.era_end.is_some() - } - - /// Returns the public key of the validator which proposed the block. - pub fn proposer(&self) -> &PublicKey { - &self.proposer - } - - /// Returns `true` if this block is the Genesis block, i.e. has height 0 and era 0. - pub fn is_genesis(&self) -> bool { - self.era_id().is_genesis() && self.height() == 0 - } - - /// Returns the gas price for the given block. - pub fn current_gas_price(&self) -> u8 { - self.current_gas_price - } - - pub(crate) fn compute_block_hash(&self) -> BlockHash { - let serialized_header = self - .to_bytes() - .unwrap_or_else(|error| panic!("should serialize block header: {}", error)); - BlockHash::from(Digest::hash(&serialized_header)) - } -} - -impl ToBytes for BlockHeaderV2 { - fn write_bytes(&self, writer: &mut Vec) -> Result<(), bytesrepr::Error> { - self.parent_hash.write_bytes(writer)?; - self.state_root_hash.write_bytes(writer)?; - self.body_hash.write_bytes(writer)?; - self.random_bit.write_bytes(writer)?; - self.accumulated_seed.write_bytes(writer)?; - self.era_end.write_bytes(writer)?; - self.timestamp.write_bytes(writer)?; - self.era_id.write_bytes(writer)?; - self.height.write_bytes(writer)?; - self.protocol_version.write_bytes(writer)?; - self.proposer.write_bytes(writer)?; - self.current_gas_price.write_bytes(writer)?; - self.last_switch_block_hash.write_bytes(writer) - } - - fn to_bytes(&self) -> Result, bytesrepr::Error> { - let mut buffer = bytesrepr::allocate_buffer(self)?; - self.write_bytes(&mut buffer)?; - Ok(buffer) - } - - fn serialized_length(&self) -> usize { - self.parent_hash.serialized_length() - + self.state_root_hash.serialized_length() - + self.body_hash.serialized_length() - + self.random_bit.serialized_length() - + self.accumulated_seed.serialized_length() - + self.era_end.serialized_length() - + self.timestamp.serialized_length() - + self.era_id.serialized_length() - + self.height.serialized_length() - + self.protocol_version.serialized_length() - + self.proposer.serialized_length() - + self.current_gas_price.serialized_length() - + self.last_switch_block_hash.serialized_length() - } -} - -impl FromBytes for BlockHeaderV2 { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { - let (parent_hash, remainder) = BlockHash::from_bytes(bytes)?; - let (state_root_hash, remainder) = Digest::from_bytes(remainder)?; - let (body_hash, remainder) = Digest::from_bytes(remainder)?; - let (random_bit, remainder) = bool::from_bytes(remainder)?; - let (accumulated_seed, remainder) = Digest::from_bytes(remainder)?; - let (era_end, remainder) = Option::from_bytes(remainder)?; - let (timestamp, remainder) = Timestamp::from_bytes(remainder)?; - let (era_id, remainder) = EraId::from_bytes(remainder)?; - let (height, remainder) = u64::from_bytes(remainder)?; - let (protocol_version, remainder) = ProtocolVersion::from_bytes(remainder)?; - let (proposer, remainder) = PublicKey::from_bytes(remainder)?; - let (current_gas_price, remainder) = u8::from_bytes(remainder)?; - let (last_switch_block_hash, remainder) = Option::from_bytes(remainder)?; - let block_header = BlockHeaderV2 { - parent_hash, - state_root_hash, - body_hash, - random_bit, - accumulated_seed, - era_end, - timestamp, - era_id, - height, - protocol_version, - proposer, - current_gas_price, - last_switch_block_hash, - }; - Ok((block_header, remainder)) - } -} - -#[cfg(test)] -impl Arbitrary for BlockHeaderV2 { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - ( - // this tuple is needed because prop_map only supports tuples of arity <= 12 - (any::(), any::()), - any::(), - any::(), - any::(), - any::>(), - any::(), - any::(), - any::(), - arb_protocolversion(), - casper_types::crypto::gens::public_key_arb(), - 0..=255u8, - any::>(), - ) - .prop_map( - |( - (parent_hash, state_root_hash), - body_hash, - random_bit, - accumulated_seed, - era_end, - timestamp, - era_id, - height, - protocol_version, - proposer, - current_gas_price, - last_switch_block_hash, - )| { - let era_id = EraId::from(era_id); - BlockHeaderV2 { - parent_hash, - state_root_hash, - body_hash, - random_bit, - accumulated_seed, - era_end, - timestamp, - era_id, - height, - protocol_version, - proposer, - current_gas_price, - last_switch_block_hash, - } - }, - ) - .boxed() - } -} - -#[cfg(test)] -mod test { - extern crate std; - - use alloc::borrow::ToOwned; - use casper_types::bytesrepr::{deserialize_from_slice, ToBytes}; - use test_strategy::proptest; - - use super::{BlockHeaderV1, Timestamp}; - - #[proptest] - fn serde_json_timestamp_round_trip(timestamp: Timestamp) { - let serialized_timestamp = serde_json::to_string(×tamp).unwrap(); - let casper_types_timestamp: casper_types::Timestamp = - serde_json::from_str(&serialized_timestamp).unwrap(); - let serialized_casper_types_timestamp = - serde_json::to_string(&casper_types_timestamp).unwrap(); - // Below is busted because we serialize to "1970-01-01T00:00:00Z" while casper_types::Timestamp serializes to "1970-01-01T00:00:00.000Z" - // assert_eq!(serialized_timestamp, serialized_casper_types_timestamp); - let deserialized_timestamp: Timestamp = - serde_json::from_str(&serialized_casper_types_timestamp).unwrap(); - assert_eq!(timestamp, deserialized_timestamp); - } - - #[proptest] - fn bincode_timestamp_round_trip(timestamp: Timestamp) { - let serialized_timestamp = bincode::serialize(×tamp).unwrap(); - let casper_types_timestamp: casper_types::Timestamp = - bincode::deserialize(&serialized_timestamp).unwrap(); - let serialized_casper_types_timestamp = - bincode::serialize(&casper_types_timestamp).unwrap(); - assert_eq!(serialized_timestamp, serialized_casper_types_timestamp); - let deserialized_timestamp: Timestamp = - bincode::deserialize(&serialized_casper_types_timestamp).unwrap(); - assert_eq!(timestamp, deserialized_timestamp); - } - - #[proptest] - fn bytesrepr_timestamp_round_trip(timestamp: Timestamp) { - let serialized_timestamp = timestamp.to_bytes().unwrap(); - let casper_types_timestamp: casper_types::Timestamp = - deserialize_from_slice(&serialized_timestamp).unwrap(); - let serialized_casper_types_timestamp = casper_types_timestamp.to_bytes().unwrap(); - let deserialized_timestamp: Timestamp = - deserialize_from_slice(&serialized_casper_types_timestamp).unwrap(); - assert_eq!(timestamp, deserialized_timestamp) - } - - #[proptest] - fn serde_json_block_header_v1_round_trip(block_header: BlockHeaderV1) { - let serialized_block_header = serde_json::to_string(&block_header).unwrap(); - let casper_node_block_header: casper_types::BlockHeaderV1 = - serde_json::from_str(&serialized_block_header).unwrap(); - let serialized_casper_node_block_header = - serde_json::to_string(&casper_node_block_header).unwrap(); - let deserialized_block_header: BlockHeaderV1 = - serde_json::from_str(&serialized_casper_node_block_header).unwrap(); - assert_eq!(block_header, deserialized_block_header); - } - - #[proptest] - fn serde_json_block_header_round_trip(block_header: super::BlockHeader) { - let serialized_block_header = serde_json::to_string(&block_header).unwrap(); - let casper_node_block_header: casper_types::BlockHeader = - serde_json::from_str(&serialized_block_header).unwrap(); - let serialized_casper_node_block_header = - serde_json::to_string(&casper_node_block_header).unwrap(); - let deserialized_block_header: super::BlockHeader = - serde_json::from_str(&serialized_casper_node_block_header).unwrap(); - assert_eq!(block_header, deserialized_block_header); - } - - #[proptest] - fn bincode_block_header_v1_round_trip(block_header: BlockHeaderV1) { - let serialized_block_header = bincode::serialize(&block_header).unwrap(); - let casper_node_block_header: casper_types::BlockHeaderV1 = - bincode::deserialize(&serialized_block_header).unwrap(); - let serialized_casper_node_block_header = - bincode::serialize(&casper_node_block_header).unwrap(); - assert_eq!(serialized_block_header, serialized_casper_node_block_header); - let deserialized_block_header: BlockHeaderV1 = - bincode::deserialize(&serialized_casper_node_block_header).unwrap(); - assert_eq!(block_header, deserialized_block_header); - } - - #[proptest] - fn bincode_block_header_round_trip(block_header: super::BlockHeader) { - let serialized_block_header = bincode::serialize(&block_header).unwrap(); - let casper_node_block_header: casper_types::BlockHeader = - bincode::deserialize(&serialized_block_header).unwrap(); - let serialized_casper_node_block_header = - bincode::serialize(&casper_node_block_header).unwrap(); - assert_eq!(serialized_block_header, serialized_casper_node_block_header); - let deserialized_block_header: super::BlockHeader = - bincode::deserialize(&serialized_casper_node_block_header).unwrap(); - assert_eq!(block_header, deserialized_block_header); - } - - #[proptest] - fn bytesrepr_block_header_v1_round_trip(block_header: BlockHeaderV1) { - let serialized_block_header = block_header.to_bytes().unwrap(); - let casper_node_block_header: casper_types::BlockHeaderV1 = - deserialize_from_slice(&serialized_block_header).unwrap(); - let serialized_casper_node_block_header = casper_node_block_header.to_bytes().unwrap(); - assert_eq!(serialized_block_header, serialized_casper_node_block_header); - let deserialized_block_header: BlockHeaderV1 = - deserialize_from_slice(&serialized_casper_node_block_header).unwrap(); - assert_eq!(block_header, deserialized_block_header) - } - - #[proptest] - fn bytesrepr_block_header_round_trip(block_header: super::BlockHeader) { - let serialized_block_header = block_header.to_bytes().unwrap(); - let casper_node_block_header: casper_types::BlockHeader = - deserialize_from_slice(&serialized_block_header).unwrap(); - let serialized_casper_node_block_header = casper_node_block_header.to_bytes().unwrap(); - assert_eq!(serialized_block_header, serialized_casper_node_block_header); - let deserialized_block_header: super::BlockHeader = - deserialize_from_slice(&serialized_casper_node_block_header).unwrap(); - assert_eq!(block_header, deserialized_block_header) - } - - #[proptest] - fn block_header_v1_hash_agree(block_header: BlockHeaderV1) { - let casper_node_block_header: casper_types::BlockHeaderV1 = - deserialize_from_slice(block_header.to_bytes().unwrap()).unwrap(); - let block_hash = block_header.block_hash(); - let casper_block_hash = casper_node_block_header.block_hash(); - assert_eq!( - <[u8; 32]>::from(block_hash).to_vec(), - casper_block_hash.as_ref().to_owned() - ); - } - - #[proptest] - fn block_header_hash_agree(block_header: super::BlockHeader) { - let casper_node_block_header: casper_types::BlockHeader = - deserialize_from_slice(block_header.to_bytes().unwrap()).unwrap(); - let block_hash = block_header.block_hash(); - let casper_block_hash = casper_node_block_header.block_hash(); - assert_eq!( - <[u8; 32]>::from(block_hash).to_vec(), - casper_block_hash.as_ref().to_owned() - ); - } -} diff --git a/src/consensus.rs b/src/consensus.rs index e02eaac..8da27d7 100644 --- a/src/consensus.rs +++ b/src/consensus.rs @@ -1,4 +1,4 @@ -use alloc::{collections::BTreeMap, vec::Vec}; +use std::{collections::BTreeMap, vec::Vec}; #[cfg(test)] use proptest::prelude::*; diff --git a/src/crypto.rs b/src/crypto.rs index 8a79e3c..ec44246 100644 --- a/src/crypto.rs +++ b/src/crypto.rs @@ -54,7 +54,6 @@ pub fn verify>( mod test { extern crate std; - use alloc::vec::Vec; use casper_types::PublicKey as CasperPublicKey; use casper_types::SecretKey as CasperSecretKey; use ed25519_dalek::SigningKey as Ed25519SecretKey; diff --git a/src/hash.rs b/src/hash.rs index 439fe21..b54e813 100644 --- a/src/hash.rs +++ b/src/hash.rs @@ -1,6 +1,6 @@ -use alloc::{string::String, vec::Vec}; use casper_types::bytesrepr::{FromBytes, ToBytes}; use itertools::Itertools; +use std::{string::String, vec::Vec}; pub const DIGEST_LENGTH: usize = 32; const SENTINEL_MERKLE_TREE: Digest = Digest([2u8; DIGEST_LENGTH]); @@ -148,8 +148,8 @@ impl<'de> serde::Deserialize<'de> for Digest { mod test { extern crate std; - use alloc::vec::Vec; use casper_types::bytesrepr::{deserialize_from_slice, ToBytes}; + use std::vec::Vec; use test_strategy::proptest; use super::{Digest, DIGEST_LENGTH}; diff --git a/src/json_compatibility.rs b/src/json_compatibility.rs deleted file mode 100644 index 4ae6757..0000000 --- a/src/json_compatibility.rs +++ /dev/null @@ -1,442 +0,0 @@ -// See https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L2072 - -use alloc::vec::Vec; - -use casper_types::{EraId, ProtocolVersion, PublicKey, Signature, U512}; -use serde::{Deserialize, Serialize}; - -use crate::{ - block::{ - Block, BlockBodyV1, BlockConstructionError, BlockHeaderWithSignatures, - BlockHeaderWithSignaturesConstructionError, BlockSignatures, - }, - block_header::{BlockHash, BlockHeaderV1, Timestamp}, - consensus::{EraEndV1, EraReport}, - crypto::SignatureVerificationError, - hash::Digest, -}; - -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[serde(deny_unknown_fields)] -pub struct Reward { - validator: PublicKey, - amount: u64, -} - -impl Reward { - pub fn validator(&self) -> &PublicKey { - &self.validator - } - - pub fn amount(&self) -> u64 { - self.amount - } -} - -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[serde(deny_unknown_fields)] -pub struct ValidatorWeight { - validator: PublicKey, - weight: U512, -} - -impl ValidatorWeight { - pub fn validator(&self) -> &PublicKey { - &self.validator - } - - pub fn weight(&self) -> U512 { - self.weight - } -} - -/// Equivocation and reward information to be included in the terminal block. -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[serde(deny_unknown_fields)] -pub struct JsonEraReport { - equivocators: Vec, - rewards: Vec, - inactive_validators: Vec, -} - -impl JsonEraReport { - pub fn equivocators(&self) -> &Vec { - &self.equivocators - } - - pub fn rewards(&self) -> &Vec { - &self.rewards - } - - pub fn inactive_validators(&self) -> &Vec { - &self.inactive_validators - } -} - -impl From for JsonEraReport { - fn from(era_report: EraReport) -> Self { - let EraReport { - equivocators, - rewards, - inactive_validators, - } = era_report; - let rewards = rewards - .into_iter() - .map(|(validator, amount)| Reward { validator, amount }) - .collect(); - JsonEraReport { - equivocators, - rewards, - inactive_validators, - } - } -} - -impl From for EraReport { - fn from(era_report: JsonEraReport) -> Self { - let JsonEraReport { - equivocators, - rewards, - inactive_validators, - } = era_report; - let rewards = rewards - .into_iter() - .map(|reward| (reward.validator, reward.amount)) - .collect(); - EraReport { - equivocators, - rewards, - inactive_validators, - } - } -} - -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[serde(deny_unknown_fields)] -pub struct JsonEraEnd { - era_report: JsonEraReport, - next_era_validator_weights: Vec, -} - -impl JsonEraEnd { - pub fn era_report(&self) -> &JsonEraReport { - &self.era_report - } - - pub fn next_era_validator_weights(&self) -> &Vec { - &self.next_era_validator_weights - } -} - -impl From for JsonEraEnd { - fn from(era_end: EraEndV1) -> Self { - let era_report = JsonEraReport::from(era_end.era_report); - let next_era_validator_weights = era_end - .next_era_validator_weights - .iter() - .map(|(validator, weight)| ValidatorWeight { - validator: validator.clone(), - weight: *weight, - }) - .collect(); - JsonEraEnd { - era_report, - next_era_validator_weights, - } - } -} - -impl From for EraEndV1 { - fn from(json_data: JsonEraEnd) -> Self { - let era_report = EraReport::from(json_data.era_report); - let next_era_validator_weights = json_data - .next_era_validator_weights - .iter() - .map(|validator_weight| (validator_weight.validator.clone(), validator_weight.weight)) - .collect(); - EraEndV1 { - era_report, - next_era_validator_weights, - } - } -} - -/// JSON representation of a block header. -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[serde(deny_unknown_fields)] -pub struct JsonBlockHeader { - parent_hash: BlockHash, - state_root_hash: Digest, - body_hash: Digest, - random_bit: bool, - accumulated_seed: Digest, - era_end: Option, - timestamp: Timestamp, - era_id: EraId, - height: u64, - protocol_version: ProtocolVersion, -} - -impl JsonBlockHeader { - pub fn parent_hash(&self) -> &BlockHash { - &self.parent_hash - } - - pub fn state_root_hash(&self) -> &Digest { - &self.state_root_hash - } - - pub fn body_hash(&self) -> &Digest { - &self.body_hash - } - - pub fn random_bit(&self) -> bool { - self.random_bit - } - - pub fn accumulated_seed(&self) -> &Digest { - &self.accumulated_seed - } - - pub fn era_end(&self) -> Option<&JsonEraEnd> { - self.era_end.as_ref() - } - - pub fn timestamp(&self) -> Timestamp { - self.timestamp - } - - pub fn era_id(&self) -> EraId { - self.era_id - } - - pub fn height(&self) -> u64 { - self.height - } - - pub fn protocol_version(&self) -> ProtocolVersion { - self.protocol_version - } -} - -impl From for JsonBlockHeader { - fn from(block_header: BlockHeaderV1) -> Self { - JsonBlockHeader { - parent_hash: block_header.parent_hash().clone(), - state_root_hash: block_header.state_root_hash().clone(), - body_hash: block_header.body_hash().clone(), - random_bit: block_header.random_bit(), - accumulated_seed: block_header.accumulated_seed().clone(), - era_end: block_header.era_end().cloned().map(JsonEraEnd::from), - timestamp: block_header.timestamp(), - era_id: block_header.era_id(), - height: block_header.height(), - protocol_version: block_header.protocol_version(), - } - } -} - -impl From for BlockHeaderV1 { - fn from(block_header: JsonBlockHeader) -> Self { - let JsonBlockHeader { - parent_hash, - state_root_hash, - body_hash, - random_bit, - accumulated_seed, - era_end, - timestamp, - era_id, - height, - protocol_version, - } = block_header; - let era_end = era_end.map(EraEndV1::from); - BlockHeaderV1::new( - parent_hash, - state_root_hash, - body_hash, - random_bit, - accumulated_seed, - era_end, - timestamp, - era_id, - height, - protocol_version, - ) - } -} - -/// A JSON-friendly representation of a proof, i.e. a block's finality signature. -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[serde(deny_unknown_fields)] -pub struct JsonProof { - public_key: PublicKey, - signature: Signature, -} - -impl JsonProof { - pub fn public_key(&self) -> &PublicKey { - &self.public_key - } - - pub fn signature(&self) -> &Signature { - &self.signature - } -} - -impl From<(PublicKey, Signature)> for JsonProof { - fn from((public_key, signature): (PublicKey, Signature)) -> JsonProof { - JsonProof { - public_key, - signature, - } - } -} - -impl From for (PublicKey, Signature) { - fn from(proof: JsonProof) -> (PublicKey, Signature) { - (proof.public_key, proof.signature) - } -} - -/// A JSON-friendly representation of `Block`. -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[serde(deny_unknown_fields)] -pub struct JsonBlock { - hash: BlockHash, - header: JsonBlockHeader, - body: BlockBodyV1, - proofs: Vec, -} - -impl JsonBlock { - pub fn hash(&self) -> &BlockHash { - &self.hash - } - - pub fn header(&self) -> &JsonBlockHeader { - &self.header - } - - pub fn body(&self) -> &BlockBodyV1 { - &self.body - } - - pub fn proofs(&self) -> &Vec { - &self.proofs - } -} - -impl From for JsonBlock { - fn from(block: Block) -> Self { - let hash = block - .block_header_with_signatures() - .block_header() - .block_hash(); - let header = - JsonBlockHeader::from(block.block_header_with_signatures().block_header().clone()); - let proofs = block - .block_header_with_signatures() - .block_signatures() - .proofs() - .iter() - .map(|(pubkey, signature)| JsonProof::from((pubkey.clone(), *signature))) - .collect(); - JsonBlock { - hash, - header, - body: block.body().clone(), - proofs, - } - } -} - -#[derive(Debug)] -pub enum JsonBlockConversionError { - InvalidBlockHash { - block_hash: BlockHash, - header_hash: BlockHash, - }, - InvalidBlockBodyHash { - actual_body_hash: Digest, - header_body_hash: Digest, - }, - SignatureVerificationError(SignatureVerificationError), - BlockHeaderWithSignaturesConstructionError(BlockHeaderWithSignaturesConstructionError), - BlockConstructionError(BlockConstructionError), -} - -impl TryFrom for Block { - type Error = JsonBlockConversionError; - - fn try_from(json_block: JsonBlock) -> Result { - let JsonBlock { - hash: block_hash, - header, - body, - proofs, - } = json_block; - let block_header = BlockHeaderV1::from(header); - let header_hash = block_header.block_hash(); - if block_hash != header_hash { - return Err(JsonBlockConversionError::InvalidBlockHash { - block_hash, - header_hash, - }); - } - let block_signatures = BlockSignatures::new( - header_hash, - block_header.era_id(), - proofs - .into_iter() - .map(|proof| (proof.public_key, proof.signature)) - .collect(), - ) - .map_err(JsonBlockConversionError::SignatureVerificationError)?; - let actual_body_hash = body.hash(); - if actual_body_hash != *block_header.body_hash() { - return Err(JsonBlockConversionError::InvalidBlockBodyHash { - actual_body_hash, - header_body_hash: block_header.body_hash().clone(), - }); - } - let header = BlockHeaderWithSignatures::new(block_header, block_signatures) - .map_err(JsonBlockConversionError::BlockHeaderWithSignaturesConstructionError)?; - Block::new(header, body).map_err(JsonBlockConversionError::BlockConstructionError) - } -} - -#[cfg(test)] -mod test { - extern crate std; - - use test_strategy::proptest; - - use crate::{ - block_header::BlockHeaderV1, - consensus::{EraEndV1, EraReport}, - }; - - use super::{JsonBlockHeader, JsonEraEnd, JsonEraReport}; - - #[proptest] - fn era_report_round_trip(era_report: EraReport) { - let json_era_report = JsonEraReport::from(era_report.clone()); - let round_trip_era_report = EraReport::from(json_era_report); - assert_eq!(era_report, round_trip_era_report); - } - - #[proptest] - fn era_end_round_trip(era_end: EraEndV1) { - let json_era_end = JsonEraEnd::from(era_end.clone()); - let round_trip_era_end = EraEndV1::from(json_era_end); - assert_eq!(era_end, round_trip_era_end); - } - - #[proptest] - fn block_header_round_trip(block_header: BlockHeaderV1) { - let json_block_header = JsonBlockHeader::from(block_header.clone()); - let round_trip_block_header = BlockHeaderV1::from(json_block_header); - assert_eq!(block_header, round_trip_block_header); - } -} diff --git a/src/kernel.rs b/src/kernel.rs index 3ab6814..d5aa28a 100644 --- a/src/kernel.rs +++ b/src/kernel.rs @@ -1,10 +1,8 @@ -use alloc::collections::BTreeMap; use casper_types::{EraId, JsonBlockWithSignatures, PublicKey, U512}; +use std::collections::BTreeMap; use crate::crypto::{verify, SignatureVerificationError}; -use super::block_header::BlockHash; - pub struct EraInfo { era_id: EraId, validator_weights: BTreeMap, @@ -83,18 +81,3 @@ impl EraInfo { }) } } - -pub struct ParentHashAndCurrentHeight { - parent_hash: BlockHash, - current_height: u64, -} - -impl ParentHashAndCurrentHeight { - pub fn parent_hash(&self) -> &BlockHash { - &self.parent_hash - } - - pub fn current_height(&self) -> u64 { - self.current_height - } -} diff --git a/src/lib.rs b/src/lib.rs index 91ca54f..041f612 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,13 +1,5 @@ -#![no_std] - -extern crate alloc; -extern crate core; - -pub mod block; -pub mod block_header; pub mod consensus; pub(crate) mod crypto; pub mod hash; -pub mod json_compatibility; pub mod kernel; pub mod merkle_proof; diff --git a/src/merkle_proof.rs b/src/merkle_proof.rs index 8f901ee..12ea428 100644 --- a/src/merkle_proof.rs +++ b/src/merkle_proof.rs @@ -2,7 +2,7 @@ // and https://github.com/casper-network/casper-node/blob/76ea7104cda02fcf1bd6edb686fd00b162dabde8/execution_engine/src/storage/trie/merkle_proof.rs use core::mem::MaybeUninit; -use alloc::{boxed::Box, string::String, vec::Vec}; +use std::{boxed::Box, string::String, vec::Vec}; use casper_types::{ bytesrepr::{self, Bytes, FromBytes, ToBytes, U8_SERIALIZED_LENGTH}, @@ -465,9 +465,7 @@ impl Arbitrary for TrieMerkleProof { casper_types::gens::stored_value_arb(), proptest::collection::vec(::arbitrary(), 1..=6), ) - .prop_map(|(key, value, proof_steps)| { - TrieMerkleProof::new(key, value, proof_steps) - }) + .prop_map(|(key, value, proof_steps)| TrieMerkleProof::new(key, value, proof_steps)) .boxed() } } diff --git a/tests/integration.rs b/tests/integration.rs index a72274c..3976d05 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -1,17 +1,4 @@ -use casper_litmus::{ - block_header::BlockHeaderV1, - json_compatibility::{JsonBlock, JsonBlockHeader}, - merkle_proof::{process_query_proofs, TrieMerkleProof}, -}; - -#[test] -fn json_block_header_round_trip() { - let json_block: JsonBlock = - serde_json::from_str(include_str!("assets/blocks/block-0.json")).unwrap(); - let converted_block_header = BlockHeaderV1::from(json_block.header().clone()); - let reconstituted_json_block_header = JsonBlockHeader::from(converted_block_header.clone()); - assert_eq!(json_block.header(), &reconstituted_json_block_header); -} +use casper_litmus::merkle_proof::{process_query_proofs, TrieMerkleProof}; #[test] fn query_proofs() { From 5b1cda12786c22f5bf629241e23a0f44f7aaa92c Mon Sep 17 00:00:00 2001 From: Avi Dessauer Date: Mon, 16 Sep 2024 20:32:00 -0700 Subject: [PATCH 05/12] Re-export `casper_types` crate --- src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 041f612..125c6a3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,3 +3,5 @@ pub(crate) mod crypto; pub mod hash; pub mod kernel; pub mod merkle_proof; +/// Re-export of `casper_types` crate to allow library consumers to match the version easily. +pub use casper_types; From 70692cae62079188e5181938d6cb2e98ef6a6819 Mon Sep 17 00:00:00 2001 From: Avi Dessauer Date: Mon, 16 Sep 2024 22:11:37 -0700 Subject: [PATCH 06/12] Reuse the merkle proof logic from casper-storage --- Cargo.toml | 2 +- src/merkle_proof.rs | 297 ++----------------------------------------- tests/integration.rs | 2 +- 3 files changed, 13 insertions(+), 288 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9666963..97e299e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" base16 = { version = "0.2.1", default-features = false, features = ["alloc"] } blake2b_simd = { version = "1.0.2", default-features = false } casper-types = { git = "https://github.com/casper-network/casper-node.git", branch = "feat-2.0", features = ["datasize", "json-schema", "std"] } +casper-storage = { git = "https://github.com/casper-network/casper-node.git", branch = "feat-2.0" } ed25519-dalek = { version = "2.0.0", default-features = false, features = [ "alloc", "zeroize", @@ -27,7 +28,6 @@ time = { version = "0.3.31", default-features = false, features = [ [dev-dependencies] bincode = "1.3.3" casper-execution-engine = { git = "https://github.com/casper-network/casper-node.git", branch = "feat-2.0" } -casper-storage = { git = "https://github.com/casper-network/casper-node.git", branch = "feat-2.0" } hex = "0.4.3" once_cell = "1.19.0" serde_json = "1.0.111" diff --git a/src/merkle_proof.rs b/src/merkle_proof.rs index 12ea428..1e4e96c 100644 --- a/src/merkle_proof.rs +++ b/src/merkle_proof.rs @@ -4,17 +4,18 @@ use core::mem::MaybeUninit; use std::{boxed::Box, string::String, vec::Vec}; +use casper_storage::global_state::trie_store::operations::compute_state_hash; +pub use casper_types::global_state::{TrieMerkleProof, TrieMerkleProofStep}; + use casper_types::{ bytesrepr::{self, Bytes, FromBytes, ToBytes, U8_SERIALIZED_LENGTH}, - CLValueError, Key, StoredValue, + CLValueError, Digest, Key, StoredValue, }; #[cfg(test)] use proptest::prelude::*; -use super::hash::{Digest, DIGEST_LENGTH}; +use super::hash::DIGEST_LENGTH; -const TRIE_MERKLE_PROOF_STEP_NODE_ID: u8 = 0; -const TRIE_MERKLE_PROOF_STEP_EXTENSION_ID: u8 = 1; const RADIX: usize = 256; #[derive(Debug, Clone, PartialEq, Eq)] @@ -39,8 +40,8 @@ impl Arbitrary for Pointer { fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { prop_oneof![ - any::().prop_map(Pointer::LeafPointer), - any::().prop_map(Pointer::NodePointer) + any::<[u8; DIGEST_LENGTH]>().prop_map(|h| Pointer::LeafPointer(Digest::from_raw(h))), + any::<[u8; DIGEST_LENGTH]>().prop_map(|h| Pointer::NodePointer(Digest::from_raw(h))), ] .boxed() } @@ -179,6 +180,7 @@ impl FromBytes for PointerBlock { } } +// FIXME not sure if this is used anywhere? #[derive(Debug, Clone, PartialEq, Eq)] pub enum Trie { Leaf { key: Key, value: StoredValue }, @@ -273,235 +275,6 @@ impl ToBytes for Trie { } } -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum TrieMerkleProofStep { - Node { - hole_index: u8, - indexed_pointers_with_hole: Vec<(u8, Pointer)>, - }, - Extension { - affix: Bytes, - }, -} - -impl TrieMerkleProofStep { - pub fn node(hole_index: u8, indexed_pointers_with_hole: Vec<(u8, Pointer)>) -> Self { - Self::Node { - hole_index, - indexed_pointers_with_hole, - } - } - - pub fn extension(affix: Vec) -> Self { - Self::Extension { - affix: affix.into(), - } - } -} - -#[cfg(test)] -impl Arbitrary for TrieMerkleProofStep { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - prop_oneof![ - ( - ::arbitrary(), - proptest::collection::vec((::arbitrary(), ::arbitrary()), RADIX / 8) - ) - .prop_map(|(hole_index, indexed_pointers_with_hole)| { - TrieMerkleProofStep::Node { - hole_index, - indexed_pointers_with_hole, - } - }), - proptest::collection::vec(::arbitrary(), 1..=6).prop_map(|affix| { - TrieMerkleProofStep::Extension { - affix: affix.into(), - } - }) - ] - .boxed() - } -} - -impl ToBytes for TrieMerkleProofStep { - fn to_bytes(&self) -> Result, bytesrepr::Error> { - let mut ret: Vec = bytesrepr::allocate_buffer(self)?; - match self { - TrieMerkleProofStep::Node { - hole_index, - indexed_pointers_with_hole, - } => { - ret.push(TRIE_MERKLE_PROOF_STEP_NODE_ID); - ret.push(*hole_index); - ret.append(&mut indexed_pointers_with_hole.to_bytes()?) - } - TrieMerkleProofStep::Extension { affix } => { - ret.push(TRIE_MERKLE_PROOF_STEP_EXTENSION_ID); - ret.append(&mut affix.to_bytes()?) - } - }; - Ok(ret) - } - - fn serialized_length(&self) -> usize { - core::mem::size_of::() - + match self { - TrieMerkleProofStep::Node { - hole_index, - indexed_pointers_with_hole, - } => { - (*hole_index).serialized_length() - + (*indexed_pointers_with_hole).serialized_length() - } - TrieMerkleProofStep::Extension { affix } => affix.serialized_length(), - } - } -} - -impl FromBytes for TrieMerkleProofStep { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { - let (tag, rem): (u8, &[u8]) = FromBytes::from_bytes(bytes)?; - match tag { - TRIE_MERKLE_PROOF_STEP_NODE_ID => { - let (hole_index, rem): (u8, &[u8]) = FromBytes::from_bytes(rem)?; - let (indexed_pointers_with_hole, rem): (Vec<(u8, Pointer)>, &[u8]) = - FromBytes::from_bytes(rem)?; - Ok(( - TrieMerkleProofStep::Node { - hole_index, - indexed_pointers_with_hole, - }, - rem, - )) - } - TRIE_MERKLE_PROOF_STEP_EXTENSION_ID => { - let (affix, rem): (_, &[u8]) = FromBytes::from_bytes(rem)?; - Ok((TrieMerkleProofStep::Extension { affix }, rem)) - } - _ => Err(bytesrepr::Error::Formatting), - } - } -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct TrieMerkleProof { - key: Key, - value: StoredValue, - proof_steps: Vec, -} - -impl TrieMerkleProof { - pub fn new(key: Key, value: StoredValue, proof_steps: Vec) -> Self { - TrieMerkleProof { - key, - value, - proof_steps, - } - } - - pub fn key(&self) -> &Key { - &self.key - } - - pub fn value(&self) -> &StoredValue { - &self.value - } - - pub fn proof_steps(&self) -> &Vec { - &self.proof_steps - } - - pub fn into_value(self) -> StoredValue { - self.value - } - - pub fn compute_state_hash(&self) -> Result { - let mut hash = { - let leaf = Trie::Leaf { - key: self.key, - value: self.value.clone(), - }; - leaf.trie_hash()? - }; - - for (proof_step_index, proof_step) in self.proof_steps.iter().enumerate() { - let pointer = if proof_step_index == 0 { - Pointer::LeafPointer(hash) - } else { - Pointer::NodePointer(hash) - }; - let proof_step_bytes = match proof_step { - TrieMerkleProofStep::Node { - hole_index, - indexed_pointers_with_hole, - } => { - let hole_index = *hole_index; - assert!(hole_index as usize <= RADIX, "hole_index exceeded RADIX"); - let mut indexed_pointers = indexed_pointers_with_hole.clone(); - indexed_pointers.push((hole_index, pointer)); - Trie::node(&indexed_pointers).to_bytes()? - } - TrieMerkleProofStep::Extension { affix } => { - Trie::extension(affix.clone().into(), pointer).to_bytes()? - } - }; - hash = Digest::hash(&proof_step_bytes); - } - Ok(hash) - } -} - -#[cfg(test)] -impl Arbitrary for TrieMerkleProof { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - ( - casper_types::gens::key_arb(), - casper_types::gens::stored_value_arb(), - proptest::collection::vec(::arbitrary(), 1..=6), - ) - .prop_map(|(key, value, proof_steps)| TrieMerkleProof::new(key, value, proof_steps)) - .boxed() - } -} - -impl ToBytes for TrieMerkleProof { - fn to_bytes(&self) -> Result, bytesrepr::Error> { - let mut ret: Vec = bytesrepr::allocate_buffer(self)?; - ret.append(&mut self.key.to_bytes()?); - ret.append(&mut self.value.to_bytes()?); - ret.append(&mut self.proof_steps.to_bytes()?); - Ok(ret) - } - - fn serialized_length(&self) -> usize { - self.key.serialized_length() - + self.value.serialized_length() - + self.proof_steps.serialized_length() - } -} - -impl FromBytes for TrieMerkleProof { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { - let (key, rem): (Key, &[u8]) = FromBytes::from_bytes(bytes)?; - let (value, rem): (StoredValue, &[u8]) = FromBytes::from_bytes(rem)?; - let (proof_steps, rem): (Vec, &[u8]) = FromBytes::from_bytes(rem)?; - Ok(( - TrieMerkleProof { - key, - value, - proof_steps, - }, - rem, - )) - } -} - #[derive(Debug, PartialEq, Eq)] pub enum ValidationError { PathLengthDifferentThanProofLessOne, @@ -548,7 +321,7 @@ impl<'a, 'b> QueryInfo<'a, 'b> { } pub fn process_query_proofs<'a>( - proofs: &'a [TrieMerkleProof], + proofs: &'a [TrieMerkleProof], path: &[String], ) -> Result, ValidationError> { if proofs.len() != path.len() + 1 { @@ -560,7 +333,7 @@ pub fn process_query_proofs<'a>( // length check above means we are safe to unwrap here let first_proof = proofs_iter.next().unwrap(); - let state_root = first_proof.compute_state_hash()?; + let state_root = compute_state_hash(first_proof)?; let mut proof_value = first_proof.value(); @@ -580,7 +353,7 @@ pub fn process_query_proofs<'a>( return Err(ValidationError::UnexpectedKey); } - if state_root != proof.compute_state_hash()? { + if state_root != compute_state_hash(proof)? { return Err(ValidationError::InvalidProofHash); } @@ -593,51 +366,3 @@ pub fn process_query_proofs<'a>( stored_value: proof_value, }) } - -#[cfg(test)] -mod test { - extern crate std; - - use casper_types::global_state::TrieMerkleProof as CasperTrieMerkleProof; - use casper_types::{bytesrepr::ToBytes, Key, StoredValue}; - use test_strategy::proptest; - - use crate::hash::DIGEST_LENGTH; - - use super::TrieMerkleProof; - - #[proptest] - fn bytesrepr_trie_merkle_proof_round_trip(trie_merkle_proof: TrieMerkleProof) { - let serialized_trie_merkle_proof = trie_merkle_proof.to_bytes().unwrap(); - let casper_trie_merkle_proof: CasperTrieMerkleProof = - casper_types::bytesrepr::deserialize(serialized_trie_merkle_proof.clone()).unwrap(); - let serialized_casper_trie_merkle_proof = - casper_types::bytesrepr::serialize(&casper_trie_merkle_proof).unwrap(); - assert_eq!( - serialized_trie_merkle_proof, - serialized_casper_trie_merkle_proof - ); - let deserialized_trie_merkle_proof: TrieMerkleProof = - casper_types::bytesrepr::deserialize(serialized_casper_trie_merkle_proof.clone()) - .unwrap(); - assert_eq!(trie_merkle_proof, deserialized_trie_merkle_proof); - } - - #[proptest] - fn trie_merkle_proof_hash_compat(trie_merkle_proof: TrieMerkleProof) { - let serialized_trie_merkle_proof = trie_merkle_proof.to_bytes().unwrap(); - let casper_trie_merkle_proof: CasperTrieMerkleProof = - casper_types::bytesrepr::deserialize(serialized_trie_merkle_proof.clone()).unwrap(); - let trie_merkle_root_bytes: [u8; DIGEST_LENGTH] = - trie_merkle_proof.compute_state_hash().unwrap().into(); - - let casper_trie_merkle_root_bytes: [u8; DIGEST_LENGTH] = - casper_storage::global_state::trie_store::operations::compute_state_hash( - &casper_trie_merkle_proof, - ) - .unwrap() - .into(); - - assert_eq!(trie_merkle_root_bytes, casper_trie_merkle_root_bytes); - } -} diff --git a/tests/integration.rs b/tests/integration.rs index 3976d05..f30261b 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -9,7 +9,7 @@ fn query_proofs() { let query_info = process_query_proofs(&proofs, &[]).unwrap(); assert_eq!( "9253bf8484bae2b6e4d5302c792c6a79f729b2cc2a9d87beb262d3266a424efa", - query_info.state_root().to_hex(), + base16::encode_lower(query_info.state_root()), "hex of state root not as expected" ); if let casper_types::StoredValue::Account(account) = query_info.stored_value() { From 0fbf05111d7370c375a8407e1ffd570c4ef13fac Mon Sep 17 00:00:00 2001 From: Avi Dessauer Date: Mon, 16 Sep 2024 22:14:42 -0700 Subject: [PATCH 07/12] Add alias for TrieMerkleProof --- src/merkle_proof.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/merkle_proof.rs b/src/merkle_proof.rs index 1e4e96c..0634ba5 100644 --- a/src/merkle_proof.rs +++ b/src/merkle_proof.rs @@ -5,7 +5,7 @@ use core::mem::MaybeUninit; use std::{boxed::Box, string::String, vec::Vec}; use casper_storage::global_state::trie_store::operations::compute_state_hash; -pub use casper_types::global_state::{TrieMerkleProof, TrieMerkleProofStep}; +pub use casper_types::global_state::TrieMerkleProofStep; use casper_types::{ bytesrepr::{self, Bytes, FromBytes, ToBytes, U8_SERIALIZED_LENGTH}, @@ -18,6 +18,8 @@ use super::hash::DIGEST_LENGTH; const RADIX: usize = 256; +pub type TrieMerkleProof = casper_types::global_state::TrieMerkleProof; + #[derive(Debug, Clone, PartialEq, Eq)] pub enum Pointer { LeafPointer(Digest), @@ -321,7 +323,7 @@ impl<'a, 'b> QueryInfo<'a, 'b> { } pub fn process_query_proofs<'a>( - proofs: &'a [TrieMerkleProof], + proofs: &'a [TrieMerkleProof], path: &[String], ) -> Result, ValidationError> { if proofs.len() != path.len() + 1 { From 1f11414fb60193fe08a55b672dbe30857dcba6e5 Mon Sep 17 00:00:00 2001 From: Avi Dessauer Date: Mon, 16 Sep 2024 22:18:02 -0700 Subject: [PATCH 08/12] Bump version to 0.2.0 to mark breaking changes Notably replacing JsonBlock with casper_types::JsonBlockWithSignatures --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 97e299e..6c52d6c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "casper-litmus" -version = "0.1.1" +version = "0.2.0" edition = "2021" [dependencies] From 16b46eb28f55d9eee049829c054697677e84ec3b Mon Sep 17 00:00:00 2001 From: Avi Dessauer Date: Tue, 17 Sep 2024 12:22:13 -0700 Subject: [PATCH 09/12] Delete more --- src/consensus.rs | 350 -------------------------------------------- src/crypto.rs | 200 ------------------------- src/hash.rs | 203 ------------------------- src/kernel.rs | 17 +-- src/lib.rs | 3 - src/merkle_proof.rs | 3 +- 6 files changed, 9 insertions(+), 767 deletions(-) delete mode 100644 src/consensus.rs delete mode 100644 src/crypto.rs delete mode 100644 src/hash.rs diff --git a/src/consensus.rs b/src/consensus.rs deleted file mode 100644 index 8da27d7..0000000 --- a/src/consensus.rs +++ /dev/null @@ -1,350 +0,0 @@ -use std::{collections::BTreeMap, vec::Vec}; - -#[cfg(test)] -use proptest::prelude::*; - -use casper_types::{ - bytesrepr::{self, FromBytes, ToBytes}, - PublicKey, U512, -}; - -#[cfg(test)] -use serde_map_to_array::BTreeMapToArray; -use serde_map_to_array::KeyValueLabels; - -#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)] -#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] -// See https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/components/consensus/consensus_protocol.rs#L105-L115 -pub struct EraReport { - pub(crate) equivocators: Vec, - #[cfg_attr( - test, - serde(with = "BTreeMapToArray::") - )] - pub(crate) rewards: BTreeMap, - pub(crate) inactive_validators: Vec, -} - -impl EraReport { - pub fn new( - equivocators: Vec, - rewards: BTreeMap, - inactive_validators: Vec, - ) -> Self { - EraReport { - equivocators, - rewards, - inactive_validators, - } - } - - pub fn equivocators(&self) -> &Vec { - &self.equivocators - } - - pub fn rewards(&self) -> &BTreeMap { - &self.rewards - } - - pub fn inactive_validators(&self) -> &Vec { - &self.inactive_validators - } -} - -#[cfg(test)] -impl Arbitrary for EraReport { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - ( - proptest::collection::vec(casper_types::crypto::gens::public_key_arb(), 0..5), - proptest::collection::btree_map( - casper_types::crypto::gens::public_key_arb(), - any::(), - // Must have at least one reward or deserialization will fail. - 1..5, - ), - proptest::collection::vec(casper_types::crypto::gens::public_key_arb(), 0..5), - ) - .prop_map(|(equivocators, rewards, inactive_validators)| EraReport { - equivocators, - rewards, - inactive_validators, - }) - .boxed() - } -} - -// See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L390-L404 -impl ToBytes for EraReport { - fn to_bytes(&self) -> Result, casper_types::bytesrepr::Error> { - let mut buffer = casper_types::bytesrepr::allocate_buffer(self)?; - buffer.extend(self.equivocators.to_bytes()?); - buffer.extend(self.rewards.to_bytes()?); - buffer.extend(self.inactive_validators.to_bytes()?); - Ok(buffer) - } - - fn serialized_length(&self) -> usize { - self.equivocators.serialized_length() - + self.rewards.serialized_length() - + self.inactive_validators.serialized_length() - } -} - -// See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L406-L419 -impl FromBytes for EraReport { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), casper_types::bytesrepr::Error> { - let (equivocators, remainder) = Vec::::from_bytes(bytes)?; - let (rewards, remainder) = BTreeMap::::from_bytes(remainder)?; - let (inactive_validators, remainder) = Vec::::from_bytes(remainder)?; - - let era_report = EraReport { - equivocators, - rewards, - inactive_validators, - }; - Ok((era_report, remainder)) - } -} - -#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)] -#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] -// See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L748-L753 -pub struct EraEndV1 { - pub(crate) era_report: EraReport, - #[cfg_attr( - test, - serde(with = "BTreeMapToArray::") - )] - pub(crate) next_era_validator_weights: BTreeMap, -} - -impl EraEndV1 { - pub fn new( - era_report: EraReport, - next_era_validator_weights: BTreeMap, - ) -> Self { - EraEndV1 { - era_report, - next_era_validator_weights, - } - } - - pub fn era_report(&self) -> &EraReport { - &self.era_report - } - - pub fn next_era_validator_weights(&self) -> &BTreeMap { - &self.next_era_validator_weights - } -} - -pub struct NextEraValidatorLabels; - -impl KeyValueLabels for NextEraValidatorLabels { - const KEY: &'static str = "validator"; - const VALUE: &'static str = "weight"; -} - -#[cfg(test)] -impl Arbitrary for EraEndV1 { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - ( - any::(), - proptest::collection::btree_map( - casper_types::crypto::gens::public_key_arb(), - any::().prop_map(U512::from), - // Must have at least one validator or deserialization will fail. - 1..5, - ), - ) - .prop_map(|(era_report, next_era_validator_weights)| EraEndV1 { - era_report, - next_era_validator_weights, - }) - .boxed() - } -} - -// See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L774-L785 -impl ToBytes for EraEndV1 { - fn to_bytes(&self) -> Result, casper_types::bytesrepr::Error> { - let mut buffer = casper_types::bytesrepr::allocate_buffer(self)?; - buffer.extend(self.era_report.to_bytes()?); - buffer.extend(self.next_era_validator_weights.to_bytes()?); - Ok(buffer) - } - - fn serialized_length(&self) -> usize { - self.era_report.serialized_length() + self.next_era_validator_weights.serialized_length() - } -} - -// See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L787-L797 -impl FromBytes for EraEndV1 { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), casper_types::bytesrepr::Error> { - let (era_report, bytes) = EraReport::from_bytes(bytes)?; - let (next_era_validator_weights, bytes) = BTreeMap::::from_bytes(bytes)?; - let era_end = EraEndV1 { - era_report, - next_era_validator_weights, - }; - Ok((era_end, bytes)) - } -} - -pub struct EraRewardsLabels; - -impl KeyValueLabels for EraRewardsLabels { - const KEY: &'static str = "validator"; - const VALUE: &'static str = "amount"; -} - -/// Information related to the end of an era, and validator weights for the following era. -#[derive(Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug)] -#[cfg_attr(test, derive(serde::Serialize, serde::Deserialize))] -pub struct EraEndV2 { - /// The set of equivocators. - pub equivocators: Vec, - /// Validators that haven't produced any unit during the era. - pub inactive_validators: Vec, - /// The validators for the upcoming era and their respective weights. - #[cfg_attr( - test, - serde(with = "BTreeMapToArray::") - )] - pub next_era_validator_weights: BTreeMap, - /// The rewards distributed to the validators. - pub rewards: BTreeMap>, - pub next_era_gas_price: u8, -} - -impl ToBytes for EraEndV2 { - fn write_bytes(&self, writer: &mut Vec) -> Result<(), bytesrepr::Error> { - let EraEndV2 { - equivocators, - inactive_validators, - next_era_validator_weights, - rewards, - next_era_gas_price, - } = self; - - equivocators.write_bytes(writer)?; - inactive_validators.write_bytes(writer)?; - next_era_validator_weights.write_bytes(writer)?; - rewards.write_bytes(writer)?; - next_era_gas_price.write_bytes(writer)?; - - Ok(()) - } - - fn to_bytes(&self) -> Result, bytesrepr::Error> { - let mut buffer = bytesrepr::allocate_buffer(self)?; - self.write_bytes(&mut buffer)?; - Ok(buffer) - } - - fn serialized_length(&self) -> usize { - let EraEndV2 { - equivocators, - inactive_validators, - next_era_validator_weights, - rewards, - next_era_gas_price, - } = self; - - equivocators.serialized_length() - + inactive_validators.serialized_length() - + next_era_validator_weights.serialized_length() - + rewards.serialized_length() - + next_era_gas_price.serialized_length() - } -} - -impl FromBytes for EraEndV2 { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { - let (equivocators, bytes) = Vec::from_bytes(bytes)?; - let (inactive_validators, bytes) = Vec::from_bytes(bytes)?; - let (next_era_validator_weights, bytes) = BTreeMap::from_bytes(bytes)?; - let (rewards, bytes) = BTreeMap::from_bytes(bytes)?; - let (next_era_gas_price, bytes) = u8::from_bytes(bytes)?; - let era_end = EraEndV2 { - equivocators, - inactive_validators, - next_era_validator_weights, - rewards, - next_era_gas_price, - }; - - Ok((era_end, bytes)) - } -} - -#[cfg(test)] -impl Arbitrary for EraEndV2 { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - ( - proptest::collection::vec(casper_types::crypto::gens::public_key_arb(), 0..5), - proptest::collection::vec(casper_types::crypto::gens::public_key_arb(), 0..5), - proptest::collection::btree_map( - casper_types::crypto::gens::public_key_arb(), - any::().prop_map(U512::from), - 1..5, - ), - proptest::collection::btree_map( - casper_types::crypto::gens::public_key_arb(), - proptest::collection::vec(any::().prop_map(U512::from), 1..5), - 1..5, - ), - any::(), - ) - .prop_map( - |( - equivocators, - inactive_validators, - next_era_validator_weights, - rewards, - next_era_gas_price, - )| EraEndV2 { - equivocators, - inactive_validators, - next_era_validator_weights, - rewards, - next_era_gas_price, - }, - ) - .boxed() - } -} - -#[cfg(test)] -mod test { - extern crate std; - - use casper_types::bytesrepr::{deserialize_from_slice, ToBytes}; - use test_strategy::proptest; - - use super::EraEndV1; - - #[proptest] - fn bytesrepr_era_end_v1_round_trip(era_end: EraEndV1) { - let serialized = era_end.to_bytes().unwrap(); - let deserialized: EraEndV1 = deserialize_from_slice(&serialized).unwrap(); - assert_eq!(era_end, deserialized) - } - - #[proptest] - fn bytesrepr_era_end_v2_round_trip(era_end: super::EraEndV2) { - let serialized = era_end.to_bytes().unwrap(); - let deserialized: super::EraEndV2 = deserialize_from_slice(&serialized).unwrap(); - assert_eq!(era_end, deserialized) - } -} diff --git a/src/crypto.rs b/src/crypto.rs deleted file mode 100644 index ec44246..0000000 --- a/src/crypto.rs +++ /dev/null @@ -1,200 +0,0 @@ -#[cfg(test)] -use ed25519_dalek::Signer; - -use casper_types::{PublicKey, Signature}; -use k256::ecdsa::{signature::Verifier, VerifyingKey as Secp256k1PublicKey}; - -#[cfg(test)] -pub fn sign>(secret_key: &casper_types::SecretKey, message: T) -> Signature { - match secret_key { - casper_types::SecretKey::System => Signature::System, - casper_types::SecretKey::Ed25519(secret_key) => { - let signature = secret_key.sign(message.as_ref()); - Signature::Ed25519(signature) - } - casper_types::SecretKey::Secp256k1(secret_key) => { - let signature = secret_key - .try_sign(message.as_ref()) - .expect("should create signature"); - Signature::Secp256k1(signature) - } - _ => panic!("SecretKey is marked as non-exhaustive, but this should never happen"), - } -} - -#[derive(Debug)] -pub enum SignatureVerificationError { - SystemSignatureNotAllowed, - FailedToVerifyEd25519Signature, - FailedToVerifySecp256k1Signature, - KeyTypeMismatch, -} - -pub fn verify>( - public_key: &PublicKey, - message: T, - signature: &Signature, -) -> Result<(), SignatureVerificationError> { - match (signature, public_key) { - (Signature::System, _) => Err(SignatureVerificationError::SystemSignatureNotAllowed), - (Signature::Ed25519(signature), PublicKey::Ed25519(public_key)) => public_key - .verify_strict(message.as_ref(), signature) - .map_err(|_| SignatureVerificationError::FailedToVerifyEd25519Signature), - (Signature::Secp256k1(signature), PublicKey::Secp256k1(public_key)) => { - let verifier: &Secp256k1PublicKey = public_key; - verifier - .verify(message.as_ref(), signature) - .map_err(|_| SignatureVerificationError::FailedToVerifySecp256k1Signature) - } - _ => Err(SignatureVerificationError::KeyTypeMismatch), - } -} - -#[cfg(test)] -mod test { - extern crate std; - - use casper_types::PublicKey as CasperPublicKey; - use casper_types::SecretKey as CasperSecretKey; - use ed25519_dalek::SigningKey as Ed25519SecretKey; - use k256::ecdsa::SigningKey as Secp256k1SecretKey; - use proptest::prelude::*; - use test_strategy::proptest; - - use super::{sign, verify}; - - #[derive(Debug)] - enum RealSecretKey { - Ed25519(Ed25519SecretKey), - Secp256k1(Secp256k1SecretKey), - } - - impl Arbitrary for RealSecretKey { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::<[u8; CasperPublicKey::ED25519_LENGTH]>() - .prop_map(|bytes| { RealSecretKey::Ed25519(Ed25519SecretKey::from(bytes)) }), - any::<[u8; CasperSecretKey::SECP256K1_LENGTH]>() - .prop_filter("Cannot make a secret key from [0u8; 32]", |bytes| bytes - != &[0u8; CasperSecretKey::SECP256K1_LENGTH]) - .prop_map(|bytes| RealSecretKey::Secp256k1( - Secp256k1SecretKey::from_slice(bytes.as_ref()).unwrap() - )), - ] - .boxed() - } - } - - impl From for CasperSecretKey { - fn from(real_secret_key: RealSecretKey) -> Self { - match real_secret_key { - RealSecretKey::Ed25519(ed25519_secret_key) => { - CasperSecretKey::Ed25519(ed25519_secret_key) - } - RealSecretKey::Secp256k1(secp256k1_secret_key) => { - CasperSecretKey::Secp256k1(secp256k1_secret_key) - } - } - } - } - - #[proptest] - fn sign_and_verify(real_secret_key: RealSecretKey, message: Vec) { - let casper_secret_key = CasperSecretKey::from(real_secret_key); - let signature = sign(&casper_secret_key, &message); - - verify( - &CasperPublicKey::from(&casper_secret_key), - &message, - &signature, - ) - .unwrap(); - } - - #[proptest] - fn signatures_should_agree_with_casper_types(real_secret_key: RealSecretKey, message: Vec) { - let casper_secret_key = CasperSecretKey::from(real_secret_key); - let our_signature = sign(&casper_secret_key, &message); - let casper_types_signature = casper_types::crypto::sign( - &message, - &casper_secret_key, - &CasperPublicKey::from(&casper_secret_key), - ); - assert_eq!(our_signature, casper_types_signature) - } - - #[test] - fn should_not_verify_bad_ed25519_signature() { - let bad_secret_key = - CasperSecretKey::ed25519_from_bytes([0u8; CasperSecretKey::ED25519_LENGTH]).unwrap(); - let message = "this shouldn't work for the good public key"; - let bad_signature = sign(&bad_secret_key, message); - verify( - &CasperPublicKey::from(&bad_secret_key), - message, - &bad_signature, - ) - .unwrap_or_else(|_| panic!("Bad secret key should be able to verify its own signature")); - - let good_public_key = CasperPublicKey::from( - &CasperSecretKey::ed25519_from_bytes([1u8; CasperSecretKey::ED25519_LENGTH]).unwrap(), - ); - assert!( - verify(&good_public_key, message, &bad_signature).is_err(), - "good public key should not be able to verify bad signature" - ) - } - - #[test] - fn should_not_verify_bad_secp256k1_signature() { - // Can't use [0u8; 32] because its a bogus secret key - let bad_secret_key = - CasperSecretKey::secp256k1_from_bytes([1u8; CasperSecretKey::SECP256K1_LENGTH]) - .unwrap(); - let message = "this shouldn't work for the good public key"; - let bad_signature = sign(&bad_secret_key, message); - - verify( - &CasperPublicKey::from(&bad_secret_key), - message, - &bad_signature, - ) - .unwrap_or_else(|_| panic!("Bad secret key should be able to verify its own signature")); - - let good_public_key = CasperPublicKey::from( - &CasperSecretKey::secp256k1_from_bytes([2u8; CasperSecretKey::SECP256K1_LENGTH]) - .unwrap(), - ); - assert!( - verify(&good_public_key, message, &bad_signature).is_err(), - "good public key should not be able to verify bad signature" - ) - } - - #[test] - fn should_not_verify_system_signature() { - let message = "system can't really sign anything"; - let bad_signature = sign(&CasperSecretKey::System, message); - assert!( - verify(&CasperPublicKey::System, message, &bad_signature).is_err(), - "System is not allowed to sign anything" - ); - } - - #[test] - fn should_not_verify_different_signature_schemes() { - let message = "should not work because the signatures are different types"; - let secret_bytes = [1u8; 32]; - let ed25519_secret_key = CasperSecretKey::ed25519_from_bytes(secret_bytes).unwrap(); - let secp256k1_public_key = - CasperPublicKey::from(&CasperSecretKey::secp256k1_from_bytes(secret_bytes).unwrap()); - let ed25519_signature = sign(&ed25519_secret_key, message); - assert!( - verify(&secp256k1_public_key, message, &ed25519_signature).is_err(), - "should not verify different types of public keys and signatures" - ) - } -} diff --git a/src/hash.rs b/src/hash.rs deleted file mode 100644 index b54e813..0000000 --- a/src/hash.rs +++ /dev/null @@ -1,203 +0,0 @@ -use casper_types::bytesrepr::{FromBytes, ToBytes}; -use itertools::Itertools; -use std::{string::String, vec::Vec}; - -pub const DIGEST_LENGTH: usize = 32; -const SENTINEL_MERKLE_TREE: Digest = Digest([2u8; DIGEST_LENGTH]); -const CHUNK_SIZE_BYTES: usize = 8 * 1024 * 1024; -const CHUNK_DATA_ZEROED: [u8; CHUNK_SIZE_BYTES] = [0u8; CHUNK_SIZE_BYTES]; - -#[derive(Clone, Default, Ord, PartialOrd, Eq, PartialEq, Hash, Debug)] -// For 1.* See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/hashing/src/lib.rs#L48 -// For casper 2.0 rc4 see https://github.com/casper-network/casper-node/blob/4e2ddf485e5cec830f9ff402b052f5f55801eb54/types/src/digest.rs#L54 -#[cfg_attr(test, derive(proptest_derive::Arbitrary))] -pub struct Digest([u8; DIGEST_LENGTH]); - -impl Digest { - pub fn hash(data: &[u8]) -> Self { - let hashed_data: [u8; DIGEST_LENGTH] = blake2b_simd::Params::new() - .hash_length(DIGEST_LENGTH) - .hash(data) - .as_bytes() - .try_into() - .unwrap_or_else(|_| panic!("should be {} bytes long", DIGEST_LENGTH)); - Digest(hashed_data) - } - - fn hash_pair, U: AsRef<[u8]>>(data1: T, data2: U) -> Digest { - let hashed_data: [u8; DIGEST_LENGTH] = blake2b_simd::Params::new() - .hash_length(DIGEST_LENGTH) - .to_state() - .update(data1.as_ref()) - .update(data2.as_ref()) - .finalize() - .as_bytes() - .try_into() - .unwrap_or_else(|_| panic!("should be {} bytes long", DIGEST_LENGTH)); - Digest(hashed_data) - } - - fn hash_merkle_root(leaf_count: u64, root: Digest) -> Digest { - let hashed_data: [u8; DIGEST_LENGTH] = blake2b_simd::Params::new() - .hash_length(DIGEST_LENGTH) - .to_state() - .update(&CHUNK_DATA_ZEROED) - .update(&leaf_count.to_le_bytes()) - .update(root.as_ref()) - .finalize() - .as_bytes() - .try_into() - .unwrap_or_else(|_| panic!("should be {} bytes long", DIGEST_LENGTH)); - Digest(hashed_data) - } - - fn hash_merkle_tree(leaves: I) -> Digest - where - I: IntoIterator, - I::IntoIter: ExactSizeIterator, - { - let leaves = leaves.into_iter(); - let leaf_count = leaves.len() as u64; - - leaves.tree_fold1(Digest::hash_pair).map_or_else( - || SENTINEL_MERKLE_TREE, - |raw_root| Digest::hash_merkle_root(leaf_count, raw_root), - ) - } - - pub fn hash_into_chunks_if_necessary(bytes: &[u8]) -> Digest { - if bytes.len() <= CHUNK_SIZE_BYTES { - Digest::hash(bytes) - } else { - Digest::hash_merkle_tree(bytes.chunks(CHUNK_SIZE_BYTES).map(Digest::hash)) - } - } - - pub fn to_hex(&self) -> String { - base16::encode_lower(&self.0) - } -} - -impl AsRef<[u8]> for Digest { - fn as_ref(&self) -> &[u8] { - self.0.as_ref() - } -} - -impl From for [u8; DIGEST_LENGTH] { - fn from(digest: Digest) -> Self { - digest.0 - } -} - -impl From<[u8; DIGEST_LENGTH]> for Digest { - fn from(bytes: [u8; DIGEST_LENGTH]) -> Self { - Digest(bytes) - } -} - -// See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/hashing/src/lib.rs#L316-L339 -impl ToBytes for Digest { - fn to_bytes(&self) -> Result, casper_types::bytesrepr::Error> { - self.0.to_bytes() - } - - fn serialized_length(&self) -> usize { - self.0.serialized_length() - } - - fn write_bytes(&self, writer: &mut Vec) -> Result<(), casper_types::bytesrepr::Error> { - writer.extend_from_slice(&self.0); - Ok(()) - } -} - -impl FromBytes for Digest { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), casper_types::bytesrepr::Error> { - FromBytes::from_bytes(bytes).map(|(arr, rem)| (Digest(arr), rem)) - } -} - -// See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/hashing/src/lib.rs#L341-L367 -impl serde::Serialize for Digest { - fn serialize(&self, serializer: S) -> Result { - if serializer.is_human_readable() { - base16::encode_lower(&self.0).serialize(serializer) - } else { - self.0[..].serialize(serializer) - } - } -} - -impl<'de> serde::Deserialize<'de> for Digest { - fn deserialize>(deserializer: D) -> Result { - let bytes: Vec = if deserializer.is_human_readable() { - let hex_string = String::deserialize(deserializer)?; - base16::decode(hex_string.as_bytes()).map_err(serde::de::Error::custom)? - } else { - >::deserialize(deserializer)? - }; - - let data = - <[u8; DIGEST_LENGTH]>::try_from(bytes.as_ref()).map_err(serde::de::Error::custom)?; - Ok(Digest(data)) - } -} - -#[cfg(test)] -mod test { - extern crate std; - - use casper_types::bytesrepr::{deserialize_from_slice, ToBytes}; - use std::vec::Vec; - use test_strategy::proptest; - - use super::{Digest, DIGEST_LENGTH}; - - #[proptest] - fn serde_json_digest_round_trip(timestamp: Digest) { - let serialized_digest = serde_json::to_string(×tamp).unwrap(); - let casper_hashing_digest: casper_types::Digest = - serde_json::from_str(&serialized_digest).unwrap(); - let serialized_casper_hashing_digest = - serde_json::to_string(&casper_hashing_digest).unwrap(); - assert_eq!(serialized_digest, serialized_casper_hashing_digest); - let deserialized_digest: Digest = - serde_json::from_str(&serialized_casper_hashing_digest).unwrap(); - assert_eq!(timestamp, deserialized_digest); - } - - #[proptest] - fn bincode_timestamp_round_trip(timestamp: Digest) { - let serialized_timestamp = bincode::serialize(×tamp).unwrap(); - let casper_types_timestamp: casper_types::Digest = - bincode::deserialize(&serialized_timestamp).unwrap(); - let serialized_casper_types_timestamp = - bincode::serialize(&casper_types_timestamp).unwrap(); - assert_eq!(serialized_timestamp, serialized_casper_types_timestamp); - let deserialized_timestamp: Digest = - bincode::deserialize(&serialized_casper_types_timestamp).unwrap(); - assert_eq!(timestamp, deserialized_timestamp); - } - - #[proptest] - fn bytesrepr_digest_round_trip(digest: Digest) { - let serialized_digest = digest.to_bytes().unwrap(); - let casper_hashing_digest: casper_types::Digest = - deserialize_from_slice(&serialized_digest).unwrap(); - let serialized_casper_hashing_digest = casper_hashing_digest.to_bytes().unwrap(); - let deserialized_digest: Digest = - deserialize_from_slice(&serialized_casper_hashing_digest).unwrap(); - assert_eq!(digest, deserialized_digest) - } - - #[proptest] - fn hashing_agrees_with_casper_hashing(data: Vec) { - let digest = Digest::hash(&data); - let casper_digest = casper_types::Digest::hash(&data); - assert_eq!( - <[u8; DIGEST_LENGTH]>::from(digest), - <[u8; DIGEST_LENGTH]>::from(casper_digest) - ); - } -} diff --git a/src/kernel.rs b/src/kernel.rs index d5aa28a..6e724c3 100644 --- a/src/kernel.rs +++ b/src/kernel.rs @@ -1,8 +1,6 @@ use casper_types::{EraId, JsonBlockWithSignatures, PublicKey, U512}; use std::collections::BTreeMap; -use crate::crypto::{verify, SignatureVerificationError}; - pub struct EraInfo { era_id: EraId, validator_weights: BTreeMap, @@ -16,18 +14,18 @@ pub enum BlockSignaturesValidationError { block_header_era_id: EraId, }, BogusValidator(PublicKey), - SignatureVerificationError(SignatureVerificationError), + SignatureVerificationError, InsufficientWeight { bad_signature_weight: U512, total_weight: U512, }, } -impl From for BlockSignaturesValidationError { - fn from(signature_verification_error: SignatureVerificationError) -> Self { - BlockSignaturesValidationError::SignatureVerificationError(signature_verification_error) - } -} +// impl From for BlockSignaturesValidationError { +// fn from(signature_verification_error: SignatureVerificationError) -> Self { +// BlockSignaturesValidationError::SignatureVerificationError(signature_verification_error) +// } +// } impl EraInfo { pub fn new(era_id: EraId, validator_weights: BTreeMap) -> Self { @@ -68,7 +66,8 @@ impl EraInfo { public_key.clone(), )); } - verify(public_key, &signature_data, signature)?; + casper_types::verify(&signature_data, signature, public_key) + .map_err(|_| BlockSignaturesValidationError::SignatureVerificationError)?; // If the block has `block_signature_weight >= 1/3 * total_weight`, its okay if U512::from(3) * block_signature_weight >= self.total_weight { diff --git a/src/lib.rs b/src/lib.rs index 125c6a3..2357c21 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,3 @@ -pub mod consensus; -pub(crate) mod crypto; -pub mod hash; pub mod kernel; pub mod merkle_proof; /// Re-export of `casper_types` crate to allow library consumers to match the version easily. diff --git a/src/merkle_proof.rs b/src/merkle_proof.rs index 0634ba5..857c43b 100644 --- a/src/merkle_proof.rs +++ b/src/merkle_proof.rs @@ -14,8 +14,7 @@ use casper_types::{ #[cfg(test)] use proptest::prelude::*; -use super::hash::DIGEST_LENGTH; - +const DIGEST_LENGTH: usize = 32; const RADIX: usize = 256; pub type TrieMerkleProof = casper_types::global_state::TrieMerkleProof; From 427ad0f7c643dd4640e092ab89e7e13abad3df06 Mon Sep 17 00:00:00 2001 From: Avi Dessauer Date: Tue, 17 Sep 2024 12:22:53 -0700 Subject: [PATCH 10/12] Delete old test/assets/blocks --- tests/assets/blocks/block-0.json | 70 ------------------------ tests/assets/blocks/block-1.json | 42 -------------- tests/assets/blocks/block-10.json | 42 -------------- tests/assets/blocks/block-11.json | 91 ------------------------------- tests/assets/blocks/block-12.json | 42 -------------- tests/assets/blocks/block-13.json | 42 -------------- tests/assets/blocks/block-14.json | 42 -------------- tests/assets/blocks/block-15.json | 42 -------------- tests/assets/blocks/block-16.json | 42 -------------- tests/assets/blocks/block-17.json | 42 -------------- tests/assets/blocks/block-18.json | 42 -------------- tests/assets/blocks/block-19.json | 42 -------------- tests/assets/blocks/block-2.json | 42 -------------- tests/assets/blocks/block-20.json | 42 -------------- tests/assets/blocks/block-21.json | 42 -------------- tests/assets/blocks/block-22.json | 91 ------------------------------- tests/assets/blocks/block-23.json | 42 -------------- tests/assets/blocks/block-24.json | 42 -------------- tests/assets/blocks/block-25.json | 42 -------------- tests/assets/blocks/block-26.json | 42 -------------- tests/assets/blocks/block-27.json | 42 -------------- tests/assets/blocks/block-28.json | 42 -------------- tests/assets/blocks/block-29.json | 42 -------------- tests/assets/blocks/block-3.json | 42 -------------- tests/assets/blocks/block-30.json | 42 -------------- tests/assets/blocks/block-31.json | 42 -------------- tests/assets/blocks/block-32.json | 42 -------------- tests/assets/blocks/block-33.json | 91 ------------------------------- tests/assets/blocks/block-34.json | 42 -------------- tests/assets/blocks/block-35.json | 42 -------------- tests/assets/blocks/block-36.json | 42 -------------- tests/assets/blocks/block-37.json | 42 -------------- tests/assets/blocks/block-38.json | 42 -------------- tests/assets/blocks/block-39.json | 42 -------------- tests/assets/blocks/block-4.json | 42 -------------- tests/assets/blocks/block-40.json | 42 -------------- tests/assets/blocks/block-41.json | 42 -------------- tests/assets/blocks/block-42.json | 42 -------------- tests/assets/blocks/block-43.json | 42 -------------- tests/assets/blocks/block-44.json | 91 ------------------------------- tests/assets/blocks/block-45.json | 42 -------------- tests/assets/blocks/block-46.json | 42 -------------- tests/assets/blocks/block-47.json | 42 -------------- tests/assets/blocks/block-48.json | 42 -------------- tests/assets/blocks/block-49.json | 42 -------------- tests/assets/blocks/block-5.json | 42 -------------- tests/assets/blocks/block-50.json | 42 -------------- tests/assets/blocks/block-51.json | 42 -------------- tests/assets/blocks/block-52.json | 42 -------------- tests/assets/blocks/block-53.json | 42 -------------- tests/assets/blocks/block-54.json | 42 -------------- tests/assets/blocks/block-55.json | 91 ------------------------------- tests/assets/blocks/block-56.json | 42 -------------- tests/assets/blocks/block-57.json | 42 -------------- tests/assets/blocks/block-58.json | 42 -------------- tests/assets/blocks/block-59.json | 42 -------------- tests/assets/blocks/block-6.json | 42 -------------- tests/assets/blocks/block-60.json | 42 -------------- tests/assets/blocks/block-61.json | 42 -------------- tests/assets/blocks/block-62.json | 42 -------------- tests/assets/blocks/block-63.json | 42 -------------- tests/assets/blocks/block-64.json | 42 -------------- tests/assets/blocks/block-65.json | 42 -------------- tests/assets/blocks/block-66.json | 91 ------------------------------- tests/assets/blocks/block-67.json | 42 -------------- tests/assets/blocks/block-68.json | 42 -------------- tests/assets/blocks/block-69.json | 42 -------------- tests/assets/blocks/block-7.json | 42 -------------- tests/assets/blocks/block-70.json | 42 -------------- tests/assets/blocks/block-71.json | 42 -------------- tests/assets/blocks/block-72.json | 42 -------------- tests/assets/blocks/block-73.json | 42 -------------- tests/assets/blocks/block-74.json | 42 -------------- tests/assets/blocks/block-75.json | 42 -------------- tests/assets/blocks/block-76.json | 42 -------------- tests/assets/blocks/block-77.json | 91 ------------------------------- tests/assets/blocks/block-78.json | 42 -------------- tests/assets/blocks/block-79.json | 42 -------------- tests/assets/blocks/block-8.json | 42 -------------- tests/assets/blocks/block-80.json | 42 -------------- tests/assets/blocks/block-81.json | 42 -------------- tests/assets/blocks/block-82.json | 42 -------------- tests/assets/blocks/block-83.json | 42 -------------- tests/assets/blocks/block-84.json | 42 -------------- tests/assets/blocks/block-85.json | 42 -------------- tests/assets/blocks/block-86.json | 42 -------------- tests/assets/blocks/block-87.json | 42 -------------- tests/assets/blocks/block-88.json | 91 ------------------------------- tests/assets/blocks/block-89.json | 42 -------------- tests/assets/blocks/block-9.json | 42 -------------- tests/assets/blocks/block-90.json | 42 -------------- tests/assets/blocks/block-91.json | 42 -------------- tests/assets/blocks/block-92.json | 42 -------------- tests/assets/blocks/block-93.json | 42 -------------- tests/assets/blocks/block-94.json | 42 -------------- tests/assets/blocks/block-95.json | 42 -------------- tests/assets/blocks/block-96.json | 42 -------------- tests/assets/blocks/block-97.json | 42 -------------- tests/assets/blocks/block-98.json | 42 -------------- tests/assets/blocks/block-99.json | 91 ------------------------------- 100 files changed, 4669 deletions(-) delete mode 100644 tests/assets/blocks/block-0.json delete mode 100644 tests/assets/blocks/block-1.json delete mode 100644 tests/assets/blocks/block-10.json delete mode 100644 tests/assets/blocks/block-11.json delete mode 100644 tests/assets/blocks/block-12.json delete mode 100644 tests/assets/blocks/block-13.json delete mode 100644 tests/assets/blocks/block-14.json delete mode 100644 tests/assets/blocks/block-15.json delete mode 100644 tests/assets/blocks/block-16.json delete mode 100644 tests/assets/blocks/block-17.json delete mode 100644 tests/assets/blocks/block-18.json delete mode 100644 tests/assets/blocks/block-19.json delete mode 100644 tests/assets/blocks/block-2.json delete mode 100644 tests/assets/blocks/block-20.json delete mode 100644 tests/assets/blocks/block-21.json delete mode 100644 tests/assets/blocks/block-22.json delete mode 100644 tests/assets/blocks/block-23.json delete mode 100644 tests/assets/blocks/block-24.json delete mode 100644 tests/assets/blocks/block-25.json delete mode 100644 tests/assets/blocks/block-26.json delete mode 100644 tests/assets/blocks/block-27.json delete mode 100644 tests/assets/blocks/block-28.json delete mode 100644 tests/assets/blocks/block-29.json delete mode 100644 tests/assets/blocks/block-3.json delete mode 100644 tests/assets/blocks/block-30.json delete mode 100644 tests/assets/blocks/block-31.json delete mode 100644 tests/assets/blocks/block-32.json delete mode 100644 tests/assets/blocks/block-33.json delete mode 100644 tests/assets/blocks/block-34.json delete mode 100644 tests/assets/blocks/block-35.json delete mode 100644 tests/assets/blocks/block-36.json delete mode 100644 tests/assets/blocks/block-37.json delete mode 100644 tests/assets/blocks/block-38.json delete mode 100644 tests/assets/blocks/block-39.json delete mode 100644 tests/assets/blocks/block-4.json delete mode 100644 tests/assets/blocks/block-40.json delete mode 100644 tests/assets/blocks/block-41.json delete mode 100644 tests/assets/blocks/block-42.json delete mode 100644 tests/assets/blocks/block-43.json delete mode 100644 tests/assets/blocks/block-44.json delete mode 100644 tests/assets/blocks/block-45.json delete mode 100644 tests/assets/blocks/block-46.json delete mode 100644 tests/assets/blocks/block-47.json delete mode 100644 tests/assets/blocks/block-48.json delete mode 100644 tests/assets/blocks/block-49.json delete mode 100644 tests/assets/blocks/block-5.json delete mode 100644 tests/assets/blocks/block-50.json delete mode 100644 tests/assets/blocks/block-51.json delete mode 100644 tests/assets/blocks/block-52.json delete mode 100644 tests/assets/blocks/block-53.json delete mode 100644 tests/assets/blocks/block-54.json delete mode 100644 tests/assets/blocks/block-55.json delete mode 100644 tests/assets/blocks/block-56.json delete mode 100644 tests/assets/blocks/block-57.json delete mode 100644 tests/assets/blocks/block-58.json delete mode 100644 tests/assets/blocks/block-59.json delete mode 100644 tests/assets/blocks/block-6.json delete mode 100644 tests/assets/blocks/block-60.json delete mode 100644 tests/assets/blocks/block-61.json delete mode 100644 tests/assets/blocks/block-62.json delete mode 100644 tests/assets/blocks/block-63.json delete mode 100644 tests/assets/blocks/block-64.json delete mode 100644 tests/assets/blocks/block-65.json delete mode 100644 tests/assets/blocks/block-66.json delete mode 100644 tests/assets/blocks/block-67.json delete mode 100644 tests/assets/blocks/block-68.json delete mode 100644 tests/assets/blocks/block-69.json delete mode 100644 tests/assets/blocks/block-7.json delete mode 100644 tests/assets/blocks/block-70.json delete mode 100644 tests/assets/blocks/block-71.json delete mode 100644 tests/assets/blocks/block-72.json delete mode 100644 tests/assets/blocks/block-73.json delete mode 100644 tests/assets/blocks/block-74.json delete mode 100644 tests/assets/blocks/block-75.json delete mode 100644 tests/assets/blocks/block-76.json delete mode 100644 tests/assets/blocks/block-77.json delete mode 100644 tests/assets/blocks/block-78.json delete mode 100644 tests/assets/blocks/block-79.json delete mode 100644 tests/assets/blocks/block-8.json delete mode 100644 tests/assets/blocks/block-80.json delete mode 100644 tests/assets/blocks/block-81.json delete mode 100644 tests/assets/blocks/block-82.json delete mode 100644 tests/assets/blocks/block-83.json delete mode 100644 tests/assets/blocks/block-84.json delete mode 100644 tests/assets/blocks/block-85.json delete mode 100644 tests/assets/blocks/block-86.json delete mode 100644 tests/assets/blocks/block-87.json delete mode 100644 tests/assets/blocks/block-88.json delete mode 100644 tests/assets/blocks/block-89.json delete mode 100644 tests/assets/blocks/block-9.json delete mode 100644 tests/assets/blocks/block-90.json delete mode 100644 tests/assets/blocks/block-91.json delete mode 100644 tests/assets/blocks/block-92.json delete mode 100644 tests/assets/blocks/block-93.json delete mode 100644 tests/assets/blocks/block-94.json delete mode 100644 tests/assets/blocks/block-95.json delete mode 100644 tests/assets/blocks/block-96.json delete mode 100644 tests/assets/blocks/block-97.json delete mode 100644 tests/assets/blocks/block-98.json delete mode 100644 tests/assets/blocks/block-99.json diff --git a/tests/assets/blocks/block-0.json b/tests/assets/blocks/block-0.json deleted file mode 100644 index bfe8c94..0000000 --- a/tests/assets/blocks/block-0.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "hash": "4649dd35500a0be2032f0254d5e7f4b7b1315b449f91f4ef2c83b9de84dc9440", - "header": { - "parent_hash": "0000000000000000000000000000000000000000000000000000000000000000", - "state_root_hash": "7dc0efc0951998f50565066a15899e90f73a55e8faf22a6b6a0904be9a48da7c", - "body_hash": "5187b7a8021bf4f2c004ea3a54cfece1754f11c7624d2363c7f4cf4fddd1441e", - "random_bit": false, - "accumulated_seed": "d8908c165dee785924e7421a0fd0418a19d5daeec395fd505a92a0fd3117e428", - "era_end": { - "era_report": { - "equivocators": [], - "rewards": [], - "inactive_validators": [] - }, - "next_era_validator_weights": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "weight": "2000000000000000002" - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "weight": "2000000000000000004" - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "weight": "2000000000000000006" - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "weight": "2000000000000000010" - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "weight": "2000000000000000008" - } - ] - }, - "timestamp": "2024-02-28T16:23:48.517Z", - "era_id": 0, - "height": 0, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "00", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "016c3fcf8b094f1887d7021726ca217c2fa8565cc5bf545c02f7310e8618a96c6b1ea1682301089454e9c9bcd7e55533d53e6ef3bc2d7079f5b5a94e7970d6750e" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0103b07fefc25b8168fcce7f03c66c6b73789844943ef919fc50af52da91fef02444f7f7dbb7b88484fe4725a4f43d889c3570fbcc8a5a479efb747cc47133d804" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01c9dc0f68554d9af32904557de2ff9e41a379e786d47924609212c02d1ecbed796779131237ff4fd4265fc5c69f5cda12eba685890ddcb92f1a690e536b557500" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "017083425dead3b8fc8f2a8460136ff7942f0dc30232aa06d3af69f2564380d430d9d833436cc6a37d22939331c96a06cb3cc33882b6080d1f0ebf2035a1fc2001" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01ae5ffebe5c85516c571b94dff022d816e3d2a63fc8ca9d60c04e6d3650766bfbc9c559f95fca3b619add6264459dc6c429b57b88dd523ee63c39313a42f01201" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-1.json b/tests/assets/blocks/block-1.json deleted file mode 100644 index bb77807..0000000 --- a/tests/assets/blocks/block-1.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "923b4a86497593062a684c266d2fc96e8961c65ddae68119a444630d58c18abd", - "header": { - "parent_hash": "4649dd35500a0be2032f0254d5e7f4b7b1315b449f91f4ef2c83b9de84dc9440", - "state_root_hash": "7dc0efc0951998f50565066a15899e90f73a55e8faf22a6b6a0904be9a48da7c", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": false, - "accumulated_seed": "442c6df00361ec5b045e1b0a007241eb302cd533aa432b45213b69a3947eed70", - "era_end": null, - "timestamp": "2024-02-28T16:23:52.576Z", - "era_id": 1, - "height": 1, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01d455f23829765b01ec2f467215f3734f95a0a18bee6db47e0a2dcf6ddb5ae97489899178981df4155b0a40eee1eeee91de89663262c5edb083b5df429d27ac06" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01fbed6900fb498291c476aaf76ed9ab8dfe6910f95440ee2748c0873e384233a0a848faaad01b68f9db96ad71808385b6d3896bac56ccb582f7845256017dac04" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "014243772def73607c6be94260b98b9fae9d1f978e2e4af8a66665444f188523d805b82b07c4b7cca60f581a9c93e8482a116e9c6ac689359cdad89c12eb9cfc06" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "010fa50e0724fe5969b64e90430093ee643ae1b0b11e59665a9bfb02b32a85772d1d81ab50f3695fc785377555a45133b98eb7000fec6513380520c73618e5e70b" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01e9e2bbdbf5e8de3fecff10328a6494206592c8d09203ad0ec658608f447ddf6e29385e433e5a57f05447ae1d3314c89a26755ba3522aa39faf6a7a3372c3cc00" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-10.json b/tests/assets/blocks/block-10.json deleted file mode 100644 index 6c9bf6c..0000000 --- a/tests/assets/blocks/block-10.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "d144eaf98bb4d622fb35b9393e633f0e0c8bfeeb4da221ab289715883427cda9", - "header": { - "parent_hash": "6f7b91aa652da5199000ec901fad2206ee7bd2fd7ccc00f6aa392157404a0fd3", - "state_root_hash": "7dc0efc0951998f50565066a15899e90f73a55e8faf22a6b6a0904be9a48da7c", - "body_hash": "9795ec386b71cee3c0b831b582ba41a1021422065b238f915174324fa77f4772", - "random_bit": false, - "accumulated_seed": "59b54928b8880bbed0dabeb9ca90f1c8bf22c9458aa01976a2c3b06fae7bec66", - "era_end": null, - "timestamp": "2024-02-28T16:24:29.440Z", - "era_id": 1, - "height": 10, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01c46f9899a51d9c71c934295b06da83a6bbd9219aac83c3a6e205541f1806ee1618a48125f328a3f017dd5e658db8bc94256ac2938f03259987bea1c0dca25a08" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "017b3dfac87d8dd9fd239cf1fdb342edd5a3c131ec0f9a64d9c8a829d814834612f235cf7d00274cfe6d1901fdbfce597216b48ad9dfb9a4873967612ee577770a" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01337b4ec2e339cee8dcde4a29cc89ccc3b9834697df34ee432592b25b1f2a1c402c1f8067c93d1d2750eb5352ab6a9489754fca96d146792701dcc28e294b600d" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01d2456dd127b9d8ac0f34d7e28403dc7650da3aa7181f515758737486a94edbcb93ff86e9da4b5828e69e0886c235430ace613b70bf84c26a5c70769e3a82350a" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01aa4712bd86e341ac6be6ec5d2887bd04d870d3e97c146d0726855669e65a58b2639933080fe392bac099ac20f07c2aa7d3e620f4cb955302a6045965c7ac4206" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-11.json b/tests/assets/blocks/block-11.json deleted file mode 100644 index 3f1c13e..0000000 --- a/tests/assets/blocks/block-11.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "hash": "6542c015fdf2e7866446d4f19fd4757dfdb2cdc85018e32797e46356525232b2", - "header": { - "parent_hash": "d144eaf98bb4d622fb35b9393e633f0e0c8bfeeb4da221ab289715883427cda9", - "state_root_hash": "9eb0bc781ce08481b249ad01bfe8a1a46cd7a756ea4e30180260e72b4af7e971", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": true, - "accumulated_seed": "65bfff36327a35bc1c3f64e84bd92803c16ec1cf09fcd9b1dcc87018a828bf38", - "era_end": { - "era_report": { - "equivocators": [], - "rewards": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "amount": 1999999999990 - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "amount": 1999999999990 - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "amount": 2000000000000 - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "amount": 2000000000000 - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "amount": 2000000000000 - } - ], - "inactive_validators": [] - }, - "next_era_validator_weights": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "weight": "2000000000000000002" - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "weight": "2000000000000000004" - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "weight": "2000000000000000006" - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "weight": "2000000000000000010" - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "weight": "2000000000000000008" - } - ] - }, - "timestamp": "2024-02-28T16:24:33.536Z", - "era_id": 1, - "height": 11, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01635d9848aaae20619228319551aa6c13ef6d052688c9bbc8ee03f14a916f12b3ed4c429d2ff47d5f01122b3ad390968c5e7905ab90e6f92a96b87aa7f265930b" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0170911de3be2ead0d8594e70b0c3cf9d6a359e1539fb06875b3d03d631b414a8acae6cb21e697793153c27257abbfeee2d8bf97eea622d4c9c19a7ba47c31ce08" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01b8ea775239842213a149e4937bef6659bc7115a92064e8665174bcd61044b0e4c3bfacc35f9450a3392df48922c862e59f5026dda3a3440749b7522d795cf30f" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01bf143f4c0c5bc1b0f7bfcaaba363a5a5ab1c74544dc6138fb4e46747cbbaccc83b8a042326ade3378d0d859ddd0bdf3b6e851692a9179320ee0b887ef599a608" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "018fcf3fb75bc3b0fd00a1abd9fa74a9bb2cbe8da280fe87118e8a04baa4363bf586f44704efcc191ac265aee78ec180e33c17f2e702a9352262c91a18243e5505" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-12.json b/tests/assets/blocks/block-12.json deleted file mode 100644 index 099ac11..0000000 --- a/tests/assets/blocks/block-12.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "8ac7484105c1b770d585e2cb72b2a7e89d89a396e7ad92d435ea23484358af70", - "header": { - "parent_hash": "6542c015fdf2e7866446d4f19fd4757dfdb2cdc85018e32797e46356525232b2", - "state_root_hash": "9eb0bc781ce08481b249ad01bfe8a1a46cd7a756ea4e30180260e72b4af7e971", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": false, - "accumulated_seed": "ac977c387207fd207b7262ab9e8ac0fb92c23cf037741016e16026d7596e8263", - "era_end": null, - "timestamp": "2024-02-28T16:24:37.632Z", - "era_id": 2, - "height": 12, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01d4e96e945d488a91fb4816395570008c4e777088887a2aa40303aec7137d352164c6b691f34b6e9a0f057b06762a293081b14554eb84d1b8a7482bfc0698b505" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "015e71488bc15fb4da8b5996752db18e1fea2143b7d9d18766f0e0ca4bcd0e278afba7513954b09c51426d4f856e24d483f6ea2e3c640bd5af0a0bb2b65f8c870e" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01edac2018e805d47348c5974dca04d830b9fab576bf55df56a0ecbe1e058b75c36b5cc6c077f78fa54405ae309a972cca4ed6a47a7b9dccda20960adb01e7ca0a" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0149f26268f54a0caf6b02a4e26fc6e7d011fa95a76794ae3b4bcaabc890356c7e6f7a6c88ae443b2ec4271127e220f8000b41fa02693b3526605f072049d67c09" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01eca37a01475c929df5aa6c23d770bb1dedd30e2d7837508d8bba3cbcf0396d21af525ddc32186aa847ce6d4024ac9928ee9e88996aa3b7814e3f71c17428340b" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-13.json b/tests/assets/blocks/block-13.json deleted file mode 100644 index 92d8245..0000000 --- a/tests/assets/blocks/block-13.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "0cef9adf5d0dc6fc04aa36edfc57875debed933faf714bb56b4b90ea6c9fa403", - "header": { - "parent_hash": "8ac7484105c1b770d585e2cb72b2a7e89d89a396e7ad92d435ea23484358af70", - "state_root_hash": "9eb0bc781ce08481b249ad01bfe8a1a46cd7a756ea4e30180260e72b4af7e971", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": false, - "accumulated_seed": "ba8d2a48ade6efc7c9676b3c50ae4475bc6e4a1b1d48ae9b622d92f5e12dedec", - "era_end": null, - "timestamp": "2024-02-28T16:24:41.728Z", - "era_id": 2, - "height": 13, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "0135c1ad9f1f4a1e3aa88739ffa18b06475981a98c024a8e50e6e119754cd3aaf6ab4d819ac9fb6718f8e52f42dd25272d6077a349c930ba7a9042c12df6655009" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0112c658124ccc754db264805cc33e30040e69080b706c27024331c369f192771ffa41057117c7c476172d05f1d329a220d2523cc0a387d9ac8a38101a2bee7304" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0167178174a0ccdb8372be96ee88e37ca93be7fa93be6ffe5e248f8cd0c1fb279ae2721fc05397d3c86e519bd680fdfbac4b3cb3c14580e236e502733fe0d95b00" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01fb2023e46d7da53bc9d6f4801991a89eda9df624e2a685955940e038c9435a29ecbc6679733ba625bb2c071a4100f6fb7baaafcc8d8950273ef47f7ccd541d03" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01ca9d3e50efcb64bebbd42761db96a52a09e7c0349ab6cbce49bb9588d1d7579495fe8d008a29f16c6bcd302f29445269bc534cc9383908bdd8aad7f1d192a308" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-14.json b/tests/assets/blocks/block-14.json deleted file mode 100644 index ceaa437..0000000 --- a/tests/assets/blocks/block-14.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "ed4c957a63b2091772f7d78da2503014ed2db970e33695f594ad1ab840201207", - "header": { - "parent_hash": "0cef9adf5d0dc6fc04aa36edfc57875debed933faf714bb56b4b90ea6c9fa403", - "state_root_hash": "9eb0bc781ce08481b249ad01bfe8a1a46cd7a756ea4e30180260e72b4af7e971", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": false, - "accumulated_seed": "e9a46c0a8369c4afba2ea7da788e761af7df475057230dd7e853f10fb0c574f0", - "era_end": null, - "timestamp": "2024-02-28T16:24:45.824Z", - "era_id": 2, - "height": 14, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01fd743a3ae697d0c05b0755b7aa9f5e8b73c6c1d53375f5f556f3bcf8d3c9716f8ba841a533ec05335cff8ce9549f3cc0070876ad0b634964e07036063f7fe100" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "015f471fbd7136751c78cee7f84e25101c4cca044bd6edb672acbfcff88b45737330862eee130ebd5a86df78bfbd9dbeaae8ea5deb1e2162ddc9062b351396130c" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01cd4e1bcd383b6498fb5769d485615914f43afb714411f4a0de75f4ae98e9ef76a490461fad15ad03bc23acfafe7cff94aad2524f1dad4557b41009327a120f06" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01a81283ead4cc982412fcbc8b5056caf04a7afe8f948e552da9559ff6c37f2d031b390506e9376b2cf8910dc5dd01199c475a85f149a8204d1d4f0006b356200c" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01832902fb1f3c1533c0fcc4c2f4e85d73abe6ae3ba9c648189210c8bc02bd6a9fca2aeeeac5d9042e9cf43f2273507b089dd577f4c33a71e56eed070355e87f09" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-15.json b/tests/assets/blocks/block-15.json deleted file mode 100644 index 75b02a2..0000000 --- a/tests/assets/blocks/block-15.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "79f9468a04a10cad6769add640cf9a13ad7f4869b92f782cd44ef6cf1f6129ff", - "header": { - "parent_hash": "ed4c957a63b2091772f7d78da2503014ed2db970e33695f594ad1ab840201207", - "state_root_hash": "9eb0bc781ce08481b249ad01bfe8a1a46cd7a756ea4e30180260e72b4af7e971", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": false, - "accumulated_seed": "6f8c1e82febf260d5f32b9f3a88eef1dc35b828d94cf2d630ea9fbeed49a62f2", - "era_end": null, - "timestamp": "2024-02-28T16:24:49.920Z", - "era_id": 2, - "height": 15, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01bcb521d7893d8f989ea982a0be9e5a8bdb4f6b122d8a7b404ca99e00a9326cdceaf28d29420ee1145f1abb531f92031b478de37d0e7cf84c8f414fd4760c940c" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01a23abcfb0e8c3bd11055b1314475a35a7e461c430c0a6a8f6c2899e26baa7495de6d00b4cbf191520bab78358826e4d4903b833e908956565e3afb25bb51d503" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "011dd642544338e983e7de40441f8ea24d9af822f4c4370d49110eec46c0f5c2232b2c7ca23b242235e6a8dc958ac321711e318043819c7bfb8ab70a1313c0660e" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "019e5dbb0641acc20905541dd0f3d3cafe921c11d8e4f1a891b8f05bdd7012bc93d27ef6eb53bc54b5e99c285e181b3396675f3e4e6fef72f0127a55412faf890b" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "011ff9a98a1e51f7741e6a93666bf05704abe3e67a818b9b0cb7ab366797d539591a92b37b70255ae179614dac99823c4ba9cc96e60761073ee4139b6344a3ec06" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-16.json b/tests/assets/blocks/block-16.json deleted file mode 100644 index 871b685..0000000 --- a/tests/assets/blocks/block-16.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "1ee0c3a3b6861382d19eb2bdcac82af1cdba83bc4848ae933fe6d882c7a56e91", - "header": { - "parent_hash": "79f9468a04a10cad6769add640cf9a13ad7f4869b92f782cd44ef6cf1f6129ff", - "state_root_hash": "9eb0bc781ce08481b249ad01bfe8a1a46cd7a756ea4e30180260e72b4af7e971", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": true, - "accumulated_seed": "f6277fece079e2fd3c2c0f97320ac981724d510cc1f2b7aad546f347968e8560", - "era_end": null, - "timestamp": "2024-02-28T16:24:54.016Z", - "era_id": 2, - "height": 16, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01c8af8e50d7eeaaa8b4d299928a912a31f7cdd0d63143f522f976459575cc1c06d97ac5a54c3b6b0d87b9059478685d28cf304b122a87027014bbe72664558906" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01c22f965807286397ea08dd9c5517646e7d293dd9f37b6abf617a02d21cb5e4796c1c51d93a74c3b2673107eab02c1500b01088dbc012f0224dd3dc32da95cf04" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "013784f7a33fb20c5cd109256f5d8a181c0edde366d6d0013d8a3be3e734783014f16a4858d5b8872551468884b64f4124eb67dc842fc5e6ba06cbf6bbe298d706" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "017eb222aea0639bed8f98b8cac36d29788f5e913e0ac19ba0a0f4f7c4032c4a5f7e71602ec2b6a9301d0fc2ce55910ef197b3fd641c989e3034354bcde9ed0a05" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01ee7c3b57581afad7c35b69e8e40fb539a99abad50b09a1adfd78ca77c9a56f4163ac02dfa64b78f0c7c88831dac7921dc2b8996cefa94aca47f37d533ed8e109" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-17.json b/tests/assets/blocks/block-17.json deleted file mode 100644 index 5983c2b..0000000 --- a/tests/assets/blocks/block-17.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "419a63f898a3b81203070763ddf9289aef64b3f347b32850f11bea2c74f9f2cd", - "header": { - "parent_hash": "1ee0c3a3b6861382d19eb2bdcac82af1cdba83bc4848ae933fe6d882c7a56e91", - "state_root_hash": "9eb0bc781ce08481b249ad01bfe8a1a46cd7a756ea4e30180260e72b4af7e971", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": true, - "accumulated_seed": "2a0b159bfd02a201eb703fedfa89d14263ae381a51b8e4ac5c6237ed6c11778f", - "era_end": null, - "timestamp": "2024-02-28T16:24:58.112Z", - "era_id": 2, - "height": 17, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "014aa46a6e629b2d271f3f2e8bfa158f16e168a5beb15269baf850a3eb9cc0c489eee5610d095d339dafc155c7c2c614c8e611e5aa114d9b8400c1a3985c2ea90c" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0112560275e8fde4961c439908c97d7116b68db30f915d60fa8812527e81db27a560e2ee174fe844fb9e721406e02582cd83fb86dab28554e57c392aff557a590f" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "016c3ea4de26902cb424809dfd14db8346b2864dcdcc822efaa00b5a274581d89982eae7e64fa89bca2552a34973e211113ab8ba131ff4be6b8536154be05b8404" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01d7497fd72891d7c34908d415ac9ff7729368f46e23bfe09e6569da0d20f2e4ea06848ddc1b8b49ab0356723ea057eacbe56c54c49a230a925223e0cad9e0b608" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "016b39917e09b449de68a538e887633d5d12e999ad14c67d580e7fdf6984a1cb35de4bb046270eb7474b05be4d6e2366bf4c12bae6cd40c765e08ab901719f6b0d" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-18.json b/tests/assets/blocks/block-18.json deleted file mode 100644 index 90b980d..0000000 --- a/tests/assets/blocks/block-18.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "27aac4e0695110f8153992ce054e67fae2c608799bf9b1b7b8cebed0d47d7d27", - "header": { - "parent_hash": "419a63f898a3b81203070763ddf9289aef64b3f347b32850f11bea2c74f9f2cd", - "state_root_hash": "9eb0bc781ce08481b249ad01bfe8a1a46cd7a756ea4e30180260e72b4af7e971", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": true, - "accumulated_seed": "60ab0ef15aa2a4adb58ca2499d8d1e6adf40e650463fde683d30ac3f192187cd", - "era_end": null, - "timestamp": "2024-02-28T16:25:02.208Z", - "era_id": 2, - "height": 18, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01c482b6227439d00255fc24f1044aa1547ae8d378c71e40a58061f8d8a189ba2193a6fb031b274936547ae2402a26f1110f4b32b5ed1c9d424aa1d9241a99c400" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "014dc7b12474aea82610fae0a759b51d99aed191bec5aea9f371874983afc2bed8609757d06a7c74bddafa94a479a4e0e3fa1ad2f7ec7e26f653b0b53720045d0c" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01f7b21d0e36976624545ad9b3ac25156dbd1dbbb7ab8a185bb4ae9bd44f20e82839b85322d5747f04f2d40ab8f75461430c0d0d1b7dc0679e27b7b6dacd388803" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01c8cbf1c52c062dade31485fed8339b132555f6da6ae1698f5105b5c521614c153c05bac7453c98c6309a238eacfc6b2ce340d25f6f10749478c6f654d9704d0d" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "018f8c227d3d34639f1b739bfefbd48bf7929ffcd69af5cd9d9bec40fee251973de2c980fb81c522fa4507113abbb5d1021ef0b3cfdf45ef068fbede09632fe309" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-19.json b/tests/assets/blocks/block-19.json deleted file mode 100644 index 9607fca..0000000 --- a/tests/assets/blocks/block-19.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "26e47062e1669945d902ebf706e6dc48ed4f27da3a55b5f98eaf49ac6307dc8e", - "header": { - "parent_hash": "27aac4e0695110f8153992ce054e67fae2c608799bf9b1b7b8cebed0d47d7d27", - "state_root_hash": "9eb0bc781ce08481b249ad01bfe8a1a46cd7a756ea4e30180260e72b4af7e971", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": false, - "accumulated_seed": "d0b85a4ff3e1c8367fe56392930189d95d67496327f0223ebd76f004d74f7a48", - "era_end": null, - "timestamp": "2024-02-28T16:25:06.304Z", - "era_id": 2, - "height": 19, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01d1d22217d66f3c77c046d591595bfacf9713b5ff201b05d5ec8f4a405d0b6dea2e3acc8c9c3273598866b97e98b1ea361ef99e256e024274a21ec9aeae7b6603" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01a319e4d56dea7881cc8e07c097f1df25eb522f86be746379f9fb37bb77752fa5abd4b7d25f53ac8fb2de32ebd85a9e1ced6c4f55145072f702c980442d43fb07" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0196ac3373255ce31b03e1dcdf9699182cb760d0ece7855227bb78530e88a12720bc9a13ed42217440d069e33673cad0a9887c7128f35624269fb365817bfff805" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01ff07128cdab44e5884dbc0631b9ba653f55d7502e09f2f37347fd01ecbfdf74b322bc0d41748e15a05974059c2390420b70a86c53d128596de9c00e6049c500f" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01951a8da73268a344c51a27974c8614137c31d201fe5296ba7f3301d7636f1bce8c2cd0a2f5477b21a18e3d181fbf4226555f283a2922416f86511e926eb4700d" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-2.json b/tests/assets/blocks/block-2.json deleted file mode 100644 index e564dba..0000000 --- a/tests/assets/blocks/block-2.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "cd073ab322296f5181e559cdc9cd2dc68d237287589db3a562d17627f2e02772", - "header": { - "parent_hash": "923b4a86497593062a684c266d2fc96e8961c65ddae68119a444630d58c18abd", - "state_root_hash": "7dc0efc0951998f50565066a15899e90f73a55e8faf22a6b6a0904be9a48da7c", - "body_hash": "9795ec386b71cee3c0b831b582ba41a1021422065b238f915174324fa77f4772", - "random_bit": true, - "accumulated_seed": "7e672841cec079dbc636b3fedbc8fd70e6f0d499cab2b4f577054d8336d3254c", - "era_end": null, - "timestamp": "2024-02-28T16:23:56.672Z", - "era_id": 1, - "height": 2, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01dc72be47d281a5358ec096a284b2d084f628c3f91df2a12d01e0947b67aabd2bb50f6aaa0e5f6ae6988ea9fa19e32dbeb5186821b2d5d5aee12b3b75036fa100" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "014fc7985e89540aad23d9856bf5dcca65ae48f403e2b7dec1578bef0e4505d8a3d1054a65ccf7367470780c0dd62d45a94e6c02120a8fa7c2181fd29efa185e05" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0112fbe4f43f522f102536b52bd42badbc67582dc24782c29398dadffcb6b7febfa5b4c459dec405af926c49f22218f4ec879cd01700da71ea486385fcf5cab20b" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01e2dee0f49f58e61c8bbe37052081809fa2c16a1b2bf6baaaffbce2b79a18e2d72caffaec08c668b501dd396c9d14363e623e8730e81f0c51fadb39447f8a6a0b" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01484549ebcc9f36441d296311a7d74b4034e96322a259400b5f373483b42806ef2a5389ae228c00bd37efc10aa9322900cf02d819836000dc6a509270e4f4230f" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-20.json b/tests/assets/blocks/block-20.json deleted file mode 100644 index df20d2a..0000000 --- a/tests/assets/blocks/block-20.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "d2b77667e041c81be153e26ef584e374a667cbd37c7f517d1fe7bfc06c26413c", - "header": { - "parent_hash": "26e47062e1669945d902ebf706e6dc48ed4f27da3a55b5f98eaf49ac6307dc8e", - "state_root_hash": "9eb0bc781ce08481b249ad01bfe8a1a46cd7a756ea4e30180260e72b4af7e971", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": true, - "accumulated_seed": "8f80e6922f11c50b00166f7bb504a7e09a28b9c07658c0aca8d4b1e8d10e155b", - "era_end": null, - "timestamp": "2024-02-28T16:25:10.400Z", - "era_id": 2, - "height": 20, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "019f1d59b16fe7aade9ed45a5237a85544e83bc07db9492a610102f9c4595fe014e96ce05c4b332d2e0b507cf38cf57ca0027bebf801ce1e01cd7a688eac335208" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "011878378cfef612fb52703be47eb3aab52cd7e3c12751bd4e3b43abcbf8f3576ca7e8daa90422c53be71f4b5383cb948302af374462afa2aca4503e74de5f0207" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "012a36ec834ee91f7236f9d3885f87c943eadac058b21ebf007b6873a4bb120acf90a31eec7cfb7c5ecacb0d3d7524fa7ba720d629c19e9412ac28607d13cb750c" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "016d8bad346c734c9b007f3def725b3d1956e888ac9280eb1db22360610ec5af2f9e55cdfee981ef9a1486d395f0198e4e5182af01b1d3bd592ea234343b141202" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "018c10416027ea2677fb5f28bfc631c0533efa9d75e1126a23c51a777e8900e460dd12e3d33620a4ecd6c4f70262196e5199dd8880677c8b87675fbb81156b920b" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-21.json b/tests/assets/blocks/block-21.json deleted file mode 100644 index 789b370..0000000 --- a/tests/assets/blocks/block-21.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "9f69a39016614ba587210fb82806cade4c0f6505dc3e7d9b4ed989554ad06850", - "header": { - "parent_hash": "d2b77667e041c81be153e26ef584e374a667cbd37c7f517d1fe7bfc06c26413c", - "state_root_hash": "9eb0bc781ce08481b249ad01bfe8a1a46cd7a756ea4e30180260e72b4af7e971", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": false, - "accumulated_seed": "bb89a18b77b3ab346ce9660f5fcf28e0f44aae0ae9fbe86e5ece8d3740663d33", - "era_end": null, - "timestamp": "2024-02-28T16:25:14.496Z", - "era_id": 2, - "height": 21, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01f72999bc07084824ff9317ad8fa16cf1d15694a3d92d581fb530136a6e9f3d73a5076e16de7c14665a27ed5cb2f88e9600f21bcf5cfe3f7bd900d7ce292cb10e" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01a5562d35c56dcb08b7a9e4e3bd038c05b113dc2851960887537d0d4e4aaada3a2c4c30cb1451fb41c1eee9e8a9d331c0a6c9290ddfc4c22d9ca4b5e73fb9da06" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "016052a4881db77856be4fc333d53d0f5ec5f1e6384de33a1a420ebc72b57ad202e46c9441fbb0549ab06bf40b066d86946c9c19f260841197aea1ed3857f36005" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "016310f9916c4a3b3114eef499afabd16b5c1338d259d92eb70e6fcc767aa7ddb13b2e1b7bfe5876ace49499439b0f951683687bc6bd368754e253380d82189d03" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "013a65c4fadc42bda9cb520297aa4af571c92b9214a84c698c21d751fbc1bb94acacf755adf152a77edb6cc5fdc7208253bb52653b5f20c8b1232ab15f8955e60f" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-22.json b/tests/assets/blocks/block-22.json deleted file mode 100644 index 4a02f63..0000000 --- a/tests/assets/blocks/block-22.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "hash": "a2897157c35ba5d9730ed1c86d5d8196a1e58a2c13c69d338db46edbf833ed2e", - "header": { - "parent_hash": "9f69a39016614ba587210fb82806cade4c0f6505dc3e7d9b4ed989554ad06850", - "state_root_hash": "6b10a03c42f813629e71a47c604d2f51d59365327bbd11fcc3c4108dae3b84dc", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": false, - "accumulated_seed": "19faf61dc87ceaf4f7d9389dea6deb3010e85156691210645f40725a5b9d5479", - "era_end": { - "era_report": { - "equivocators": [], - "rewards": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "amount": 1999999999990 - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "amount": 1999999999990 - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "amount": 2000000000000 - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "amount": 2000000000000 - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "amount": 2000000000000 - } - ], - "inactive_validators": [] - }, - "next_era_validator_weights": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "weight": "2009999999999950003" - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "weight": "2009999999999950005" - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "weight": "2010000000000000008" - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "weight": "2010000000000000012" - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "weight": "2010000000000000010" - } - ] - }, - "timestamp": "2024-02-28T16:25:18.592Z", - "era_id": 2, - "height": 22, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01a01861023790d4825768d7c52292919ef140ba64e71faf2eb7626004ead0a22716a61e1d35cd93f4b22157053e3b15d89bf10dbe9522b45ae4475bebfc192d08" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01551424136063160abae32f4a6f90bc6d9f6d204222fa049d7241324383d597ebae3b39bc9f64a780bf1bd2df86b1afd0632b5c6774debbfa6d8d039b54b74e03" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "012265778e64b9f8e790155487baa61daa77499706ee75424fb5e7305f1e54a37cf70359ed4463ab1d4012cc116269e34b00ff37ad1eb3ecae942ccc804a2d7201" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01423465f5552da3f600cec995b20b8dae1e403db07229284f29f01db426eee1c1277b6c478a3dc76c14b77a47a494f2ba77a2b9b9ee0afe73ac331ddfc3c04009" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "0130def5c7e03096bfbbcfe770646a7fa854f400ebfa78a5e723838e88e5285ea07c69868f9f73960317d556210413b387dae5a837ba5819133e6d4b5dc879cd03" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-23.json b/tests/assets/blocks/block-23.json deleted file mode 100644 index 8e0fdb3..0000000 --- a/tests/assets/blocks/block-23.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "3ea2f4ca8e3425e5b70b042761a4fd49f9771081ec033481aa047690097ac3e9", - "header": { - "parent_hash": "a2897157c35ba5d9730ed1c86d5d8196a1e58a2c13c69d338db46edbf833ed2e", - "state_root_hash": "6b10a03c42f813629e71a47c604d2f51d59365327bbd11fcc3c4108dae3b84dc", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": true, - "accumulated_seed": "84156b7c129b254e91b76e1625b3eb876918d2bc83f4abec638e53ce2b9efaaf", - "era_end": null, - "timestamp": "2024-02-28T16:25:22.688Z", - "era_id": 3, - "height": 23, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01658dc1d708631d53fca62a0a1628be320fe0e98443a949e134db0bf5f7f49645fd9fcff2f340b1bdf1eb331faff4e7ae90ec0be369993375b6f2ecdec957010b" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01b11055f83d935ffb3aa2a0252b7754eef42083b2a2cab59d9739db0c42bdb442230cd1ac4020456937ca58bddda2c91a60580b8af4c0ab4706557241430fca08" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "019bc80786533817e4fd769996e56af089f717d77329f4ad178f98901c3f8fd44f1204989a9d84ad04371697133445828de50138b786229d5f826b6fe2543d5d0b" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01f61154b63acaace9a2cd16367d6b1fec1a5d83fb7e58ad11d63831c8016a48074b0a585114fbf3e344d0d98d3174e0be521ef4f87026d7764aeeed407ba0f405" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01f3175ace7ab3a54753827cba061b2b19eddb60c71724c7aa2008b6a3b6196e62b29f24b5b6ed7173c5f3f84aa7c590ccef21335ac481bf08c22119f94564f30e" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-24.json b/tests/assets/blocks/block-24.json deleted file mode 100644 index 8da3c7c..0000000 --- a/tests/assets/blocks/block-24.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "7ab564768645556d405bd62bfba48d71c4d0360203bd4c2a6395fbc04cfb14e0", - "header": { - "parent_hash": "3ea2f4ca8e3425e5b70b042761a4fd49f9771081ec033481aa047690097ac3e9", - "state_root_hash": "6b10a03c42f813629e71a47c604d2f51d59365327bbd11fcc3c4108dae3b84dc", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": true, - "accumulated_seed": "8d111a9213035eb319cbdb8d2e104a29d6abd2b7eddce8a6498fb048960af996", - "era_end": null, - "timestamp": "2024-02-28T16:25:26.784Z", - "era_id": 3, - "height": 24, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01c298b033fce14d51655f5a6d5fcc91ae4b534aa9029ca36c5252775b32abb77285ede721496f7d7efc37dae8335af732f5171496ab6c61167f677b5e01262800" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0118e06940509faf111f0eeca0146490ee69318b9ad294319cb34b9325713be58d363422b8944d42eaae00a232c55a13d01e4adc68195243372079e31c9a3d820d" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0156de26bf663442e722f6b0a179669d9cbcc2d3fb34fa781a51faf25b1a2182f0b42448abe73d7c59db30a565ba40c243f200b1c2e45ebc7bc9a8d588ab237c07" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01b64cc07760b811a1e77610b7331cd6734591018595844f6ae0197d9ea9957cf3f69505632f121d74f90d32b248497b2b198405d1bcdce2c8e9d7e9fa95f86b05" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01668e5916858e830b582f0d560ebf38133564bd59b765aad208b980c60cdd4fdc629360a121932e04b236a9f65c93c22d9db44c7979bdf3419e314ff6a4990108" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-25.json b/tests/assets/blocks/block-25.json deleted file mode 100644 index fb5bc1b..0000000 --- a/tests/assets/blocks/block-25.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "8c95d8236e670d7458ec3ef7af5dcc5a9d5eba5095599ffd70b98b240fdaf57a", - "header": { - "parent_hash": "7ab564768645556d405bd62bfba48d71c4d0360203bd4c2a6395fbc04cfb14e0", - "state_root_hash": "6b10a03c42f813629e71a47c604d2f51d59365327bbd11fcc3c4108dae3b84dc", - "body_hash": "9795ec386b71cee3c0b831b582ba41a1021422065b238f915174324fa77f4772", - "random_bit": false, - "accumulated_seed": "2c15744c79dbb498f060d220747e17c31b59b48a8657170bb654c2e8c5f714bc", - "era_end": null, - "timestamp": "2024-02-28T16:25:30.880Z", - "era_id": 3, - "height": 25, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01e2db12a1454b463b3599292c85ad960b2e3da99fe00f50cbc05bc9d356f6e2ed84d2e943bba3e82beb3bb911444de6a5ded52ff1b1b657cf0e65dc6eb1d0fc01" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01b5a65fdea1113b7a0b0ec945c297fcd84d8042e627ea4eb5c361583c9664b4943749735a43cba7af6510345af54addf7ca251ba041c7f3d7a581c858191f0108" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0144cabe8ad8d3af251a448e33703dfb022f9761a1fab89fa0393f0ea71659ae289885189fc232542b2f09c2f3d1b0af64eec626d187e03e6fee7a02ad321c4608" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0103cf37ff80f4b48731e77a8d6ebacaa8c72703e62576a1bee7e518dc42e50700831d64f33f299cfd030ed2f56a20544d05cb8be9b73494463d8bfbb882ae2000" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "013432c116a8a7479598eaffa0583cc4c015c4df17cd7fc8c9e4018e7173061cc40a0a07a8993f8cfa37b67d9c218dc63a9b2944738ebfa2d8a1a3363ad0c22a06" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-26.json b/tests/assets/blocks/block-26.json deleted file mode 100644 index 5a1dd54..0000000 --- a/tests/assets/blocks/block-26.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "f479e2ab665de615d0f2e0aa9fc1c343b2e388104fc561a3ce2371ad0bbb2e4a", - "header": { - "parent_hash": "8c95d8236e670d7458ec3ef7af5dcc5a9d5eba5095599ffd70b98b240fdaf57a", - "state_root_hash": "6b10a03c42f813629e71a47c604d2f51d59365327bbd11fcc3c4108dae3b84dc", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "c954da4faeca959fb5a278276603ab88ffab0f0c6b71ffc73a5ba3bafc3fb84c", - "era_end": null, - "timestamp": "2024-02-28T16:25:34.976Z", - "era_id": 3, - "height": 26, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "0107f8c675f3c2814b9cac1e68022c14dc31e2da933e7a221694533e7b59a3d7c7fb311d7cf46a62bf28c94a46bf3c580761c82af96c7d1d04e1c89506239b7909" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01731981989205b960b321e71ac7d23e9be61e00af35be95595098ce315f10dc08be2558d9fac34bb5607121de0c69a24478478bea3452557b689b72d2639c0d0c" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01217cbaa943c3910b35d511902f3eb86fbbda8f18c00fa00e99dd69d45e25b5fa6ebfe4d44d56f9ae82cf1aa28a4bfe8a4c549f95f5a86a0ca8f7e13996662a07" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0182c901d04d5840259fe1ece6d16bd0e4b59dd442b3fb4fd05a771e422c632b64b44deeba9fff7afe80eb6645faf9829ab87c172db64421b15e405d98d2901b01" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01b4e1594102fd09a50b985de2a710ba8024d4b59ee6c51248ab2e4e9c078d4217b82c519b0dc0131c6766ff032b39b11f3c4b5a096869dbfb0a5a960d020ac40b" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-27.json b/tests/assets/blocks/block-27.json deleted file mode 100644 index 9884699..0000000 --- a/tests/assets/blocks/block-27.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "6d99a703a1ded3f998db842d0e19e9eee5170de420012c41d398e51c112fbe5c", - "header": { - "parent_hash": "f479e2ab665de615d0f2e0aa9fc1c343b2e388104fc561a3ce2371ad0bbb2e4a", - "state_root_hash": "6b10a03c42f813629e71a47c604d2f51d59365327bbd11fcc3c4108dae3b84dc", - "body_hash": "9795ec386b71cee3c0b831b582ba41a1021422065b238f915174324fa77f4772", - "random_bit": true, - "accumulated_seed": "6e41a7d6fa499e36041fd3646f41ab84ca4fb69c488357bf95eb1280f13fad83", - "era_end": null, - "timestamp": "2024-02-28T16:25:39.072Z", - "era_id": 3, - "height": 27, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "013ef4e51247024844285f697389f79a19d678f0b37077eeabd0899cab2652a4384fea625e8ba215c45496f849618270024d26895be4825363bfae6d53d14d1702" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0108673539d38dc142493674b8044d08c110736bc598173130ed0fa1d28d26559271c01094eea61e02a169dc90fccdace4f1e1bf9b124dfd37875e836a148e6e0e" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0142804c4cf796e9a8a27d263cad68dda04bb481066291821053f83fd89514d51dcddec815d0267440405bebf9efde3c5db535e295d21c5247fa0d5597c320b20a" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "017dc325cee661f915ae861ef4784066ef7f27b4d80e86ba15565c234235471d704913ab56cfa23926cb430a7d3436876f79ddd0d6c52c7a27ae6f35c1d727ca0c" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01f00c1e2d4b480fd643973d09d4b46a7e6f0c5b099f229ba6a660ed4b5ca5500f4cbdeb52911eed9ac7d4753fd2c72243efb056bc3b566b9c79519c38e675d50f" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-28.json b/tests/assets/blocks/block-28.json deleted file mode 100644 index 2f10e6a..0000000 --- a/tests/assets/blocks/block-28.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "df06339f3b308995552ef2efd3931a3f4ee99d6dbdb8bc10d6f55312e4ca6ed6", - "header": { - "parent_hash": "6d99a703a1ded3f998db842d0e19e9eee5170de420012c41d398e51c112fbe5c", - "state_root_hash": "6b10a03c42f813629e71a47c604d2f51d59365327bbd11fcc3c4108dae3b84dc", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": false, - "accumulated_seed": "6cb0aed290883dde3e3b5d98506a18ebda013c246c7bcc9d1b9da44453f55569", - "era_end": null, - "timestamp": "2024-02-28T16:25:43.168Z", - "era_id": 3, - "height": 28, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "018c77550a6ede75c375395bb4e557bb7461396ea53f8f21c21db57449c879bd30c3797d848c00b65fd352e036fff4c18435bc5d427649a456ccb7b91b249e840a" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01d56450a63619f7593d86996213e28eb38891ce9a5eedb186fa12a58fac941b4050228cf385467c0dc41abcbbb82a16988fe2e02c1b11985cc32862868b81ca04" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01a5c03d2dcd9b60c06aed0315c62f2adba17126d41c3b0d625defd69625cec37c4a564f58afde38815dbc19c82a5d29366f105af044bd3eb836dcadee06ed1206" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "017e22932954aaf6925c484ea773cace5dffbadd17e1cba75ee61a25a060e9e1b1b6009d3e467dc22793c39aa2741365e28ff0ff8f23660e5265ab8697c63f8208" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01cef485de8ac0e9addcbc6c2ad8b2eaa07c7269260463fa14de15eff12e02c9ff2ed51ccd772faaef2938a12ffa61612194d961ae404dfb2d3fea49d6a9c8f50b" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-29.json b/tests/assets/blocks/block-29.json deleted file mode 100644 index e2ca4bd..0000000 --- a/tests/assets/blocks/block-29.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "58f600ce41f68e137d5fc958669601505e93d5eaa0285748118040574f2d505b", - "header": { - "parent_hash": "df06339f3b308995552ef2efd3931a3f4ee99d6dbdb8bc10d6f55312e4ca6ed6", - "state_root_hash": "6b10a03c42f813629e71a47c604d2f51d59365327bbd11fcc3c4108dae3b84dc", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": true, - "accumulated_seed": "2ea5e4bcf541e3dcb5a08bb57d40e24b88a8835c237a8afb96b44115e9e7c6cb", - "era_end": null, - "timestamp": "2024-02-28T16:25:47.264Z", - "era_id": 3, - "height": 29, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01c48a12d43a2dac8bdc5a192945f6e6408cbc53764e9b84610c24c3e037dd1fac130f8c4ea3db5aa9091546e7ba2340b0f05d4d0add81d82201f55fda23ad1006" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01131d78dbca15ed8ed9ff803689116df2164f0857ac01d9eb5a5f08f698a46d3c9e4b72b881ae3bf2955adb4fba636e954b13b5496e683b9c69b77a2dbb0baf00" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01ba5f7cbb73e42cdccf171bf3843f88f782c977f2744c8dab8446c7d16fd50114de64b1fd964c9865f42ce0e996a8ce07b88eb7b837243a5af614b7aeb726f700" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "018fd54ef1e2916f454f96b6c6e38efe732f0c110fe8b224ebc556c5e11305f511e8f651815fbd7154200ec0d5128c44d35e2a581995fe9596c63017613928de0c" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "016a4ef5bd9cff80ac284e01b88faebdf08f60922cbcb018d90b5e0c04d8e8d879b5cd944b39b9290bc48dbc35f3a4151ca8b1f51ebbc97ec5d6e40cbeea870805" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-3.json b/tests/assets/blocks/block-3.json deleted file mode 100644 index 5e94a96..0000000 --- a/tests/assets/blocks/block-3.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "f0f3aeee6f831b5847225bb0426aa241f9d03184b15af55e1ccdab61b21b2109", - "header": { - "parent_hash": "cd073ab322296f5181e559cdc9cd2dc68d237287589db3a562d17627f2e02772", - "state_root_hash": "7dc0efc0951998f50565066a15899e90f73a55e8faf22a6b6a0904be9a48da7c", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": false, - "accumulated_seed": "8a1dcce5642525c685c75547af314384ac80eada19ddf054995a5b020a9d48ed", - "era_end": null, - "timestamp": "2024-02-28T16:24:00.768Z", - "era_id": 1, - "height": 3, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "0181cbd8bbc39c28d388739346f8201a0a45f41a3877f20404c2dff2cbab2f5c00c3228ff9fd0a9853a34ae284662ac0afa53ee6f7b8e9ba22f2178fbbf3b45d0c" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "014a0d8891601171f424ae935f7701084207e48e0376de80721a406e05341adfa611118e504991db0f36e6042c39c62ddb2cc842c270528cbbb96e57b73f60a908" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0144a52d147b3b92a4029587647e5841d7b97e69ceca091841c3ad7b10a3cb89fc6e90a876de6af14f87ab44b61e8d76f996cf65469c01ff3717f0a55ecf48f40e" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0136a07c30743c68aa0369708cfa0471c2f716276ea5a495c840b3523a32d4816be10fea986f041c60dccc57ad9676cc38c6971b68482050c0f4f70b0ec804ef0e" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "0160dc0fbb8cf0e456d6c7641c1f8ce432ba692e1ebdec81a2c0bb0f4c55d15cd11f5498eeda6986e25324b3444bef1268541fcaa88422dd99dd3ec960b5194209" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-30.json b/tests/assets/blocks/block-30.json deleted file mode 100644 index aac889b..0000000 --- a/tests/assets/blocks/block-30.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "5e80ce28aeb5bb9b99e96994c0b5f90056142108484dc14bea491632d4c38ae6", - "header": { - "parent_hash": "58f600ce41f68e137d5fc958669601505e93d5eaa0285748118040574f2d505b", - "state_root_hash": "6b10a03c42f813629e71a47c604d2f51d59365327bbd11fcc3c4108dae3b84dc", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": true, - "accumulated_seed": "801c11b7f6ad7f916a61eaf67135ca8f82747102b6651c5808e776c5b2f1eef5", - "era_end": null, - "timestamp": "2024-02-28T16:25:51.360Z", - "era_id": 3, - "height": 30, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "018f4ce0a339fa771fb1d0cd38203c905310af3f5a22d032a1511e5f18be9ba646159730a50f15086c587c8e83bbbd19a18b5ac7dbdbc5356cf191fd4abefa1302" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01fd2ff9fd1508a34586e519e12e33f4b3cc69d364e60b0f90223571efc6c960224f53ea74fcd96961df74267170681f93ac89092c9e18448c25eaa2c997ca0d0e" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0169bcaa99c6694a27bbb1d28860437f78417f7b598f02c484b5188150c96e37c1b6b2fe68404b241d8e76eb1bcad1b4d089461af6f710422f7336d9d2f4dfc10d" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01f6e8390911ab1fb4c41ed83b982fe2d0435df205c24761440691b9fe9fef4fcb0a96e9d5f13efda90675228422551d7cc1b22f31dd16d5997428400947ca9a06" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "015bfc489e1a914900751a8aea224cdb49cd2da57e01316c8925030a2e7b6ad99b7cf246eec9e9cb8f81e706cb9b25a2feb78e52f8f326ed669270ad156c785605" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-31.json b/tests/assets/blocks/block-31.json deleted file mode 100644 index b2131fa..0000000 --- a/tests/assets/blocks/block-31.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "dd09b2617b90818658e0ada6056869c19d90da974e336c94ca3a6601abc65f89", - "header": { - "parent_hash": "5e80ce28aeb5bb9b99e96994c0b5f90056142108484dc14bea491632d4c38ae6", - "state_root_hash": "6b10a03c42f813629e71a47c604d2f51d59365327bbd11fcc3c4108dae3b84dc", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": false, - "accumulated_seed": "b421dc93bd87668ff2028b1409edaf9c05bca85165dac666a33bb9e0b40f3d45", - "era_end": null, - "timestamp": "2024-02-28T16:25:55.456Z", - "era_id": 3, - "height": 31, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01840437659d38cc9cfdfb64e5f15ceeb39d2e5d0b48862c1a3da87f052e1f9fae47867990077eccc20da3a87764b750726c758896206f0ceed2a98f4ad04a990e" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01b104e96b1a7e3fb0d884594e0d5dfcc938f68c5fb87d0a415cf5df503104c3dda46c930048799bb87c5e4e7aff8a960484dcb79912f47b703312f7af1376460b" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0171917cba5d96ff79827c6809742ba16a9f05d20b7428566f5aaddc0d2a93b91f92e08eab75e60cf5ce9e1b35c9da19e670a4247b40749e72843c04037485b300" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01f3d308f624e3acbaffbc4fc03c26a78b6edfbdde7b88d4d3830b678ad40729758ccc5d353d79848a2b30a18414ff43986805f396fc1a48d83ea7343ea4780802" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "010cf307159fb3d2bf9d16bee4d9463d7f2028d982204079fe6f67b4319e6115bb677a6ee394acaf155d9b648220811ac6777f1fb53ae29f3798b6cac0bd8acf05" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-32.json b/tests/assets/blocks/block-32.json deleted file mode 100644 index 2025183..0000000 --- a/tests/assets/blocks/block-32.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "e88fac3adb2fae899a30f75226303401b45fac06d8af8c41862c8e36fa5f1a7a", - "header": { - "parent_hash": "dd09b2617b90818658e0ada6056869c19d90da974e336c94ca3a6601abc65f89", - "state_root_hash": "6b10a03c42f813629e71a47c604d2f51d59365327bbd11fcc3c4108dae3b84dc", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": false, - "accumulated_seed": "6cc53c08dbd1356a1a2e71ab900f62114d8a59b5346b8a9938d52454368e3136", - "era_end": null, - "timestamp": "2024-02-28T16:25:59.552Z", - "era_id": 3, - "height": 32, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "0162f97ef4f19f23bcd880c2bc94a66aefaf170b87f91facf967bd67571f94eb80cdb422f84d87c63bf9123a4a6ed3378de70fcba52ab45c6c5471ee9ac6826706" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0144803dd7d2b2278724f72466f5a352ff1a120057bad891e9e7b1425eda1baf35a49234188e6f9d21f1de2d395f87563d4800ddc7a2e9f1e917222236a655cd00" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01fe75a79b6a9cb18c80f70aa0697ef7c1827dd277eabe94aff344407b999b9629c212cb5aab96b15a44a3d24602c2ab5eb37571c37c42ecc37b161a52ce36ba00" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01d163aee275a641f7897d836c7e139208fcbdc2398159dba1e6c3c7481542a27dfef30d0a859878657b981b3e0c057f713a20668830c3e4a1af331ffc5f87b00c" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "010253d3a04e9997ada7186139663d42d1171372306bb38748cfef2db46b5e3ba64f525d974e788c010cbbccc2b5523c3b6ea8b410a710c12495bb803614fd3a06" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-33.json b/tests/assets/blocks/block-33.json deleted file mode 100644 index 4d3121d..0000000 --- a/tests/assets/blocks/block-33.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "hash": "88800eb688d3b96b5b5e99dda5392d71118033b8a98cf170528445dfb2a5a779", - "header": { - "parent_hash": "e88fac3adb2fae899a30f75226303401b45fac06d8af8c41862c8e36fa5f1a7a", - "state_root_hash": "26f37e295f40e3e3a022e28025a58c52342c1dc3e2b009c1f56938b95824a946", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "70617cda9808e65b2f81d8dd0d5898b505ba4f2482dbf2a9bc23e76dd581cc3c", - "era_end": { - "era_report": { - "equivocators": [], - "rewards": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "amount": 1999999999990 - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "amount": 1999999999990 - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "amount": 2000000000000 - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "amount": 2000000000000 - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "amount": 2000000000000 - } - ], - "inactive_validators": [] - }, - "next_era_validator_weights": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "weight": "2019999999999900004" - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "weight": "2019999999999900006" - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "weight": "2020000000000000010" - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "weight": "2020000000000000014" - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "weight": "2020000000000000012" - } - ] - }, - "timestamp": "2024-02-28T16:26:03.648Z", - "era_id": 3, - "height": 33, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01368139dceaef88a96fb2c887abe6dc25efe9d19a9d3116e49fe1d65c9042c24a37496ef03493007b77535e462f7851fb0893f55981985d4e4f7fa67196859608" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01c971532069885cf45b0ab66e4bb4395600033d0d92c6d86e09c522c5f06bba675a4846836f7e36446436ea086aa21d96eb95c686e7ee27e2065595107042f401" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01253ba6266c74ac8056e50c44504065e65893a4c455f91de24305bac4f6c1c95ef8e1538a9b3c40deee93168461bb3fdc1ca0e516b4be1aa552f3f56242b7af04" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0140e3bce860d6511dc81f8882d7269724996bdf32c19a71a7c5f353065a043ca75005c04185564d2c432235097e0c7750542754d6a5eeabe5b7293a8b0352a207" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "013a94ce68695652c9db88928b4f99ede9f91dd336b5ea0125d05e5dbd4577ddfd19d8f5ae0b80c729c7aca06c333d5a361a08c4536e18f573ab7915949e81d20d" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-34.json b/tests/assets/blocks/block-34.json deleted file mode 100644 index c886cb5..0000000 --- a/tests/assets/blocks/block-34.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "19f3b4074d5dae9579c384871c6a9231a206ff835a04cbc4d23d69f4c3021666", - "header": { - "parent_hash": "88800eb688d3b96b5b5e99dda5392d71118033b8a98cf170528445dfb2a5a779", - "state_root_hash": "26f37e295f40e3e3a022e28025a58c52342c1dc3e2b009c1f56938b95824a946", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": true, - "accumulated_seed": "377d8dceeea304d6699e1eda94fc164118efad8ffbb684a511775d9a59dd26d3", - "era_end": null, - "timestamp": "2024-02-28T16:26:07.744Z", - "era_id": 4, - "height": 34, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "0193f5573046d265dcc89721eb52b3651cd44dd4f183e71420d292e7d9f842a89bf6c12d17dc5f1858151cfc98bdf671100b9f39c5c7a93201658c194339db0408" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0102cb37dfa9fa8fa89a542ab285a5e36d2c24fd92c269d5d47aa06cc6c3cbb3b97d019850add65ef14205ef615e3f95bd3f88a4ef5dbddf974bc3a19364620e0b" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01960e0cdbe885925bd629c9747080b453d51ae9b8d8cf15ce63d649ebc7d2c05369a182f0b0906c5a88e7d17a24fb4fe7a6d0edc912ee018d5d07b01628c9680f" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0109f697fe1d5abc2fbebc9c619999f288af2980080a2c69e2d02f65519670f793aa05e508239aa0c04601c5f8f45012a6efd824f2ef8c88dacf27576a575d6f09" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01d9d2f44368503918bb9c20d4dde649ed739d41dcbd34638b7a31329264fde21f4f7ae24cf23efcb575c69ef72f666b099e7360708bc518d1de85ced664460b01" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-35.json b/tests/assets/blocks/block-35.json deleted file mode 100644 index 9d0066c..0000000 --- a/tests/assets/blocks/block-35.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "a445c36ee6a6b7f50bbc34c66a4d130244ef2c0b9d19a3dbfc29812cd1a98d21", - "header": { - "parent_hash": "19f3b4074d5dae9579c384871c6a9231a206ff835a04cbc4d23d69f4c3021666", - "state_root_hash": "26f37e295f40e3e3a022e28025a58c52342c1dc3e2b009c1f56938b95824a946", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": true, - "accumulated_seed": "7c74f9feb017d08ca34b74b207ac7b6711451c339dfd9669d710d9b283def1d0", - "era_end": null, - "timestamp": "2024-02-28T16:26:11.840Z", - "era_id": 4, - "height": 35, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "017f43c0ad0f6f95346de7c0832b1e1cac34c28ba1dc637d6f306a2966ff9b4198ea5e618305bf68debaac4a1462d83066d02a893e97e4df3e67fec9ea370a3a08" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0126ef13d89866e979dfbed7b054e6fd88fe79f3c9e288aef5ab7e8166feea3cc04e18a420fbf759c08877d7fe556aa13831a554c91bb3dd3a836987c1f812490c" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01096f414b21ad6644ec95fd5751a12a362c3fcc664a27114a1ae5a949387b9fe00eedebe033ffb19d8c1b70fb31ab2d7a6adc6908d4e1c8fd6f8139f8afed9e02" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01f637d6e99613c3b8f96aa44c46185310e2dbed2aca970cc9ea99af053f2ec18601090137b0cf09ed7a6c79c533017c7dac2f81fae9c36796259976348ab8a801" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "013a5ea03e9cff921456cc4662761472470351d9b27927ad1e950705e9a2a2e43185b5c4d0946c9e65c523cc1badb3f1df13a5c80cc5c33551db1a2a09fdabe205" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-36.json b/tests/assets/blocks/block-36.json deleted file mode 100644 index 872c97b..0000000 --- a/tests/assets/blocks/block-36.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "d5b21075a6194a3208c6f5920f3b3521963c2038996aad146744116f314d4771", - "header": { - "parent_hash": "a445c36ee6a6b7f50bbc34c66a4d130244ef2c0b9d19a3dbfc29812cd1a98d21", - "state_root_hash": "26f37e295f40e3e3a022e28025a58c52342c1dc3e2b009c1f56938b95824a946", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": false, - "accumulated_seed": "af0ac37121ea3bcd50e7977354f77ce27ea8ff7519c13cd3aeffc66f54374d8a", - "era_end": null, - "timestamp": "2024-02-28T16:26:15.936Z", - "era_id": 4, - "height": 36, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01e7ecf91fb9890bea82e2073f19303a17712a46972ce1ef006e2c1cef4d2d2ec02369f7ec4ed095779e924b927e28c7601719617b1775c54bb0075b099bc55508" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0121e214a1d6d8ca65db3b2a35c8a91d78f034fa79e69c9be87ca6e73d743eb3423933089060e5d727db3ebf066ece918331945911d49cdbb8e14397da958c180e" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0197d2673d9680dc9fb9d5395ac49683c4093a3b4a5d519303a0b5ead361d1a8100f7093f281e867bcea37510a5637ffc1077afdb0e7497dd510fc493a535a7309" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01bf6257fd01df44866ea37efde46b0174501cbcdd80b6c9a4953cf98da24b825359c67b6e155346e3c929de2062d67a4143eddcd60381e2279bf4d4af29524b0f" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01e08b2fd7f34307a2d6769686e8980a83eeb9dc1c5d50ab1c23284f48d495a8df63ab616a50793f231065f72472513f745f979da932bb1eab255149f9ce29ac0f" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-37.json b/tests/assets/blocks/block-37.json deleted file mode 100644 index 88b5ea5..0000000 --- a/tests/assets/blocks/block-37.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "29f78312933acd8b0f5bbab0dc5d25430cd893400d7ff85525bca64cc5d017ed", - "header": { - "parent_hash": "d5b21075a6194a3208c6f5920f3b3521963c2038996aad146744116f314d4771", - "state_root_hash": "26f37e295f40e3e3a022e28025a58c52342c1dc3e2b009c1f56938b95824a946", - "body_hash": "9795ec386b71cee3c0b831b582ba41a1021422065b238f915174324fa77f4772", - "random_bit": false, - "accumulated_seed": "7430802127582255af1fe0695b2a180add5942416c0bfc59791e0bc9a9b1706b", - "era_end": null, - "timestamp": "2024-02-28T16:26:20.032Z", - "era_id": 4, - "height": 37, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01a8ff3d8e563119c32127fd94d29c1579225a4a98718bbe945d0c164995189dffa2d12991d48b5f9c8a5c09e0a0b6366c7143a5c72eaf84be13a03221b111a806" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "013a91b2c47d9a24fcf9fcf21d128c7a6af949531e0a3091d2036349fd6cb5cd82f0a946aeff3b8051404a544ac0a8eb706eb2ba552ad5cc5e74c2fc188c048702" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01475bc5afb791e2e121688f35a99522ae2cc35f7816590f9615b3a31bfa63ffe2a20cb944ffe5137f336d3940fdfac9d4d6468e0fc3dc3ddcbfc422bed2814709" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "013f17c67a43fe2577841cfb4991a694d94465e99edf1f84b995f2d7242c2d020cc6da88561cee8629195d63bd492845c85baef501ea52ee81c562da740913a80f" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "011f245a4806e460776cb852627586ef0b8a2d0fef6933edcb2ff2806d88337f9d14b6de0bd3f1b41d8b96dbceea68d93311b74c4a1925621ade29c74d9c1f190a" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-38.json b/tests/assets/blocks/block-38.json deleted file mode 100644 index 2745a4c..0000000 --- a/tests/assets/blocks/block-38.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "bf08f470768e4c0ea38a6e548074c6a19c2ef3bf878d57c8fd5110311958b0fd", - "header": { - "parent_hash": "29f78312933acd8b0f5bbab0dc5d25430cd893400d7ff85525bca64cc5d017ed", - "state_root_hash": "26f37e295f40e3e3a022e28025a58c52342c1dc3e2b009c1f56938b95824a946", - "body_hash": "9795ec386b71cee3c0b831b582ba41a1021422065b238f915174324fa77f4772", - "random_bit": false, - "accumulated_seed": "e7b1859783a25772ee430ac3987cb4ee4ac506c0334672d4866fd8ae55238184", - "era_end": null, - "timestamp": "2024-02-28T16:26:24.128Z", - "era_id": 4, - "height": 38, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "014fe20a791328d46f9c432b7dc40ad5411af5d62152eefff8a51b302f321d69f69b0793b07159b51cfc4d92af0dd3f6c413d16ae9601be52cd1a44bce50fa1c04" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0110177bcbf112f49a7a679bb4e48bb20a184a108a4e981c19698c3eb8d7c21d8e7bf7317d18512d83560ed16c56550be3497a97b520bf1218e3daf9ed37381d0a" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0178b421fd15d27550f3a7ebd8d011152180a5a6ee10b5115a42e3b43cbd486b4c3fa7a36f5a234742f3a98678174355f9edf1a1f1fb3c16cd19988bc20b955102" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "018e7f74e1f54e973147a56e5be589f8305f504bc62aa6a4338076300f9b551b40f834b0de76c03fe723030023b681613ca9b01342693a43ac90c49b5846b97107" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "015bd868a34748b76575c503bee30791c914aa720945c39ebe5b34c43add277c909f900a4e985d21e2df9b26dfb2044a2f03cfc4556355dfa0f9aa582b7fee5104" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-39.json b/tests/assets/blocks/block-39.json deleted file mode 100644 index e4163b1..0000000 --- a/tests/assets/blocks/block-39.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "c2e657a47d5a0973a5da4d756f658a3977ed98aa08571ae28b931b97010b56aa", - "header": { - "parent_hash": "bf08f470768e4c0ea38a6e548074c6a19c2ef3bf878d57c8fd5110311958b0fd", - "state_root_hash": "26f37e295f40e3e3a022e28025a58c52342c1dc3e2b009c1f56938b95824a946", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": true, - "accumulated_seed": "3fcdc617bec1ea2606389b64920cb5ee9ac5db589362622383eafea287b0bf0a", - "era_end": null, - "timestamp": "2024-02-28T16:26:28.224Z", - "era_id": 4, - "height": 39, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "019bcbc390f1e34143e4b4246d9f686bb0db4d91b35344f087a2f9e1cb8c4d6b47730bb3b990ac0e33edf60017737ffb728eb66b515cc30a1b6756d154e3734d0f" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "012b3dd334eb4c625c848b8537213a83caa7b384e6388778eb682af365e70024dc4a1f286e37cccab9aff22c32b61ee9bfa03e8e3ceed0f7ea20944d4155bcd50d" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "015cdb6eb2547d8487d6f940029e9739c242058902d998ad91dc98d78acf84bc2b6edfc60a134f738aa06bfafbab043dd2d0471b7076572d779a9ba1017207620c" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "011afa0a77a5b169cae217fa4e771ae89a1709d987b184e518e33e0243e105a6d8e998d8988a6e0d8195d8e089acaa5708fb673e66926473775d99f1e66802380f" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01f9a64890e2a2a498b213198fd5f4ade31a2fc445ac1649857ae9e8df9b8f1c4dd705b3b409ba81b2f7d937b7bf59f934d8baea4f79305c8a42eb124290af810d" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-4.json b/tests/assets/blocks/block-4.json deleted file mode 100644 index 50ffe9c..0000000 --- a/tests/assets/blocks/block-4.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "97932598aff6a9058ab4b027541e3a15bf22dc5d08c6fdcf4048cb87a975f00f", - "header": { - "parent_hash": "f0f3aeee6f831b5847225bb0426aa241f9d03184b15af55e1ccdab61b21b2109", - "state_root_hash": "7dc0efc0951998f50565066a15899e90f73a55e8faf22a6b6a0904be9a48da7c", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": true, - "accumulated_seed": "3f3a0ad9d07db040d8160acbd66aece5da826ef11bfadd214c5c209d3cfd1cc8", - "era_end": null, - "timestamp": "2024-02-28T16:24:04.864Z", - "era_id": 1, - "height": 4, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "0147627fdcdbc33ac421041b9f537ee18cd401771ef127341d755feb4a2e21ac34ceeb09f858af0bd5855c0da4f34ec566d60212383e32a89fe86a549f063c300e" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01fce52c2fee73e07c3a601c677016d7dc9409904c892554b1a878e2c5da1cd14165802f1063566005d938bc77c1608738383213783a4f63f1cb9fc46e75954e06" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0134d77d4ef38dbdb2e4644538ab65d00526a98534e9fdde2f86bcf172bddb1e7f559f906a18a9689915a7ef1f3f1b6c1d4bae83db2265d421f17d10c2dcb4c80d" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "019f69884dd3be61232f97c4ba228ef792fa571991fdb83d935700ca282142d486e86293abc2b5ed2b17b4b8d0ab2407831ab172183542eb00f5fd3d20a1e12100" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01133c833baf406f6b081b1d82493cc4752e903ab6e65c3f71a6455bfdd17dcfd2fa24ed2d8a7f08869bc53a15d95573b9ec0a8f75c0f76f46cdbaee8e27058c05" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-40.json b/tests/assets/blocks/block-40.json deleted file mode 100644 index 2e97293..0000000 --- a/tests/assets/blocks/block-40.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "d4a0565f62dd4ea8e3f0d974f60d90e93039892f9e2c24b226b7523f9e3eefe8", - "header": { - "parent_hash": "c2e657a47d5a0973a5da4d756f658a3977ed98aa08571ae28b931b97010b56aa", - "state_root_hash": "26f37e295f40e3e3a022e28025a58c52342c1dc3e2b009c1f56938b95824a946", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": true, - "accumulated_seed": "2b87d35139f29154f41cf76aea1c5ce21a80f20770888fcc55ee28cbddd50bd8", - "era_end": null, - "timestamp": "2024-02-28T16:26:32.320Z", - "era_id": 4, - "height": 40, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01e44d5ab4601dd8f6dd6a5bf36f6b94b248993fd484ed50776cdaf9503bd6e7020c08535b0704895bf5427d9a977c472e151c4ea516c1e5dff277ff8a58349e05" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01b68fc714ae7544b7718826c0f859a13b5f54005d4909da7cfcad6624e1f37bbbf975cc6ff04d0b0fb8a737e2694074cf923d1f2b12bfda6daf52a7eaf05f0c08" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01f39819cf3c9a3171017652b326f1c2a2dfe15bf9e6016d1a513e71c3d539bec6a4d0e634a2f75ec09ff8c5bffc2b82cd1a72a20e4d95c089e45043336a536509" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01c3be9b13a203ac201e2894fed9753e9d6b3b9e898a852d461a2ddd8b3a0c04455be4bf10472a897fc05329e517bad4b017dac0a74c5675588d1192d1f096f509" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01f4cb129c29c8effb5315926af9edabf3b9fb466ac4aeffd8e845a43df029a68f2078a93be3d41929d82b6eb875db2c7c7907b0dd1c35b702f022329599325f0c" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-41.json b/tests/assets/blocks/block-41.json deleted file mode 100644 index 9836768..0000000 --- a/tests/assets/blocks/block-41.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "27855e8789a77c8596a12a9f7d53c4757c91f65a5214537bb3e91d60651cc288", - "header": { - "parent_hash": "d4a0565f62dd4ea8e3f0d974f60d90e93039892f9e2c24b226b7523f9e3eefe8", - "state_root_hash": "26f37e295f40e3e3a022e28025a58c52342c1dc3e2b009c1f56938b95824a946", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "0eece0aa721a8bd00e7a71700ebf2b5912c920111b03a51517b9f3d99aa19f63", - "era_end": null, - "timestamp": "2024-02-28T16:26:36.416Z", - "era_id": 4, - "height": 41, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01ba5036fc5fd55627cc19756d351c7db026bc729b2b71a7faacc4dd8a16d50d64e0ac650291f42058540763b5b9c817e6b7cbd09d2383110340c5c9c4eb3a6c04" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0147193bfb4739fe61752e3313bc0e16dfd3a1c597d1477919ff21c2d2c7373c86ddb411037df5c55b3ab8e91a9c1ff77d97386609efdbf6688b4f31cda874af07" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "013145a5837f6770e6ead578a43a671d6f6180a767cc809c9d5f42ef6c3e3bcc2fd9d8b6648e866702b4c6cd08ed6dce39ed9b69451d3293140ae21fec25121905" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0104ef060775be3c45554a8922454578e823545a2199805ee9bbaeb7e7cdad243d6147e4b048a536c09bc982dfa324354f60cfde8fa4bfc4d8856413e838430a06" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01e1371a02f682f98ab1e3152f76a260040af0f14801b050b4726bc1686818a165250f34a17e9e69f21bfa6929df99332c3e8296bcbd4c91138c32ecabaf0a210c" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-42.json b/tests/assets/blocks/block-42.json deleted file mode 100644 index 175e9c7..0000000 --- a/tests/assets/blocks/block-42.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "3348faedf0c72d780d550700ece9532e8f9f4af414c5312c8860c4e6ecad31b3", - "header": { - "parent_hash": "27855e8789a77c8596a12a9f7d53c4757c91f65a5214537bb3e91d60651cc288", - "state_root_hash": "26f37e295f40e3e3a022e28025a58c52342c1dc3e2b009c1f56938b95824a946", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": true, - "accumulated_seed": "f9ce1dd492482ace06228918e3107673efd0c389a86e4f30748c0710fba9e19b", - "era_end": null, - "timestamp": "2024-02-28T16:26:40.512Z", - "era_id": 4, - "height": 42, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01697d2fb2c4df2f8aad56f527b2780368b14e2c1a104d048a1ea2758885f5b08feb124720da43155959da477c69208369b48e5d280794c962f8c54decd8477e05" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "016ba406109d2d1095045a810b30d1f57700e0d1213c5c4c4d210d0f1aa91880aef9a55283bcecc780ba090f5b8cb71ef49848f0d6f507d6172f3cf73baf54470d" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0187b4c296636024704dc7e80029e67dab8f702609af40af85b60b894fef142c8d13f7617e8498fd45d741c6e2b5076c7893b1fa63373e5f275148785bf4f3f709" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01e9974d0bd070b5a2b00e2ea7df9fbf9210dd0e66fe637494c9adb5ec0718d33071bbddccebffe677c3c4ff331811cbcb140dca25e4e9dcf0f02a926ef430b10f" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01122dd3769187bfebe9254c4b22bae88049567d95c8f267c80a11ac9339ca2f744b6dbd3fd60d288be116154b9348ce26df6bcd7b4872bf3ec4ac72a1d4be090f" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-43.json b/tests/assets/blocks/block-43.json deleted file mode 100644 index d3ccdc4..0000000 --- a/tests/assets/blocks/block-43.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "b28fdce1bf6ca73d39aca2c03b037417f2bc8fa1d1d4bc9f8fb192fb46f3ad1a", - "header": { - "parent_hash": "3348faedf0c72d780d550700ece9532e8f9f4af414c5312c8860c4e6ecad31b3", - "state_root_hash": "26f37e295f40e3e3a022e28025a58c52342c1dc3e2b009c1f56938b95824a946", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": true, - "accumulated_seed": "c47ca1e36bdef08f6a0b21e420fbdb2a4a43f31062be072af775b4e9c573632c", - "era_end": null, - "timestamp": "2024-02-28T16:26:44.608Z", - "era_id": 4, - "height": 43, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01a4cfdc117548856d87ce877a89b0d5cfc21c0f0140406b1541b1c3f40ac4fa1d706eab17ec7855d40b0d8c2082dcaf6d3f584ad6e81d742c751575fcc6442109" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "017bce0f38bdb92612eb2468b233603cea7632e8827bc2d98af5a0ff1f553cd55ac846d5fa82142d883d7efd4570c252c2ca0fec3602e7f773015b1580b22b5d02" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01c6e1e01a88588ca4578d3e85abcb1da8d9441efd56e06f37fc8b342baf5362430013c2ab28a581d6f1384dce3352c4c4cfd11f8e6a8476c3002bb8fbf05fc10c" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "010db854960a02df4ae7533674281e791ad7f2ce465ad2e55851a0887ac5a18ddce6ac8c151aa56214c5b1241e485e4787e048740797ff79d148759ad7520f810a" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "0164801e60dd076f22a12111c52c65561c733e5bc70eddfc7f346dd1870543bd56244e879bf4ac81fdb39bc066a19ad4c30ebfd22cdfc1bcde96600674fbce200b" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-44.json b/tests/assets/blocks/block-44.json deleted file mode 100644 index d2382c1..0000000 --- a/tests/assets/blocks/block-44.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "hash": "5cc8053b759cf609f83a897c50d0b4791b30a533944b300cd1c10fdff0735bf5", - "header": { - "parent_hash": "b28fdce1bf6ca73d39aca2c03b037417f2bc8fa1d1d4bc9f8fb192fb46f3ad1a", - "state_root_hash": "0bfa466e040ae24b90a919ed7e0e12f7189493d6944c12539e011702d5109b7d", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": false, - "accumulated_seed": "4393f71d8d247a19a19979ed232f9c0fd1795d6c284934bf86bc9ef2c39af502", - "era_end": { - "era_report": { - "equivocators": [], - "rewards": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "amount": 1999999999990 - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "amount": 1999999999990 - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "amount": 2000000000000 - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "amount": 2000000000000 - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "amount": 2000000000000 - } - ], - "inactive_validators": [] - }, - "next_era_validator_weights": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "weight": "2029999999999850005" - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "weight": "2029999999999850007" - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "weight": "2030000000000000012" - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "weight": "2030000000000000016" - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "weight": "2030000000000000014" - } - ] - }, - "timestamp": "2024-02-28T16:26:48.704Z", - "era_id": 4, - "height": 44, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "013ac6f10a63b2488e73aad1bb96f9bcca34bf00c08374b45609f4788abd2dc681e72f9e339aa9951dc289e2b118f9d3fc6139f0459d11721a34ceaa2c4342c70a" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "018fd069ef939b1049a3f39e31c98617b0240a8a7ab0ceb5c251482fa8ec24706b745da09bc736a24587c320a1ed0fb73e350cff371e957a3136f17ff31c3f5e05" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "015f71c7c1bb33409bd267ff1377a019960f9b03b5c7018b3dbdb4a0a9e7263e9d4858dee0fa98b19b32c30beb7b2010b07205d4b541463423b6d967b2b5539606" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01e98f528d7d785edd5214e3059d85b3ae57022606808229d41890b536d78eb7866169eee41f958fe5c61b1a1b9e78a19230d9bb788c1080c505e4a9c86cee2204" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "0133b1da4d5bf6285c65225366084c69e118f078109f0accb67dfeea69d12ee62ff3cfbeb5e1ed06e84e73be7978b569eb8c383bbd0734124a69b026e10f675905" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-45.json b/tests/assets/blocks/block-45.json deleted file mode 100644 index 08cbc1b..0000000 --- a/tests/assets/blocks/block-45.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "84174eb466ab5d9333e5e8093eee437c9e620cc42b9d020ac7135abf6f18ff87", - "header": { - "parent_hash": "5cc8053b759cf609f83a897c50d0b4791b30a533944b300cd1c10fdff0735bf5", - "state_root_hash": "0bfa466e040ae24b90a919ed7e0e12f7189493d6944c12539e011702d5109b7d", - "body_hash": "9795ec386b71cee3c0b831b582ba41a1021422065b238f915174324fa77f4772", - "random_bit": true, - "accumulated_seed": "5cbb405d89bf1781c6e701716f61713c4d02a19fa0adec526297ec59a4b01d55", - "era_end": null, - "timestamp": "2024-02-28T16:26:52.800Z", - "era_id": 5, - "height": 45, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01c9ec6fb7e78ad72c71a6c0f36023ee6f69768d26f20231222c5913f361e2757dd7564408dac12aaa0ac3de569b5ca96cd9253a14d52f8db57e3250bcc826f901" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01e5fb0834908467e15fa01ca675bdfdadcbc5c7abbdd2a5fd3f989bc9648f0c9397d6282b3a1a751782641455aa14728c83fa93d10f0dfadc91b0be3942520e0a" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01510798387c26a7893ae41a91c9c9d7a1847914f4215b8bef64db1d22b10f4d76887761bd39478e8b23c07a1ef7c6effc5eff3c9e477e4a8e20447b428377880f" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01347f396a8c6989f98b9eeeee3436f8555712d2f32d6f111a56738a385dadcf85a316728b2635cd569bf78ba5f6fbfc41058d655312544a0619eaa8998592390f" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01b5831435c09fde86e067907c82604267e037b294d61591f885815656700d62c90f83990754c2684a48178898532c8238342ae261566f36b0d64471ae45896a00" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-46.json b/tests/assets/blocks/block-46.json deleted file mode 100644 index 97c4c19..0000000 --- a/tests/assets/blocks/block-46.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "e71f2425359e25a95c9564bbb1838487776a706d1ecf8adf83623143ab3ac952", - "header": { - "parent_hash": "84174eb466ab5d9333e5e8093eee437c9e620cc42b9d020ac7135abf6f18ff87", - "state_root_hash": "0bfa466e040ae24b90a919ed7e0e12f7189493d6944c12539e011702d5109b7d", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": false, - "accumulated_seed": "024858b395e9e63a347bbb2067f21c1e381e4dd5429e1d317fe80d7523992d2e", - "era_end": null, - "timestamp": "2024-02-28T16:26:56.896Z", - "era_id": 5, - "height": 46, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01696b034b85a28e508d20921a2ec420554896fbc84c88a24d1e17c6ebb114744ebe561a376c338220d83dd750c85631abd4e38f72ac5473551a7761f8a982ad0d" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01db1b451f8c077bf3a3e99bc431f39503c1381cd0fb91acf5de9de44e6a75e3f14148bc537f669fa2a8fe4ba1dcece4555b1051e02c7b71f7a6e79cef33275200" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01b199eb92df63ff91ba6401fe88759be47072a830dbd580b722c3dd552fb3afd5957af29af7c978e46f3ed87ee7661439f838f649fb644bf746d7b7b5edc5d50d" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01f4a2a597b7509ab85431f6819fe3e1539cdd4c83755eca2433ea43a46f754fb6cacf39b5f8b369b3a8936f9e8f4478fba97f9111637db1a74af86220664a2a06" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01224346befe254de7ba1aa4d9bbd37bebf0a76a473afc21aaef91ec963b539126516fda9f47f414b0d23a2a8cb0d69d604402a5e8397d642f46046590718df107" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-47.json b/tests/assets/blocks/block-47.json deleted file mode 100644 index 18f6666..0000000 --- a/tests/assets/blocks/block-47.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "24d8a411377438e16e63416fbba0c1f9e2217f4868aeb56e9302c5e7fcf5dd44", - "header": { - "parent_hash": "e71f2425359e25a95c9564bbb1838487776a706d1ecf8adf83623143ab3ac952", - "state_root_hash": "0bfa466e040ae24b90a919ed7e0e12f7189493d6944c12539e011702d5109b7d", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": true, - "accumulated_seed": "cd8619d329b9d86f4e125db75414cb44056eb2cd2cc249fbba723acb8a746c38", - "era_end": null, - "timestamp": "2024-02-28T16:27:00.992Z", - "era_id": 5, - "height": 47, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "016efca85b28c6e9286a45632715898d33d4e8fb53603f7f828ecc30c7491296d23fac4bc6b0c1eba1f4e67b4bbad9b28729fb814716a42fe5e47bef441ea61408" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01da8ebc62be181f22e7fd52a459792b71210bba42a076ce2bf07c34ec3f7972c028aaf7d8a4c3a9ad6b503d31f4f27506da43d6e9178229b54fbebee1ab05f900" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0156b843618dd8b80faf3365f0988cf64f173f212890fcdc059770066a742ccd9550cb849bc0f3d2a97fb440d7a36de4095a299ccdbcabf37eb6138747af60de0a" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "015f4843c869f9620f8d9fc7002e8cd794f224a06420bf92dfdd5f52a3c167d4d4a1db28106fe058f9d0a87e51b530bdb908cd580ee8dcf800f8bc43514c29db04" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01d768f11b0a151b0ac1144b796fa3888f0ba4614e1976b583920baac13a861b1dd2c518d79c543d33d05ba1ed10fa58175cf0dc45f1666078c97e3dc8b679d405" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-48.json b/tests/assets/blocks/block-48.json deleted file mode 100644 index 25aea83..0000000 --- a/tests/assets/blocks/block-48.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "884551b403e229a883a34573e826e31721033063ff84d29c06e6ab24bee0e078", - "header": { - "parent_hash": "24d8a411377438e16e63416fbba0c1f9e2217f4868aeb56e9302c5e7fcf5dd44", - "state_root_hash": "0bfa466e040ae24b90a919ed7e0e12f7189493d6944c12539e011702d5109b7d", - "body_hash": "9795ec386b71cee3c0b831b582ba41a1021422065b238f915174324fa77f4772", - "random_bit": false, - "accumulated_seed": "eb3dc9e4be6734c9646d59110827acd84a4c9c1efc51d0eb7b422f758b7fce47", - "era_end": null, - "timestamp": "2024-02-28T16:27:05.088Z", - "era_id": 5, - "height": 48, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01c7167347de75dec0568d8a8f1ab5fd204d9c2c0fec1d40d1ecceaba61942921668949746fa3eddf851ac607176720afa1154d31936446dd645dd1c9b3984d703" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01c4e13b6c0e8244697c4ca0800543ff0404dc5301fbfe06088283a1d3e049fdc55da824fd753a14171c70f4ff064de78fcb29510998e66d4ef25eb511f4159005" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0174b4aa865715647d3c28600cd5b8c6ce04a20320588637185eb8f4dbd0f034a0abba7db2b51cb582c362ae930079b95bc228c91df3f6eec7129bd38ea4bea60f" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0184e0e029494071e4eb51fad7fcdcc9923007074ea5ac725e7e3114624813f4115ee20e58d518bc8bf45aa84a51239bd1c7e39b12b4bc48f1f9920c9a1dd9dc0b" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01e0bba170aa120d042fdb05a5b9460dadd8a1fc6744cba05364e2d8d511a8498b69bcb2701e45a6783b664d8a39ad612443c243ec3519a44965736abb2bc30e0c" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-49.json b/tests/assets/blocks/block-49.json deleted file mode 100644 index 11db131..0000000 --- a/tests/assets/blocks/block-49.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "de90495851bca7b33361b3f5c6027f5bc392ff4bd5a29ce1105a69fe74c970f7", - "header": { - "parent_hash": "884551b403e229a883a34573e826e31721033063ff84d29c06e6ab24bee0e078", - "state_root_hash": "0bfa466e040ae24b90a919ed7e0e12f7189493d6944c12539e011702d5109b7d", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": true, - "accumulated_seed": "baaed092ab14e4e03930d489dcfa61a7691e5ba03dd09ab97a0e787073136186", - "era_end": null, - "timestamp": "2024-02-28T16:27:09.184Z", - "era_id": 5, - "height": 49, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "0193a2e39eeb2362ed1e9e940574f0222e59096be3eb041a1d82c095564c84eed73fdaa52a3fbd2871c19b3180ec4054f58c7adbffb5c7f682a9e084d6e38f4705" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01e7f3beb61472575fc3da16272833213b5a2eb0cc968ae91efa83a8b0dd8fd58faf308592f7a5a758de52a64b04b2236b0211c6869c9238e29a81e662b90f3901" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0120db59da1f93f8cb1eaddb138fa3db0a38847108f61ebbdd1665ad1e3e82dc6e762dccec57f4df9342c3fd4f9f693ee229069e7948257fe0aaf770f4213c740e" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0184ba22efa31825b1c96b79d7cdc1fd11b7a0deb1ec75d845580445d4f174fe1fe30ee3c3c13e2e4e27887f80185b6c52eb87f4c474bd0b224f7e94b99fb6a808" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01f9da3ab322f75e116d6b400b24e5d9bf19c9b34293bd10923e7803adb1d38bb79c257fed636a392a153359af1bbbc60172fa0da54a88942a9dff36c837469404" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-5.json b/tests/assets/blocks/block-5.json deleted file mode 100644 index 744c0fb..0000000 --- a/tests/assets/blocks/block-5.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "7014c09e03c9b443e7433e9d773f4d95c8cc1e5bbca556596ff5fe4a12df0708", - "header": { - "parent_hash": "97932598aff6a9058ab4b027541e3a15bf22dc5d08c6fdcf4048cb87a975f00f", - "state_root_hash": "7dc0efc0951998f50565066a15899e90f73a55e8faf22a6b6a0904be9a48da7c", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": true, - "accumulated_seed": "8b3af0c73271d01e833b25a6891efec7c87eb5dca8098142539eb805de39dec3", - "era_end": null, - "timestamp": "2024-02-28T16:24:08.960Z", - "era_id": 1, - "height": 5, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01eb6c2e025198dc8b809a90ad74279043a15784cbe5309dfb14346457f937c04ab96c51f623ccac9674fe67f130ec84fc929f0f6db35617d325f9534b7113e309" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01a4fdf560061c33f50f8cbf286e96b771d1aa0351b2646c4e88184d936e0d544c36f52d15f2c550f652897a8658e2228aa00a6fbd8f727bcae9dc0b01534daa03" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01d0f80ba6730664a0120175fd20abd4de7fe30233e5a38e25cb4b9ed767e386102becb1aaa92f9c76958f2968f871166592ad9620f1766e235d6320b98bad6606" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01be79621827a42fd5875a5f8cf1c9a3f8f3164fda77be5246e73585432c35e95a8f05c8fa33111ca8f3ad72a09720a9d51a405ee79633303d03cdfcc891b03c03" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01da7146758e91724715fd086c288cf9e5a2637e0b8ed0c75f47ca26933bff1b10ece3cb3e8977e96533bdabf5958aba56dd85f65e7f7ff09f5fd26e25ac8abe04" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-50.json b/tests/assets/blocks/block-50.json deleted file mode 100644 index 6280d1b..0000000 --- a/tests/assets/blocks/block-50.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "0be630b27c00998f564a970498bb85426f32d29132ab9f6d8f39906e1afbc0db", - "header": { - "parent_hash": "de90495851bca7b33361b3f5c6027f5bc392ff4bd5a29ce1105a69fe74c970f7", - "state_root_hash": "0bfa466e040ae24b90a919ed7e0e12f7189493d6944c12539e011702d5109b7d", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": true, - "accumulated_seed": "6bb592806f02baf8223cf0eb98adeafa553bbe0b5e3c4d4654d57f56081c3b41", - "era_end": null, - "timestamp": "2024-02-28T16:27:13.280Z", - "era_id": 5, - "height": 50, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "010a92b186bace11edd534ea2e0634316dadb32f33db7ea80331bb1f3f28b4b4d2628b658d97eb3d91ddd027498ee0b49646a144646f8c271d42de50de7b8a280a" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01dc584d2c1588d1c27797544c76ba93c6b353a9976cd0acef233ca7557a8395a26dfb533b140ce83e51322c3a7a11f177a5d91c4a375fadf62df50d8e5e210509" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "016d465d30f518ae0546c6defb3e6fcfcc3e6739f695cad0ce20c5b961636691ef06116917275a027acf2bbb496988fcce46f62217f1665715fab45c8456146007" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01167a0dc7f8f9013bb62589a8a69bd32c90713d9c337a3d5c0b1b1d3ac09b81fb1bb8641e7da4753a639fbf9f8522da6fb4c49aa53b0cf8e24856ca1c7efda80e" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01e54e7f2e434a0e47b14d138506eb8e689fdb2734dbe3aec71821912d9bc7e28c536bd9da8befd0433c4d20204679ed78f6b48e86e0e9f6a657206df7313f890d" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-51.json b/tests/assets/blocks/block-51.json deleted file mode 100644 index a5dcf2c..0000000 --- a/tests/assets/blocks/block-51.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "400f7305a8c80556efd70c061d0bf546306d35e24e2ed9022239d2d06ab1aaea", - "header": { - "parent_hash": "0be630b27c00998f564a970498bb85426f32d29132ab9f6d8f39906e1afbc0db", - "state_root_hash": "0bfa466e040ae24b90a919ed7e0e12f7189493d6944c12539e011702d5109b7d", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": true, - "accumulated_seed": "61cbffe19220ebf7c4b16eca122986f84ebba1dcf0fba71112f3cd138b595f8a", - "era_end": null, - "timestamp": "2024-02-28T16:27:17.376Z", - "era_id": 5, - "height": 51, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01bd09137139332ccefd96eb0f3cc2d69688172f7d478ab81e7cdeb52314118c7c391999374e599d686fb142c6144b57c8ad1f6c4b45fc285605501dbe6d6ca909" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "013632d38362fc2abcd59e35606ce59719d90f1df1d4f831927b19bb07bd2dbda0cce9ad55f21a506233824bc27e124b5d9dc14729b317627152814a1ccb487f0c" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0198ea941ed97b898210762400d327baf4a9c9f8354334045876099de1dc538039bba62f1f7c0326f86240bc2816c5ac6d7782c514ffa72f3606f1655080ed250b" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "012549a9acf6ee3f7e34e4f17bcc63ea6423420b8914ee4ecb27b11823c8394be802605923e9d9c109256dd7245887ae58a711995835a41e4a5f4b212332e90208" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01e0a11a888555a6b70810399a4d61badec7a0d89c6250681e4206b86fefda78ac5ab6efa08a1f1a6481e273c128f78d50dc96e4e795b434dad90ee3b13bde4d06" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-52.json b/tests/assets/blocks/block-52.json deleted file mode 100644 index 7c218c7..0000000 --- a/tests/assets/blocks/block-52.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "40f4bbceedd10390ae0e5c6c1ea3bf194b0539465440ae70f826e368a80cbd5b", - "header": { - "parent_hash": "400f7305a8c80556efd70c061d0bf546306d35e24e2ed9022239d2d06ab1aaea", - "state_root_hash": "0bfa466e040ae24b90a919ed7e0e12f7189493d6944c12539e011702d5109b7d", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": true, - "accumulated_seed": "3de3e2cd101eeefc45bcc299bdae14efba7c5c745ba0f98ce27249bf57e7ff1e", - "era_end": null, - "timestamp": "2024-02-28T16:27:21.472Z", - "era_id": 5, - "height": 52, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "017ff05556e4171ac2d014b1fa26ae4d82a29322f36942c4c39f59eaa54d78cf36d38fe7845f5330f54d939700d7577c571d64ae8070bf8657f720a63e677f3001" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01a03ec26154d002990e2351af516572d2eebd81f9e383bfa514411c1df8de470d9054365568302a28fcf459efa092dd30a32e5031a4448a5533e487f7fee44b04" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01ec5450fc55cb5101e3ac5966bcb18a6b233e01e64b3f2ac6e9354e7acae8c4a92ea7b1d45d6f939bf8a8e8b9f338ee32be4b02ccc9eaade7a785c07c06273b0d" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "011734182b48ee02f8f70f05a9d6319a43054585e9986df6ee074d8423aa6c959bb60ade593bf5ccc6a116254e720bcf87ed6f8032037b16a03d7a6a647cfd8b0d" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "015a9affa4457ce02fdcb40e4367d11e9af0d0286f34245248bc3ddfc9cb3a156b3b65abafa25b8973a367319fd1710456f56a2f6cdd74bbf575faa3ae435b3804" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-53.json b/tests/assets/blocks/block-53.json deleted file mode 100644 index 61192b2..0000000 --- a/tests/assets/blocks/block-53.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "d2ed4f1a027f19f665d58fac33bfe66e7e25afae5e6fa5e90307ab75aa6cf587", - "header": { - "parent_hash": "40f4bbceedd10390ae0e5c6c1ea3bf194b0539465440ae70f826e368a80cbd5b", - "state_root_hash": "0bfa466e040ae24b90a919ed7e0e12f7189493d6944c12539e011702d5109b7d", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": true, - "accumulated_seed": "c3c1c8e29c841f7a2953b63455ddb51a69db019c6df2a8e55dc534ad43777485", - "era_end": null, - "timestamp": "2024-02-28T16:27:25.568Z", - "era_id": 5, - "height": 53, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01774ab3a66ac9cc9bc311e6837c71974242695a7a3975a09fec5db6e8fa0a18eb50b08c1f0c35bc84e0a9d499c128819f0a2aefcfb9de5c6b1665d8c7af951d09" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0172767b0e6ef72db6e61f332c6b96f27faa82577e36f214d060e586da9cf313c2744d5f62fddc27349bcce8671031ae5480b89e2de0ec1ea3ce021cbfe520dc0b" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "018c86253e4546aea84916c984c4361425c8ec5772f8cd1b565333fa230adf036d728ed48081ee40f2e78a6b75497962ddca22583432c450316ee1f3c7e1af3a0f" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "011102c13b0b1dc856916c571c5017c6426c94df80b5b430f72c39d0e123f1af8c24cb5c8e9fff0e35cec3bc5299adf8c68140b231f170a1fd9ec96bb84f17e806" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "0161a65e09613a9b5de874666f9bc4b1ef40381411a9779b54c2b86da24a2e012202ae00396715f3f8afa25c94a2dcf3aaae6f38abb90057eb53a8e43579483b08" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-54.json b/tests/assets/blocks/block-54.json deleted file mode 100644 index 7194df5..0000000 --- a/tests/assets/blocks/block-54.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "e94d250a7a135b20b46cddd103d1e8e44202fd01f9f6b487e2c857cd98c399de", - "header": { - "parent_hash": "d2ed4f1a027f19f665d58fac33bfe66e7e25afae5e6fa5e90307ab75aa6cf587", - "state_root_hash": "0bfa466e040ae24b90a919ed7e0e12f7189493d6944c12539e011702d5109b7d", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "456365a6e329d8a4af04bbc79e68428ba29a7f7d4171493e8e4d702a5229bac9", - "era_end": null, - "timestamp": "2024-02-28T16:27:29.664Z", - "era_id": 5, - "height": 54, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "012a0d0a6594ca78475f5a59bea88d17fbbe36ea7a63871b41fd58055e76fc9dfe80384f80cc5cd9a83cd7d864e9c7d6643a106fd85c882454b33412480451da0e" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0174291c0c1384d4e2070f6e17c440e033892531694102790d0502f1cfec607a5ebf014404d738be1ad070866f9d877ebb5b2ad6b849cabdd1154263df7e94db0f" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "013e4fbf2d8f0fbab722a50c4a75cffbf51d4940ae885706c00a35e12d0ca651a1b52631f07b2eb0927a3e1f9b2e44a3ee1878459b5438294febbfdac384910c02" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01ba5518a26d46e422abf6d2d9b9fed1948813f1c1e4a7d178ffdb4179049c153788c9082429fc199fd30074cba6faf4bab8ba6925651aecf1f3a9017d1a528307" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "016325061cafadfd9ed537e6d9b7990a53ac77f942a3bfb583360ccae1fb8c91c9304f7cc220c8c223dbed5ef131532d02a121ea3790d3c120697a43a868e81107" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-55.json b/tests/assets/blocks/block-55.json deleted file mode 100644 index db92c84..0000000 --- a/tests/assets/blocks/block-55.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "hash": "850b062e3e992692f651e5960bea4a617a48b261a610c6994abc02f138b0f5be", - "header": { - "parent_hash": "e94d250a7a135b20b46cddd103d1e8e44202fd01f9f6b487e2c857cd98c399de", - "state_root_hash": "1ba0d5ca31850918059b52e2f8a38a669fec1ff073b4fd108dddc3a881262d5d", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": false, - "accumulated_seed": "3a2ffd7faa8ba876cbc9c225ab06f4a9c44aa51ea116aebc0c78a49b3efa85ae", - "era_end": { - "era_report": { - "equivocators": [], - "rewards": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "amount": 1999999999990 - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "amount": 1999999999990 - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "amount": 2000000000000 - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "amount": 2000000000000 - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "amount": 2000000000000 - } - ], - "inactive_validators": [] - }, - "next_era_validator_weights": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "weight": "2039999999999800006" - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "weight": "2039999999999800008" - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "weight": "2040000000000000014" - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "weight": "2040000000000000018" - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "weight": "2040000000000000016" - } - ] - }, - "timestamp": "2024-02-28T16:27:33.760Z", - "era_id": 5, - "height": 55, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01745dd29343a12f51f9c82c9687d3217561b7d8572ca597a5f14ae310a448cf3fb18c71eb03d7a2e72afcba08746c07f30b1961d8cb25800136871fffbe7f4300" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0184bacc048de5b8705572b7e07a437ae7bec1863de12c78a7fc6f84221010ebc5a484c66238e43af36a0d36ac6be39bcedb20a6fad30c89d029da960c5e62290f" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0103340674c2cfd98459b2f55d8e8b0e502845729a73073131ca2986b53c00ea962d18e16e110be8f9bc174887bad3876f3a73ee17094cd9c5d0a938b733722b0e" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01d7101edd98ed83acf8c5322345b75e72e44f13637c49b89797ab415fc4eb825ee3b270f2c6ed48283d0cc128b7d888097c0c01fd50bb7be46c45fcd0a260790b" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01bde8915f9e7b3ab54a8a11aff3fe04ed02d2e7dd8c0fe799ac9e40f5adadf3f6223732a99dd049ab9d108f71fadb7146b5c63dd9cf99f92f39b539536986ac0f" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-56.json b/tests/assets/blocks/block-56.json deleted file mode 100644 index 68a33cc..0000000 --- a/tests/assets/blocks/block-56.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "82937ec90a94ff88d71ccb8025b449011f777b464fc415e0bbdf5bf1caacc33a", - "header": { - "parent_hash": "850b062e3e992692f651e5960bea4a617a48b261a610c6994abc02f138b0f5be", - "state_root_hash": "1ba0d5ca31850918059b52e2f8a38a669fec1ff073b4fd108dddc3a881262d5d", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": false, - "accumulated_seed": "434035461ce05483e1d7a5b7ffbfabe2451d3ee0a1b28edf43c79acf6150d3ae", - "era_end": null, - "timestamp": "2024-02-28T16:27:37.856Z", - "era_id": 6, - "height": 56, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "015d6a5f7170ed59ee3b6b4adc20ecc823a31b6764575541f6d2e8ec397d2f1c57f33d3b6debde433c5d6e42cba75975a6156790d14bb6c7f67c71235fa25d980f" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01e707927a002ad21a3a070bee6a9432ba5fbe57e62e8b7f25287a752ac9774fd9af891d09b8bdcd43e975ad6e8e465183b21f29678e589ecd3aa1ba5e4bf61901" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01f55ec8e80e9bb6815640666c37c221b8d400fa964fc0e6b960ab8054b8e720841d464bb5744c793516f46e7bfb4db83dc3b129de9cd00db6206506a2b8d38c02" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01b59f51945e1ba53ce67beff2af4f5b29ccb085af53cd8b7c5a44094e31226e67254654543d22f033d3ceb76b221806be925b1c00bd075853a1096528e236cc09" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01ce99279dbc5a955346263614cb18b60291ddad054b042fc51a5953a1c7c300ae6302874ec23dc0381a8693350f23853405fad9335838c5de8140513bf5e25801" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-57.json b/tests/assets/blocks/block-57.json deleted file mode 100644 index 7df4ce1..0000000 --- a/tests/assets/blocks/block-57.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "8f23ffeda273fdbe86bbaf049e46c9ff7b508cb67bdc88562458818ea0215df0", - "header": { - "parent_hash": "82937ec90a94ff88d71ccb8025b449011f777b464fc415e0bbdf5bf1caacc33a", - "state_root_hash": "1ba0d5ca31850918059b52e2f8a38a669fec1ff073b4fd108dddc3a881262d5d", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": true, - "accumulated_seed": "78b80acb38ae8c076db08df0543baac01841b9b743a1dbe20f69ed86590d26eb", - "era_end": null, - "timestamp": "2024-02-28T16:27:41.952Z", - "era_id": 6, - "height": 57, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "010556d71068651dfda3166ded38d508379061969eed2908636e683d7474d98e94499c254b5f7c4c5bb593c68b171d9e792c6443182c5c1e03dac1765dc3df300d" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01ca92cda4f938923dc06b6d23f6f084de23bd0b17c12585d7b23eaf7e49914651f9ad69ecbee82adcf9ae5c09940250eafe938c642d0629eb79a9b15784053507" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01486b8051933f119cdf1494b39397349a849f5f1bbfd28a7dd8c523c2a53e42a46125effd65a50725fc3ed33b5e22ccd95e0665252738cf7ce78178a23f670601" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "017d18da59cfe8a8a056ea398c1f7be470d48b5db06686157d3b729a28504e99a57a1f6d9634225a2ca98429fd375fb0aaaeef8e84b683f3b07f08091af8ec6f07" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "019ceb641d6d3d0f3247ffbbacb5bd8e345ec08fd84642c0dd58fdc11f467f4bf7e97a93451addf5926a01f032774d82148146733576dd64e3305e0a0efb474c05" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-58.json b/tests/assets/blocks/block-58.json deleted file mode 100644 index 9f290b7..0000000 --- a/tests/assets/blocks/block-58.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "946c90d627419dbaa34c88dfd02291d8dbd461ea16f9d8b2c70cc4ef5ddd60de", - "header": { - "parent_hash": "8f23ffeda273fdbe86bbaf049e46c9ff7b508cb67bdc88562458818ea0215df0", - "state_root_hash": "1ba0d5ca31850918059b52e2f8a38a669fec1ff073b4fd108dddc3a881262d5d", - "body_hash": "9795ec386b71cee3c0b831b582ba41a1021422065b238f915174324fa77f4772", - "random_bit": false, - "accumulated_seed": "fbafb0068173ac66fde1b8c93b4783ca71beffc0843afde265681955f523884e", - "era_end": null, - "timestamp": "2024-02-28T16:27:46.048Z", - "era_id": 6, - "height": 58, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "019ee2ab50a724cbe349f4f499f33633cb305fe3b696b232fbe79007dd9f66abd4292ea3830e49209132c0f55dba4411cd6492a1dbf48e438722aa2c7b1e97f708" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01a7d42b7602c42c59bad6974bbfedd611c7bfca2b0ee04cb52d33dc1808b8ecab16317d00009547d30adb656e1db32b1c7ec156c1c7de8caff922951b61dbda02" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01ff66f26b95f6414a544a6f65f39f51a1a57a4b4bab8f75f5bc96c37d5f3e6678a5943df21d1ad6740ead2fb2e82d254ff95ad4d2f0b835c3af52ca7846802f0e" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01daf6529f75f4de730304fcf561f63b28a16d21f151da6a98205ba384919a09c07fd0db9c061bec4e4dd5525bbf0ba6d6a40b003f9eb7e2bd19e99bcf7d61b401" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "011d1b17639f283e518a0aca60c017a9ded7950674ea288e77a699cb7f049f37be8f0050d92e71bf04f3c4825ef4346c6ab7cb760b75570bafb8f7d887bbd40e06" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-59.json b/tests/assets/blocks/block-59.json deleted file mode 100644 index cc8610c..0000000 --- a/tests/assets/blocks/block-59.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "4362b516594ab107c0f7ccd73eeca9b86bfccc534d3ce872c0d6ff143b90d178", - "header": { - "parent_hash": "946c90d627419dbaa34c88dfd02291d8dbd461ea16f9d8b2c70cc4ef5ddd60de", - "state_root_hash": "1ba0d5ca31850918059b52e2f8a38a669fec1ff073b4fd108dddc3a881262d5d", - "body_hash": "9795ec386b71cee3c0b831b582ba41a1021422065b238f915174324fa77f4772", - "random_bit": true, - "accumulated_seed": "4a146b73343432d53c5883ee14059dcff778c4530af9fec6444e074158327f9c", - "era_end": null, - "timestamp": "2024-02-28T16:27:50.144Z", - "era_id": 6, - "height": 59, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01bfd3d13b033734e87c3248e4ad44677120f2c285a3802b0886027db5500f00d23ab17da551c04c6c3cced12f23431381363be4daea56d83a1be7160c74fe3204" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01d30b83eead78efe683d39dad57edab77480b40afc8250067be238f66184a38107f0024bd0db5f2e1dfd2cfd96126df6414f6776f17bbb06e585aeb7cdc54c905" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0104f4ab037554f92fe619295d92430dc63ef3296ed0aae59850dfa71687cea57709eef2e3b8ab62f855aa27af1edd2ea17a9415e9285641868619c43ac1dfa80c" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "017987f6cc04538d137bcaa88b6150b39543907ec20011acbe569f54b8af02a015613f53ecc2d4bbb82e721c18a66677a7a8cd0a39037789481d822890f848d702" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "0107cee2d58a4f62631e03b0abe2adc1c0fd959f29b263fe2b8fc8e82eec272d24731afe9e5543e3ea8a9b32a64e4df0b350582193915f6a0e23a0cf9f57ed2007" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-6.json b/tests/assets/blocks/block-6.json deleted file mode 100644 index 5be34a4..0000000 --- a/tests/assets/blocks/block-6.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "cfefad746587637c903e969f6308fbe68801c942da28081aa2a3a4f8dda452bb", - "header": { - "parent_hash": "7014c09e03c9b443e7433e9d773f4d95c8cc1e5bbca556596ff5fe4a12df0708", - "state_root_hash": "7dc0efc0951998f50565066a15899e90f73a55e8faf22a6b6a0904be9a48da7c", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": false, - "accumulated_seed": "9072623c36725ef542dd4f7994682b51df63094961b26bd3e9f2101ebaab718e", - "era_end": null, - "timestamp": "2024-02-28T16:24:13.056Z", - "era_id": 1, - "height": 6, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01be490e0f615788f09a18561003a79b1f9ca819b84821c93cbfd0f26d91fb7bc8a5448f920f3b0a1e7a57df4ec7fbe16cd5acdf3558af54d87e3ef00574378b0c" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01c976fd8755e3d3c2cbb84d8fd61946bc058562c01f14127e1ca024cd89039844540ff667f98e38c3e28ca7de0d93e0f19bc0918b3396ce5fa145650a9ac7f10b" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0122d281b38301ea79715b0f7210c1b7c72e204408bda59ac942ce46e99c2dee6a14fdf71b150403874e818cbbaba173d5738685cc506804aee1ae828365af8407" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01acb0a67b367018da0e85d8ce9e2dea2759f3c65ec226b4add8970c296ec7ccf93b17315497b7073b02720d65585f933d64ea72864a3ea3ae50b9552d22d3e90d" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "016c4a5c2ef6e92d47eebb28043e2165980aeccb9d2d0ffbbf600d426c1ca3d4a7227c8ef579ddd1db8d14e3a3f564ea6b4e5bbf4698f0c8e05f87fa3edc92f20c" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-60.json b/tests/assets/blocks/block-60.json deleted file mode 100644 index 98e1e21..0000000 --- a/tests/assets/blocks/block-60.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "8a9a9eddbdc6cc5085e6775b0ce4fffcb404d95869035c07e4a7b144e521a2b2", - "header": { - "parent_hash": "4362b516594ab107c0f7ccd73eeca9b86bfccc534d3ce872c0d6ff143b90d178", - "state_root_hash": "1ba0d5ca31850918059b52e2f8a38a669fec1ff073b4fd108dddc3a881262d5d", - "body_hash": "9795ec386b71cee3c0b831b582ba41a1021422065b238f915174324fa77f4772", - "random_bit": true, - "accumulated_seed": "a1165a9e27133e0672fcc5f756cab65575b0e65a16e7eb248abcc6f97025503d", - "era_end": null, - "timestamp": "2024-02-28T16:27:54.240Z", - "era_id": 6, - "height": 60, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01e5f724d83c7e71bfdf107c48d366e04372453600383cb0ddadff1aca6b51fc26a0f1c3ae6213ab8f4b523287137b7b83f6a6e43fbb2bc77dfe1b6ba1b1a7cc0a" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "012ecbc3917c603980933ea33b1319cc25592de0f6b7fe285dbd6871dd7cefd9babd5efb4befc4c493a9183f82471c6f5e8ab52d871feb09aa1abb484005a98f02" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01039294120fff0750a2ad0575ab6d313fcbfbe6d031ec565fd48c1b0c745d86ab6a6ede32c248afab20463439e80c32ea0202fffb598b9ee40fd52ad91e36510e" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01b4eeb3d0e959ed76d6be2ee4a10ba4c1e879b4c3b1a15780341b1667e719b129b4951574d280ba27e180a25c28f105d5a2862d739461424aca54868471b40500" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01007c2577c3f94eaad0a1541defa2bbac09448c56961e344b960c342008c2354698aa05517d01b9d6bb891326c2e5d3c8a0795ce32196e6be5a52ca24d289ae06" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-61.json b/tests/assets/blocks/block-61.json deleted file mode 100644 index 933282a..0000000 --- a/tests/assets/blocks/block-61.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "905fd9009eb37bb0d8560a814b184fe93825d37fe81c861cac59f582ff7a4399", - "header": { - "parent_hash": "8a9a9eddbdc6cc5085e6775b0ce4fffcb404d95869035c07e4a7b144e521a2b2", - "state_root_hash": "1ba0d5ca31850918059b52e2f8a38a669fec1ff073b4fd108dddc3a881262d5d", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": true, - "accumulated_seed": "200487131bc1e1b5f1edc2c75c6f7e1e3bfd3955e5797c3b6599e9c3447b5adb", - "era_end": null, - "timestamp": "2024-02-28T16:27:58.336Z", - "era_id": 6, - "height": 61, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01def8ea88375773f26ecf04d7be8355d614a5a0b38648ccac741c0e09a0a0284af58ba2b7f771bdb605c98d337d971b5435a9e2da527632ab8cee9715b1e59e08" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0153e52c404bff7816084f5a6e460f6721fa604f502d2864302dc1f6297388c058979fe715cf9e0c279d41c31a2e2ae395ec53b3fab9bbb4f6f2a46ed1496b4b06" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "012c40568c0c88bdd5ab9cc9b445c0b5405a18924e20b0be1447c5ea93574505ef762cba84b3900cef2f6653e6aa6d410fd017a17c6fe0e0a0d713a33b99ccbd00" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01bb4d00c826b8352375e68e97dd648309b3f22ce0630b28a4408d5b21b86a89d573a2dab07d8d1e87bf1b47ca43c67e7a97b8b87cb13af692cbd4a3e2120bbe01" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "018276a3e934e4dcd855e32e37e03c527dae754eb5ba88216b8a0ab1dad98bf7d7cbcdcc52dc0f4c6d80352101102576186a9ea51d7acd4c35efc5a83d3ed0f008" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-62.json b/tests/assets/blocks/block-62.json deleted file mode 100644 index 222b999..0000000 --- a/tests/assets/blocks/block-62.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "475721ee865666f5040e4b5d00017616446ce79234033260926aee4a019e54a3", - "header": { - "parent_hash": "905fd9009eb37bb0d8560a814b184fe93825d37fe81c861cac59f582ff7a4399", - "state_root_hash": "1ba0d5ca31850918059b52e2f8a38a669fec1ff073b4fd108dddc3a881262d5d", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "7238390679ca0af4178bf9fa9e0a571820d021b4d6b146673e4f9122c11cd777", - "era_end": null, - "timestamp": "2024-02-28T16:28:02.432Z", - "era_id": 6, - "height": 62, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "011db73ec549df2ffd8bffa313f78be3a46f9e9ae4f930f9cf070f9c2b9cfb535d820b31f52c0c1850ad717baa9edf11a1b95806447e10b064f64ce14eee96200d" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0116fc3f1a702ff0053ed58a58c5e4ed4c0bbfc72feb1a45ead8c1514a35dab52d46c8e02275b51a1eda16b1fa55033da2ce7cecc36457245146be6643671a570e" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01dcbcffd10fe6deead638d08eaef0f4fac661e4ad3e2c0f4df126174eabd3090a9e2f6d89e2cd13d20cd6f727f373beb568c904d631fac48afbbb380fc6fcd90c" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01ac94d60abda93b374fa46d58ee8b4206c1ebdd1cc89316881542eda1ef96d715bc98f63046739f42ee5601439af60e93a4884257e8d8d76508b8168d3e5a8e0b" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01f103616c0c39b27397dc19a58f5e435a370569927736cbe0f388c1d440fa096fbcaf5be939dcfb39a1aed9011baf347b8fdc7e644445f15ff9720944aa2d3900" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-63.json b/tests/assets/blocks/block-63.json deleted file mode 100644 index 203ac42..0000000 --- a/tests/assets/blocks/block-63.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "38a210464bb5dcedc4cd92d707006a1a7082294216ab22662b5bc5c01cc828cb", - "header": { - "parent_hash": "475721ee865666f5040e4b5d00017616446ce79234033260926aee4a019e54a3", - "state_root_hash": "1ba0d5ca31850918059b52e2f8a38a669fec1ff073b4fd108dddc3a881262d5d", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "7f03ae0197d80d2e3a33a085be060a4786188752b2e3e215edfbb1342ccecf7b", - "era_end": null, - "timestamp": "2024-02-28T16:28:06.528Z", - "era_id": 6, - "height": 63, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "012974702b0781129fb8a48e351adafb65f3fe9554532f89ebbe5ec1e81d7d5693cf57ef0b6fe81a612f5e3ae3de42be0c1811357beb0b2946c480501ab9332109" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01713f9745dc04df0077b33b67e5ee2e79b08a97da61392c51a06866c18f8987dbe2a93c69e9077adf4cde099cb29bd8b405401f229a5d8e7195aab11cda40af05" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01d6586c5f7395f98945041816b75090563b09821e817519f9008911a0cd0577df3d6bf0e4798c01ff61b823b5b0e40e6d9d7fe9886ce1dc46cd53f3e947dfcc09" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0122cbc444d7d42d66d0b0833f4ba70d632bc6b31abf56561e8a9efcf5703f01f781b19139472bc59d1365ff64a1f52fa3b3419b1c91ba7a2e06746f185af1a006" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01c76676487d8cc0eac6d22091459d8406b2cce59847446aa46f7b45d9f841791837a1de33a466dfe3bd42b1db76f9ff627c468fea6f24273192ebecbc8355150a" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-64.json b/tests/assets/blocks/block-64.json deleted file mode 100644 index 033258d..0000000 --- a/tests/assets/blocks/block-64.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "b7c5f992c40b2003daa67eb9076d08fcc23137f6b9f8aeea39023a70d9518af4", - "header": { - "parent_hash": "38a210464bb5dcedc4cd92d707006a1a7082294216ab22662b5bc5c01cc828cb", - "state_root_hash": "1ba0d5ca31850918059b52e2f8a38a669fec1ff073b4fd108dddc3a881262d5d", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "e11d87f479cd8bad2a5ff7e0a1038fdb16ab01f8de9a319be81f578c25c8646b", - "era_end": null, - "timestamp": "2024-02-28T16:28:10.624Z", - "era_id": 6, - "height": 64, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "0136b1c2cb39c6ac879b2bdb2f03a28196cad01b46681728ddc450a9d883f095a23d40d2f9dc08c6753e8ed7ad40485ba0f1d51080f89939e767c5e7184860e107" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01ef64e87eba696d13fa4c5c7e603c6436dc5e4e84fe3256b6a46a0ada3f1718674a54df765d674cd898e5618d4d4023ecc32536495410142123f37a08d0b61a0f" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01d5cbe7a1347d4c8bdcb968c5f9cf42e7e7e4af91f4fce01b20e94205693d0fac33d2902d00e95085f11fdd21ba14af96a4a92fd48b69788731d29dcd7cceb80a" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01c1ea5a559bed74ce788ee8e21913c966ad86190e82d70f94cc51153d30ee59a16106a74d572777a6ba2903400f0e721093bf13dc9471490d32448c37c6b63307" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01321bc5904963ccabfd4ea3d246dd06ccf0d26109e2d0d3ae8ebe08185621896a1521cd52c4ed14b3184b65d238f78e8d6dfa1b185a642012f13efff708293801" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-65.json b/tests/assets/blocks/block-65.json deleted file mode 100644 index 989282e..0000000 --- a/tests/assets/blocks/block-65.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "000e2ebb096ce951842fdaa1b9fecee0ce35066254d03eac2e1939c5d7d9ff7c", - "header": { - "parent_hash": "b7c5f992c40b2003daa67eb9076d08fcc23137f6b9f8aeea39023a70d9518af4", - "state_root_hash": "1ba0d5ca31850918059b52e2f8a38a669fec1ff073b4fd108dddc3a881262d5d", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "e97b7f795447a357273e70f279089c94ef2fc19d7c388a7ab792ec5758381e51", - "era_end": null, - "timestamp": "2024-02-28T16:28:14.720Z", - "era_id": 6, - "height": 65, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01a67b7d71c3556ec14a45374f6b0b5d8731a67dcc0b8b7d993a2e70c44a8a3c0e867bfb2e399926db952021f9be65d28f1faa669d0ae07af15b5711f1cf980604" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01febad294517f0a4aa2bd210ca59f5f1dcd2767bdfa5efb3a0112184f869cabfc336d31c2f4df86103cbeaf25e282003ae1d9e5e94692d287416cb3f679f6140b" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0190e740cc9338d194dbf00d993f65df66bf927ffefe3c2d4329db4e5113b781165c6f22006153bab6d66b0925423a945af752c69837d98308649f4ebd593a080f" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "012c4a67c836199347670ce6d1abe62902fd743e014dd27a1c24ec40b7895cfa32f0c67b0f97d65d8a85b866461bb233d4c2a1be4943e0f66099abbea107cce30a" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "0152c4012549eb24b7b83067da4ef83897ce87165040e71a2517419deec4e7379f7095298a852a0ca0565dea7aed5878d11a687c6d0a6654a9f212bc47d3188508" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-66.json b/tests/assets/blocks/block-66.json deleted file mode 100644 index 6c6e789..0000000 --- a/tests/assets/blocks/block-66.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "hash": "046fbb33306955cbc85f4b6b04400408f996a3ceb17c2ad57bd31df9e7b2e31c", - "header": { - "parent_hash": "000e2ebb096ce951842fdaa1b9fecee0ce35066254d03eac2e1939c5d7d9ff7c", - "state_root_hash": "dfbd0c4f55a7af2475ee5302dd017418f28cb67e0782e576bda1f1d15d573491", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "ba50e4b3716d25bfe11576448da43a88a008dc3fa6ff83e50d158ebc4a32142a", - "era_end": { - "era_report": { - "equivocators": [], - "rewards": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "amount": 1999999999990 - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "amount": 1999999999990 - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "amount": 2000000000000 - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "amount": 2000000000000 - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "amount": 2000000000000 - } - ], - "inactive_validators": [] - }, - "next_era_validator_weights": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "weight": "2049999999999750007" - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "weight": "2049999999999750009" - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "weight": "2050000000000000016" - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "weight": "2050000000000000020" - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "weight": "2050000000000000018" - } - ] - }, - "timestamp": "2024-02-28T16:28:18.816Z", - "era_id": 6, - "height": 66, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01ec4dcff627cccb9d1f2e3a775ef614af83c58ded6fd04505155e58af6814e6931b18229008d496f763f76c8ee018fa44e46cd46895848b5ca117aa943fbb770e" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0164ecb50af5569931398cf00da584bf6e6c8e079d691057718f49504a2eb774d9b2896bd9853ef48e4bb37672d7cfa519c82c94d0b63fc9db397ab8880a806c07" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01646b5f35ece172e03365b21cef32796ff78a771bef0ede2a4ca9f58fdd6e56e400c8939d1ce985b14c6edc55a2b38a7972097e23190dcb57f689ede8269bbc09" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01ec3f4311b5509752c6aa0eea2179f86c5dc5961f5e5c4ef2791bfd48f99baa2554735f669c9cf48b1724caa64a0b3f77ad184ee1483e48cd926e9b1c84016e02" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "0116833f0f5c7df35d6fadfa97b8968e59d6ea7ddf838c51b5a15c5c57223e2c2a9127ecf0fe26f6a0c45aaf3b042398236bef285c5165a47b44ff75aead6c0404" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-67.json b/tests/assets/blocks/block-67.json deleted file mode 100644 index 7ab735a..0000000 --- a/tests/assets/blocks/block-67.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "f2423a9d550c84954a3b6c948755b0a93272e79e650534c70650b984979bc56d", - "header": { - "parent_hash": "046fbb33306955cbc85f4b6b04400408f996a3ceb17c2ad57bd31df9e7b2e31c", - "state_root_hash": "dfbd0c4f55a7af2475ee5302dd017418f28cb67e0782e576bda1f1d15d573491", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "23817ee24c0354c971595c9bea0732716fd0ce82e73036b68028521c422bbbaa", - "era_end": null, - "timestamp": "2024-02-28T16:28:22.912Z", - "era_id": 7, - "height": 67, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "011156fe58678febb2d375931e9204ba49a8a1a70635e165918d876e3a8760d073b53b1c69fc055e2aa531863def00f19f02dff4fbb5e39e97ac852fbce7259b0d" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01d6262afa31ad86300c209d0a960a09db5fa80f4974ac8c85fef06cf3bb836448e5a0f7648413e301345afadfd3bc6018b932b6f6b717f2f4e190a5e7ba8d3908" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0197d9b517f6b64627d24a6f4b06d54c3db7ca261d5280a0fd899d4649c71b31ed64497707a7d5dc209690f8f2761d8875595f759b09f430969971cee3ee37dc08" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01c5ccf08a849d5c318e10745338dd6cee2e73716e1a87329c78b9abbe1d878dcb1875548860f0be9cc378db204ee32b4fa43efc58b15b143163f038290a5f9903" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01fbd4badad07ecdc886b74ab62d32909d8666dbda95ab52d813ac951032a00273129aa5bd303bef20ba0348a87ab81d87380b5d33e71dd60c00e9b43272847f0f" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-68.json b/tests/assets/blocks/block-68.json deleted file mode 100644 index 84eaf7a..0000000 --- a/tests/assets/blocks/block-68.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "730f1fa9c5c54efcc21d072bb7756c41008681497e78e9a3ee74af9dee24d406", - "header": { - "parent_hash": "f2423a9d550c84954a3b6c948755b0a93272e79e650534c70650b984979bc56d", - "state_root_hash": "dfbd0c4f55a7af2475ee5302dd017418f28cb67e0782e576bda1f1d15d573491", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": false, - "accumulated_seed": "a982ff97b71d995374a89dae191dcad9464e15cbbed7e9ce970760443e8c1986", - "era_end": null, - "timestamp": "2024-02-28T16:28:27.008Z", - "era_id": 7, - "height": 68, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01b8ac806aef7f8e30ffb2727d5bd609a057c5d8fa67af7b6be8ce6b0fbb1894abae7c9a10167bbf9654ccf89b5509fea8f9ff41387bd6663fe760ac6f7476b10d" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0129b66bfc881abeb8863b254fbd6cac446e0386ca576f3b22794f0602d620bda6c53ffa8a8ec4ad8754d2a4022f2addaae91fbe0476ebd8dda0297c970fe43f03" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01e91dfde6d37e25445e142faeb6aed13ddf8d58032062940b4061ccb19d9c95652b6723fadc85bcd92e7801acd5601aaa89650e1d5ea465ca06ab7cdce188b30e" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01191d16a0a604c24d8817cd140d0ea175cb717e17ff16e6534a7115faa8a9d270f59c6e524b899a700c8ed5248f2745463ece9afe5135024e79c4e5af9cbce304" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "016880bb654b886667a197768444b6481e400f5102b23c8922c35fc3fe79dd05dc6eb430a8e115dec98b719b43825373d07259d36a5ac07ac5a7ed144fc64b5b06" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-69.json b/tests/assets/blocks/block-69.json deleted file mode 100644 index 8727d1f..0000000 --- a/tests/assets/blocks/block-69.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "f9b6f46faef58b2b45103a7bee3029752e84c580eac059e7f2eb44506134d877", - "header": { - "parent_hash": "730f1fa9c5c54efcc21d072bb7756c41008681497e78e9a3ee74af9dee24d406", - "state_root_hash": "dfbd0c4f55a7af2475ee5302dd017418f28cb67e0782e576bda1f1d15d573491", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": false, - "accumulated_seed": "7f54b4f3c783fd31a0e4ef185d79d3ff94e00253accbb6b35d758a047a7d5b83", - "era_end": null, - "timestamp": "2024-02-28T16:28:31.104Z", - "era_id": 7, - "height": 69, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01920565479b08b712f239b564789fee312802d6180b246c21144c0f449539f2fd1b2200709a4de356d4ccda5dce7515820565a34d04e8c0ecfda7bfd64da92b09" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01b76eb3c724c3dc7d6e3734723c38681fc930a5f8d052611141a34fbb697816ed8d076e9797aef4e5dc5fd358bff01e191b735a5727bae60263c263d9ae869f04" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01c8d264b3eab277e20fc851696ba85fcf6b632af5ff6f043a979ab01e7626cb328a204ff7af275212824936834b97b9ce9e16885aabe0758ee584f03020ddea0f" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01d58b3d4f65f0a9ac4faab2107380c83ade27a3f2b240e829820eaf8bac85cb4384970379ff842de678f396d1eeacf25228b9f47ad4e7091a044b8879fd2d3905" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01b2113a7e3bc6aaae50b58ac493fc68e68e12c4804731a594800d61628fcaff9dbd80dd84bc4cdbed54bb9151ea25f414cd277c9f51793c40e9563f28517a9e01" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-7.json b/tests/assets/blocks/block-7.json deleted file mode 100644 index c73d93e..0000000 --- a/tests/assets/blocks/block-7.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "43064b1578b29a6a2ef328c0f620a7c7cde3d73b541c3bef17508056a3f58245", - "header": { - "parent_hash": "cfefad746587637c903e969f6308fbe68801c942da28081aa2a3a4f8dda452bb", - "state_root_hash": "7dc0efc0951998f50565066a15899e90f73a55e8faf22a6b6a0904be9a48da7c", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": false, - "accumulated_seed": "53844af59aed78e4d3ee6a4d5d38fdcbf4abd9a9e5c0b78cdb7ca518f3e01c62", - "era_end": null, - "timestamp": "2024-02-28T16:24:17.152Z", - "era_id": 1, - "height": 7, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01718a5e797a9dc3256f9736fd97958ff249be755032cf16319192ded71a92248edcf3af9d2a7e6304eb1103d411fb9b02e81c35fa80d966f58a0d0962abfb5d0d" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "010e17f2c8faf984d0b13ba38a6fa0c4f354845ade9f1aba270a3fd5b02655dd35d6f231c7eef086f7313aeeeaa387d6695473d9295a96b3527f2844f6ec5ad003" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01c4ced05f23ce85bed83ac27c188afd196150b8116c26ceede59533ec6d5ac92484c66265c7761120aeceb4ac42bc3d49db718f27ddb7ecad56b6d7d9d6b34103" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0167e46d25901b61d1fa61bd8f91bf09eeb854bb4ecdf99f66c264da3c5b23f5a58cf9b41fc2c9d10effb5783f2b208a758a9f559006bcf9daead0af7a528bd108" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01bb4de9c9f752fa90b77f4d66c5da00599ba93913a494455b7eda98113c266bcb56e356ef5fd8b45fca902c63209ab5d2b6c8b729172875bdff697f3e8d0f9b02" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-70.json b/tests/assets/blocks/block-70.json deleted file mode 100644 index d46ccb0..0000000 --- a/tests/assets/blocks/block-70.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "54c1435e415d3fa00c8764dc54513d7cec63a400b6d849e7debe39a9d1f2a790", - "header": { - "parent_hash": "f9b6f46faef58b2b45103a7bee3029752e84c580eac059e7f2eb44506134d877", - "state_root_hash": "dfbd0c4f55a7af2475ee5302dd017418f28cb67e0782e576bda1f1d15d573491", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "2ba30bfa2d3e7f41de56cdd944f95696913acdd4074ec022c1838257344ca080", - "era_end": null, - "timestamp": "2024-02-28T16:28:35.200Z", - "era_id": 7, - "height": 70, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01f39da0a4cc571eee37e3b74adcaf90d24d84a816c92b176dcf81f39a952dc284b4f73db32a4e336853a05fb7a8faf1392e02265ef779674b521b03f46a8bc006" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01f69829f9441ff21ca30e66ef6d42ba4116937bbb1042ce4161e655128d3cb073bd79313ba4bce73fea4b77b4492773f1c923c00d1a6baca739a839620dfecf03" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "016a4f518425d4239b3a304e0e8f19907f52c4627c2efbe0ee691ba3442692f3386f396e5c0480e8c3465ba5defd50628dcf5e3c1d231a752d0656a7becc52840b" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01782cfa45fc6c533f180d579e7cfccbe972ac67fb55675d70438560a3a2a11d705b4738422253c07c4ff9aa511be89808f65995f32d8037e848c54765f0b1d907" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "015576da222a4f7dd2369eadd104492e83c934e9f68787ec865f1ae07adce3b11aa85b2f7207ed95b8a96e1d96ff31d7093effc51795cb4679e5c466310e07f307" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-71.json b/tests/assets/blocks/block-71.json deleted file mode 100644 index 3132eac..0000000 --- a/tests/assets/blocks/block-71.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "7b4e29de6736705bd80f848d8fe0083f8761ae2105159f73e7df1ad3f111e110", - "header": { - "parent_hash": "54c1435e415d3fa00c8764dc54513d7cec63a400b6d849e7debe39a9d1f2a790", - "state_root_hash": "dfbd0c4f55a7af2475ee5302dd017418f28cb67e0782e576bda1f1d15d573491", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": true, - "accumulated_seed": "8d5c0a4410a76e86625f090cfe43e22e5eecc6f657986e934c75fdfa80f8f13a", - "era_end": null, - "timestamp": "2024-02-28T16:28:39.296Z", - "era_id": 7, - "height": 71, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01b04be92dda7ab8f4a61c77e2c4681ba59c8485d63351dac45299990bfd8cc72d6b92e3f94d30f48932e7005d4dc9a351d7be17403f2cf0c920b05cc9bdfbd00f" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "013750424fa16177ca0e46a53e87fa60afa935b8e214caaa4a5b6dffeb0194996c5b1505ab5cb7771fe24f25643692985ba0c57767d77f8ffca225d8a1f1b5ad03" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01b8bfaca078b37351d0cc57b189e5168c255743ed5b249ee0f9dd06cdd39111322052347a59d9804f79ed0c7687c7b69497b863e0a2b1dc3396dab99bfa131f0a" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01b8d232fd194b9279547b7a4fc8be461a088e2c4e6db6854dcd2ca96348da6662bb8bc17afb6507198ba0637b0d4e4863eaba88a6145b89cf71d3ead39cafa007" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01f0d076a48b53d604338936c3f079e9c9b79e44b0b820d7b3bc137855a24e346c6d8c680f4510fbe2de6c322609ab22e52b8ecba40e3ac0cce25594e8f73d3703" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-72.json b/tests/assets/blocks/block-72.json deleted file mode 100644 index d46b5f2..0000000 --- a/tests/assets/blocks/block-72.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "3ec8b30b2755084a53e86ed9b7c664944656bc7e8b385102480ddb870d615172", - "header": { - "parent_hash": "7b4e29de6736705bd80f848d8fe0083f8761ae2105159f73e7df1ad3f111e110", - "state_root_hash": "dfbd0c4f55a7af2475ee5302dd017418f28cb67e0782e576bda1f1d15d573491", - "body_hash": "9795ec386b71cee3c0b831b582ba41a1021422065b238f915174324fa77f4772", - "random_bit": true, - "accumulated_seed": "f7493e3705ed0d576012fafd8c1cca0eb9d08f9552c6579f4e862dc653d3ae81", - "era_end": null, - "timestamp": "2024-02-28T16:28:43.392Z", - "era_id": 7, - "height": 72, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "014cddece815cec66eb4b29b786cac2556ff7b0b901fb129fac1e4e7cebd134bf3e9f555a0d7424526042b55a5a4ddb4fafb5ac8d02b50cd9af994bc61a2f59105" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "012fde12495382e63062ca553168e6d3d4b92711003a01bd6ca6a100e7d42c71291c3e62ed4f1557aae55b879acd8cae6bc8ef26e292d0a4db3324ffafd3216e02" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01a690565ccf59ae5be8d9cace5b0388a3170678e55a1e7970201729b3fd14aa8da79718e990f93d221344b86ebe2fd912879a23042d1dcbfb2e9eb3e682a6cf0e" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0178e596bf26a7ef05ee6535cd2f1d044fb4980c497a3654f1a72d6eb05a83981f6cf193b02858c71c5da1f58196c6d9b4313dc9c8561cf6fa6771da97c38e6f02" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01cb56043d3112ba30eb3dc0dbfc49f2c29f2be2ec96aa87dca3ca61303d677c494f86abf98a05ba53e81ff59fd13700cccfbfc510c1d8a9602f0f7e2e128f0f06" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-73.json b/tests/assets/blocks/block-73.json deleted file mode 100644 index 3e3e7ad..0000000 --- a/tests/assets/blocks/block-73.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "91a07b168598ed81e1330376d1311602b6cf683c714548b39d8575583ca3483d", - "header": { - "parent_hash": "3ec8b30b2755084a53e86ed9b7c664944656bc7e8b385102480ddb870d615172", - "state_root_hash": "dfbd0c4f55a7af2475ee5302dd017418f28cb67e0782e576bda1f1d15d573491", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": false, - "accumulated_seed": "472783070544c71ab73b2f05d437c9ca932ed25bd85e9e61b264ac6a57cb0ecb", - "era_end": null, - "timestamp": "2024-02-28T16:28:47.488Z", - "era_id": 7, - "height": 73, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "016894437124f2897e878d7ddf3ed884493bdb693522b5af23c901ad2686b7f3ac59077a82b4eff186cbf9f665a541aca448adfd67cdd14cca99d2f298603e2d00" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "011a0e877f1489b94006bd86ff07a9a2f9ebe76d587e6d81e350dbaeb0d56a416793840a451469bf7770baddad3ff745859d083da55bb3a8994951225fcf44a901" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0175b9756a908381db3c56c82b7abb41c64d5e5b270ac410a25d72ef337246c8654ee002993a9ddafc46a59dc2b0294672c8580d89c21b0f8aa86e9a5a191b5a0e" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "010969f9017781188fbf65f00e00b39c61f77b66847f2a3891b9d36c94a2429650d1d5d8d7e71b4b5e149bea6c3ccfd244900aadf33877a8b27de59300d6a75509" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01309bc12e5230c7d2594a51954d7aa7746d8b7413e610d0c02fd341146f7cdd05e84c0d4032c093d7e73740e2e577f6d8de107f368905060a4fd70d6a2db8970a" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-74.json b/tests/assets/blocks/block-74.json deleted file mode 100644 index c524392..0000000 --- a/tests/assets/blocks/block-74.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "f759ba96f9a3d72750d90a7079e15ab21b3331584989e1960d8e87f119fa0807", - "header": { - "parent_hash": "91a07b168598ed81e1330376d1311602b6cf683c714548b39d8575583ca3483d", - "state_root_hash": "dfbd0c4f55a7af2475ee5302dd017418f28cb67e0782e576bda1f1d15d573491", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "b862a399fcb8d5ca321738011e531fbdc5de7d36a4c5d84cca0c66356cc3eb45", - "era_end": null, - "timestamp": "2024-02-28T16:28:51.584Z", - "era_id": 7, - "height": 74, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "0119b49cd514c667361303a34458140fcd67803ec474b33b097859ce758c2b070ad7ac878effc76a585f50d8c53edb21d7571fc91a0254cb5f5a712e485e29770e" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01ae5fbe8110158bda7e718d99dd5059c9b532dca8f365cb1093a5481dd006b16fc9a6434a1f7e16d83256d467ec2b05bb2bc94e0f9525836574beb4420c97b000" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "018732f67195ea168ae3c133ba3430fe632de1c06ff7eeb62c02c29d1ca2eacc94cc5a8634ab53d36e51f4327386a7b696fa3c29f463e99b5888671576bfb0d80f" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01c2424b122e41ca9f189fbd0c096e653f62dd7b450c47ff0537b75a600c4f1ce8af9ee53357faa36bbcf68ff035d6b195c01436064976f75d8df43c477aa62806" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "010daffa559032de7b643ce750554e1b9088899f00591890daa9bd6e36880476b25dced52c64c81315e4792593379950c17a39974626c2b59217d7ebdfbf61f40a" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-75.json b/tests/assets/blocks/block-75.json deleted file mode 100644 index 2f16cf7..0000000 --- a/tests/assets/blocks/block-75.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "807d1f0d27d2856b4490b9749675a2a7c2d03e6627dfc5e515520a35cfb20569", - "header": { - "parent_hash": "f759ba96f9a3d72750d90a7079e15ab21b3331584989e1960d8e87f119fa0807", - "state_root_hash": "dfbd0c4f55a7af2475ee5302dd017418f28cb67e0782e576bda1f1d15d573491", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": false, - "accumulated_seed": "dc41715a4558783271ede6af434c92103a5300e47ec7488d74b0006dcfba5ffb", - "era_end": null, - "timestamp": "2024-02-28T16:28:55.680Z", - "era_id": 7, - "height": 75, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "0162aa9fc77fd92e8a877341a6531c779b8c36734a07143eb99594b086aab00510f3ba7614b808d23dffd02ed0a039ea6c261d07678adef3705aa2a952137a1b0e" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0168f53e0c8a794f3b90e0debd0e8c58fa89b00024ca0af684a509b63bd599d45a14ae8e0fb8b417be8710843459f87a0642ac746c31094c6ca4fa4feb391d8202" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01342454ad46c6f84832a4862a6d2b91bf4bf21b8ac24b19239415d285aed35dbcb7b0189f8946008cfe03cabe6291a8d2ebc3e659560e82d9d1d2ecfb3a3eab0a" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01ad456a172853186137dfb5fdb936da7455d15d59f3c89a7cf8b3290d056275faff6ee20fc276f43b676cf780f677d7ef04e32ef31e22acbb1f6b554c6ca51101" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "014ce2f0b0b7937f7bf43a430f5a80195de4e43201dd4408d438cb2dcf7df76cf1818d778310c0fd8f918ab2d7d585b9c7443e4085d4ed654198b40441665cde0f" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-76.json b/tests/assets/blocks/block-76.json deleted file mode 100644 index 5de9241..0000000 --- a/tests/assets/blocks/block-76.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "44faa72252c865f5a98c02c2e2e7b4bac929137ea9f8e8a3ae2e5b98deb4ce00", - "header": { - "parent_hash": "807d1f0d27d2856b4490b9749675a2a7c2d03e6627dfc5e515520a35cfb20569", - "state_root_hash": "dfbd0c4f55a7af2475ee5302dd017418f28cb67e0782e576bda1f1d15d573491", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": true, - "accumulated_seed": "db4896a161a8ec16f7e9edca38899d96483e1b43dcbd108918c1ca70235d304e", - "era_end": null, - "timestamp": "2024-02-28T16:28:59.776Z", - "era_id": 7, - "height": 76, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "013e4f7df791e0a63b34bd311237900bd28b656dabd857b4581f9b6de763fc50e3b916210a7133a46ddc82a4908eb3522deaca35f3c43929071a6c14cafcbf9e06" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01f125b750fff3b29265a3ffd6bc4ac4f0b583a059ccaee1b01573cdc30ddeef6f888f0a997dfddd9c85c153936a5837cf5b08062577acbee851a873c30a4ddf0c" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "010c01d7fce0808fe8848cd747b14c48e99bb9ae4631cce64c340d6613d32420c6b5e7a777bd60e60a987ccb47be12751be68cb394f2da5422425cc684ab0f7d02" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01df20fa64e9834ebb129cd81b2eb945bd18d28c12e59a1da9abb4b68ed7382b81dad9633051b64e80e6327728c19e0eb1f39cd9def96267199436f19648923e01" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01a94afec70e104fdd09a91dccd70ffd4eff8647d3c5c7aede56f1207bf1c7f89b020554c904c0f5937a79cf0fda3019ce176c4a8ceff84255fc0502020493e40c" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-77.json b/tests/assets/blocks/block-77.json deleted file mode 100644 index ef9dbd2..0000000 --- a/tests/assets/blocks/block-77.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "hash": "9c7c016eb70510995589574ef0ad45820e5292b559a0764de6ffbb8177051ffc", - "header": { - "parent_hash": "44faa72252c865f5a98c02c2e2e7b4bac929137ea9f8e8a3ae2e5b98deb4ce00", - "state_root_hash": "8e7001a819c188c892c750c6a24c328d0f48017a5420a4d6d150c2dafd01fae5", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": true, - "accumulated_seed": "8ab67401e82c2ba79e285ee38970f2dd8fcc4842ba2a67230860acd933daa994", - "era_end": { - "era_report": { - "equivocators": [], - "rewards": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "amount": 1999999999990 - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "amount": 1999999999990 - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "amount": 2000000000000 - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "amount": 2000000000000 - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "amount": 2000000000000 - } - ], - "inactive_validators": [] - }, - "next_era_validator_weights": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "weight": "2059999999999700008" - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "weight": "2059999999999700010" - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "weight": "2060000000000000018" - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "weight": "2060000000000000022" - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "weight": "2060000000000000020" - } - ] - }, - "timestamp": "2024-02-28T16:29:03.872Z", - "era_id": 7, - "height": 77, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "016114b6be078c6cc695716ca71df633b84d25f05a71894550ce934d3557c96ff1943974cb81d5fe6c4b62cc7de2bb03c2c8d55a1626562cee7a6f1aaad5a5d50c" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01fe885b8afb098ac2c86d24c1fc2cfd87b6594a166be4bce190760becbea4413ffb34beffec7dec54c2da2d6b98a61939019a5842dd2cc525cc89b71d48115e0c" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01bd480fe11ca56885822206f2450a26788e8dc247d33afe9fc75eed6ee4c0f31be8e17e7a944137d1ca2bab794dbfc487ada6e7824b72a90c95b830cef9f6b304" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "014ff67a0516180cefa8b022d34c5d995f59567b8e5fb8239d24ce2edfb66b42325a85016aa86372eea7ae879c47a35bf0832b99074cc5ea14ac9a9615d8ecaa01" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "0177304c6fbba2be7411c545b71273d921f4b86b35e91db2b1b4e58dbbda1d8464d2d02a6c4ef3623a4402411bd1f4c1692e706a2fdfe49305feca37ce83655502" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-78.json b/tests/assets/blocks/block-78.json deleted file mode 100644 index f196139..0000000 --- a/tests/assets/blocks/block-78.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "dfe2678dd0c5e52dfa5eaac21cc3a3d75d2d01d554715171508b46eaffd83755", - "header": { - "parent_hash": "9c7c016eb70510995589574ef0ad45820e5292b559a0764de6ffbb8177051ffc", - "state_root_hash": "8e7001a819c188c892c750c6a24c328d0f48017a5420a4d6d150c2dafd01fae5", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "3a59e8388974fbd1a8c2ad66c7804f2382e2d1e6e87868c659b967b0bdc9b7c1", - "era_end": null, - "timestamp": "2024-02-28T16:29:07.968Z", - "era_id": 8, - "height": 78, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "015431f1575a1290442150d8755ef9f3a8687872c2fb8b022a361be251e18083c4622435aa838a682721103e9e98a0074a11d3dde9a45806fd8b207ef8f2887102" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01fa7312fbfe6aa07f8d35a300abeb605a1b59357361902389b7296cf4707053f2ade3f571ed2efd8e9d0ab84156f8edea9baed22fbde70a83540ce37d19ba3303" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "011587d608906a35945c7977f5ed5ec2ca5c1aaa16e628875743ec14b07d0038e50f1d28b91708d9fb057a7b8b7c69440e4007b5d6f3f4f36ae3fddfa40e6adf01" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "015eaae9720953a37eacf5a7ea249beca16891953ac73b7e18b2aefba6e723f31532c489c2c089576808575e4e0493c87cba68d9c120d0b50cc263acc551e7780e" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "0193e00299b6a4ee326ff4054a5a07107ad849ea43d0bcc8fa7574084af6b6abd95936870cedf414b2bd00bc75bfb5b245fdb4b23b708f45c673a148647b29c70d" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-79.json b/tests/assets/blocks/block-79.json deleted file mode 100644 index ebd89bc..0000000 --- a/tests/assets/blocks/block-79.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "4a5ce7e556e9eb82df428fb8afbcbf57eedd5d796630ceb597971603b3461360", - "header": { - "parent_hash": "dfe2678dd0c5e52dfa5eaac21cc3a3d75d2d01d554715171508b46eaffd83755", - "state_root_hash": "8e7001a819c188c892c750c6a24c328d0f48017a5420a4d6d150c2dafd01fae5", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": false, - "accumulated_seed": "8e33e6a4a0c2b9c57e9f0d9341164ab1683df9807910c93caee428ac74e83d87", - "era_end": null, - "timestamp": "2024-02-28T16:29:12.064Z", - "era_id": 8, - "height": 79, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "014c5cb0ac63474934a7f478339493ac0e1cf98261ef50d81394227680cf5b9c9079b2ea5ad42563a07e75fbe50a21f218784b3315aff334da26b52828cf2df208" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01775811d438d8f7669d740ceac581fa923ec8fcb1bdac11f38132bad99e12547c2d513d4a2f9f0946f8c841fd47e8dc64ee4be5d703498e13fba23082b8112404" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0122a2093f3a159cd742fc5b3ee47bba578888600dcb63ec9f719e0db83d34a2ba3d596538fd7ef0970bf3bc230caf17d529a480e75cfef53218ed2f762b27990d" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "011be47a171fb7c8b785a60783567f67444626b2927eafead98e97e6501dc90e382a9e001f1a3ab566ee9c9a2d7a343ff8b23a23d7b9ad50b6eb9e4a63e633c90b" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "016a4f0618b58f331482e4a138589c4ba2eac4f7312f643a5cc107c89869b1d060cc92ad71dfde3a9339b5a61c2168fa83405927e07bf1c4b7cc67a570e714e402" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-8.json b/tests/assets/blocks/block-8.json deleted file mode 100644 index 10655eb..0000000 --- a/tests/assets/blocks/block-8.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "6024368105926f2bcf6763014e8d2e404e0ac9bfda12637d389691344bff4644", - "header": { - "parent_hash": "43064b1578b29a6a2ef328c0f620a7c7cde3d73b541c3bef17508056a3f58245", - "state_root_hash": "7dc0efc0951998f50565066a15899e90f73a55e8faf22a6b6a0904be9a48da7c", - "body_hash": "9795ec386b71cee3c0b831b582ba41a1021422065b238f915174324fa77f4772", - "random_bit": false, - "accumulated_seed": "81a2e70e0a399e645b3dc32230219eb9a56e76183d3d2b5f1487e567ca215826", - "era_end": null, - "timestamp": "2024-02-28T16:24:21.248Z", - "era_id": 1, - "height": 8, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01e556d97ff2eb10bfed31a2a3a8b91735a1f72d467e70b4b3ffbc0de94de49102f5165b3a1e8129d77c101ed27f2dbdbb6160d0e92cade72b48c1ed9eaf72ac04" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "015d9a219c37ada415b8a495fb421d5b39d3e616a1ad6abaef410a3454a90f65e1c7eab21f69bba4bd3e131bad906fbfd7e7958ae86de6cfd2116fe0c1adcaae0b" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01f811d5b57f1c0a0a8b0da511dca0f1d33815f10decbb3000c9dd22ac85d4d11abd69b8ee675ab34c7e0ce4a1be8db1c1e37540d285d567df01825739287f5504" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "016fc76e41f763605244c24baa8b07c293f2811d26cbe5d6ca2f6046f45ed0faee7990ef7e4434366cd6be796ccb2602a0265e3938097ac7de5cccc0847caf3a01" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "0158692d6829dcaa807295c5832f65f08ef58fcefcea808b994f9216eb4e102e50d5bcda4a23282f073167fa569bba9bdb768add480e6f3f4852eb8b798598020b" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-80.json b/tests/assets/blocks/block-80.json deleted file mode 100644 index fffc5f4..0000000 --- a/tests/assets/blocks/block-80.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "8ef2a1375a52ebd182c1e3e8611554e661551a04aa34fe4d0f42be40734e1141", - "header": { - "parent_hash": "4a5ce7e556e9eb82df428fb8afbcbf57eedd5d796630ceb597971603b3461360", - "state_root_hash": "8e7001a819c188c892c750c6a24c328d0f48017a5420a4d6d150c2dafd01fae5", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "95442339b2a51112d7c5e8c20c52171b8876dd3d3fc509ec36c20b94c394c9bf", - "era_end": null, - "timestamp": "2024-02-28T16:29:16.160Z", - "era_id": 8, - "height": 80, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01fa4e72ca58876737544b7cf52f5394e2698242f330f149bb0b966d41d80d9fa58e6d6698d7246edfdff539a3f90f3fd594c594e16a8245062dc66365ddc70b03" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01eb19c8c856fbc0a8b8ccbeb1a34a990ba449ca3de5c4e74ed3186b9d5f23fb949fa71082b304e5e4b1133ed6270ea7d3cad05b8710b8b74140f750d4f4f1760b" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "014db5d8479d02ced079791b6fad4d8047de2e03d676ca532b3cbdaaca3ad0029513a7003417a73b2b2972a7afdbf9200daca5452b10cfeaa05775be4dff5cce00" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0189702c2eee4e406ac3e12c1f9f5a604db0e5e406b700cc40cb8a53dcef4ab60520fd0dee04d83afb9767d5f862824002cca66fca6e8f6b821e789ca822d8ff0f" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01de4efd2d80861c53b8b531ce009e26a34985dd87b4f4c80cbe0751e5398aeb2c8ffea7c304da6b61fc7d828fd8e7364f40994691c2f122b916df6031dd83e50b" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-81.json b/tests/assets/blocks/block-81.json deleted file mode 100644 index 2c98f20..0000000 --- a/tests/assets/blocks/block-81.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "047c1dc7a365cce804c98285a2f5fa16913437d5b7fbdf4d0cbcc1901e22f265", - "header": { - "parent_hash": "8ef2a1375a52ebd182c1e3e8611554e661551a04aa34fe4d0f42be40734e1141", - "state_root_hash": "8e7001a819c188c892c750c6a24c328d0f48017a5420a4d6d150c2dafd01fae5", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": true, - "accumulated_seed": "ca899f02bf95b9f573985c2111f51c02abe40f3b38b8035cfb5a0469ef5a66f0", - "era_end": null, - "timestamp": "2024-02-28T16:29:20.256Z", - "era_id": 8, - "height": 81, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "012ea2aa1669bf58bb94020e8a504350d6f5e7d51f0e0df56ad73b97070cc30a72fbb1b5175097ed88aeef11b472002cb5058ef6c443c3d29d906df71ec76dad0f" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "014b128c164aa3cea200e56de7b53276e7795edfedf0b9f59d15e5a35dba9c39cd914788222d6ccebfed1773e0e30f7338c08b7fa308c76bd8bfab9795ce54170e" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01438a2a15b02f9188865db0055a597811989e4fddc485d243c4ea362c03f139028203b04b9a2ca0df4677bf976f5fb51c810ef06410683c597c8e8c54d3a8180b" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0163e193e4c1b9fa053c94b78acd60b42440ccc756a5d1ba7c63bb318f99b2aa810c4d954bb8ebd30c43fa6192d77271015bfc32dbd8eae5cb86f9694eba55fb08" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01737784ffe33c5383628aa0a4efa108a8ae4840a41192c5e326035103b57ea88d96e1f2c146270b2d65913beaf2cc542457621cf56cc89b4bf96fff503fd5000c" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-82.json b/tests/assets/blocks/block-82.json deleted file mode 100644 index 17150f8..0000000 --- a/tests/assets/blocks/block-82.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "0f17afbd7d39ba12ff4a65736655bbdaed6b0714ea1a1275980aaae06bc62760", - "header": { - "parent_hash": "047c1dc7a365cce804c98285a2f5fa16913437d5b7fbdf4d0cbcc1901e22f265", - "state_root_hash": "8e7001a819c188c892c750c6a24c328d0f48017a5420a4d6d150c2dafd01fae5", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": true, - "accumulated_seed": "e19140d8a48240dbf014cd5e4284ebadc64c9453c5db5c5f518663f6f854110e", - "era_end": null, - "timestamp": "2024-02-28T16:29:24.352Z", - "era_id": 8, - "height": 82, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01b5993f0b17db07f03e2fc32ff3e392c453e60b6e771c34fc17fee75582772f7e333791831e136315a58f10f91774913548d812ab79755c8349e9d2a33d2b940a" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01549481f85c3fad61bbec2032548d77a4af4234a2065ae0e357d68a1f7629685e0e0141ffcdc4f97e9d9095a79b06aa9ce0aaf1e2d8134296a77712498ed36a04" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01f35481b7ba9bcdd1b0628d8c50e19941597827b5a64d81970951cce1f4e186b1f88efbf8df3cf2f746f6950e6c7e5fd45528dfa36ac3042b70405a0549d7c705" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0109e8a6357cffabe5718afdd5d4a2a0e9f02f690b5c4928fb58309124b6ea84cf7a91e943107a16912ff6228fb46c086918ee1d71bb0b1b192e3aeb1fc09b150e" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01d1a9c8daa7b3c76224b1146a7cc98c8eb447b3e7e25b129fbaa38f2fe1341f26559da517711c1a62dd2db311fa84a8110f902e006c7e40975adac67add125908" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-83.json b/tests/assets/blocks/block-83.json deleted file mode 100644 index c2ad6c0..0000000 --- a/tests/assets/blocks/block-83.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "feff5041cc1af878541580e73693e923811700c4ff847455975e524b6ae30ecb", - "header": { - "parent_hash": "0f17afbd7d39ba12ff4a65736655bbdaed6b0714ea1a1275980aaae06bc62760", - "state_root_hash": "8e7001a819c188c892c750c6a24c328d0f48017a5420a4d6d150c2dafd01fae5", - "body_hash": "9795ec386b71cee3c0b831b582ba41a1021422065b238f915174324fa77f4772", - "random_bit": true, - "accumulated_seed": "c4b0885d6d180d4d579f38246da82b3b2e4d1577841f620609e468d095310894", - "era_end": null, - "timestamp": "2024-02-28T16:29:28.448Z", - "era_id": 8, - "height": 83, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "018a08273b8d7abf1de3cbb20d4d7878520f03235511162216018d9969a180f9976b4b1d1ae4e554f2540573a36db71e2ca27dfa08ffa18f219ebc8967780ba802" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01363424907c71da46426986dbb4b6a853d1a684c2b1767b88ba737e0c0d87501a48c35af7f4391011c75338676c06e24acca19d3c0e51627c93ece2a0292c1702" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "012e404eb37520ad91b867e0b8cf7e07ccdc70dc8ef78c57acd6317b690719e3b7b521b2f5cd0b24874d1bf79c78024892a30cee105fa9124f7835363b503bf20f" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01a05e1aae012a908c1af652564be16c5102eb7986011f476529b84baabf9c1488f775b4fb0966f539b459aaa69338b8a583f27860f79d681ea8bc657a331a070a" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01428f2c488175c44c8c8d10b411783591e856155bcefde3cd92f6d7e257ad65a1a07b14d5bf242fc40b5f422459456464b249a69d4d95a25748989e6092da4203" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-84.json b/tests/assets/blocks/block-84.json deleted file mode 100644 index 66c88aa..0000000 --- a/tests/assets/blocks/block-84.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "0886cf4494c85ffd5ea44fb0c5486b7a7fac2edad71580e84cc0eb3fa36112cf", - "header": { - "parent_hash": "feff5041cc1af878541580e73693e923811700c4ff847455975e524b6ae30ecb", - "state_root_hash": "8e7001a819c188c892c750c6a24c328d0f48017a5420a4d6d150c2dafd01fae5", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": true, - "accumulated_seed": "dbb7d8b000e35a1d38978c57ef463dcf9f439814fffafa0e59b9b26f731c669a", - "era_end": null, - "timestamp": "2024-02-28T16:29:32.544Z", - "era_id": 8, - "height": 84, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "017d325fc4560e338a592e0abfce5267d33fe116afae1ab6e7cf65adcd20f5acc5b9fa567a9ef690e56e3cc9c73ce148c99865695bb90ad63f17629fab32332308" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0108b95318edc6e2f13bf82df6ee6d9f6d290fa20a9600c6773610cec46887ce1d8acef5af9e9f003af47c38e275129b3d74682feb890bf2d0c178eb145d382207" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "014eb56d33fbaaa4e5e84ea5b1d7a6a9de57f84e426356494bae37c948be7f4a15c31cce02be582618269ac9167cb48572abcc9c6ffefd6456cd524b2c17aeca06" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01256b0ac69332dbb1cdb349aefbca0dcd4bf0ecb4e8ba9480dac808ad8b8f7ecbde175084ce0e9cb031c861ca90f5306b90fe93a5801c356703f73adae83db00f" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01f028bddf1f47e01316daf915719a4a290476057664ba32455ca8cfa059be1e17c5edad66e77b0e4d04a40a0abeffb77b093907023faaf19b6a9b0007d44ce701" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-85.json b/tests/assets/blocks/block-85.json deleted file mode 100644 index 0e6ffe7..0000000 --- a/tests/assets/blocks/block-85.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "142060f3758744fb8090daa92be923aabd81d29d968d01f29996f91419f305e6", - "header": { - "parent_hash": "0886cf4494c85ffd5ea44fb0c5486b7a7fac2edad71580e84cc0eb3fa36112cf", - "state_root_hash": "8e7001a819c188c892c750c6a24c328d0f48017a5420a4d6d150c2dafd01fae5", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": true, - "accumulated_seed": "01b423702c5f5ade3e425933c428f6cb109e7049a3a80dc3cac73f33a9d706a6", - "era_end": null, - "timestamp": "2024-02-28T16:29:36.640Z", - "era_id": 8, - "height": 85, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "0132c17d61d6ddf3e187ea38fb9a0941842843e26aa66cbc61174ef8d1b2d3c3817bc520021aeca64c0a0ed06ca1e2d131156ab7282c6640da711291ed5c3e2c0b" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "019f9142f7175dba25cc671d45417a6cb93d77774ba720c314544b93777017e2a2c34432c9dee8f0372c041b3e75daafdf693dbae4afe850ec6e8cf192082fa60b" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01d55eab7f203ff9d5f5170d5f4db10da27e2f6af6245d342fb54b59e66f86ad37187c587b50b390af571d0b5fe345d492fc831fd2fa5130e623031c47e9e21706" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01d58a0c7ee690e59284410f511db204097b99dc039ed808c08b2cbc583ce80a264e312caec13f73aa0460609e61325cb13972d1e112c60bbe79f9dd5e9f013801" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01d929704664ce333444be34fd465d0f36a42df2448c30e0ac64e24ea76a0ba5fe74bd35508609082f9857c0cd0d2063fa1e3e9caf836aa41f026bc967dee59500" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-86.json b/tests/assets/blocks/block-86.json deleted file mode 100644 index 9e13c3b..0000000 --- a/tests/assets/blocks/block-86.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "06887e3944f924e396059064c07cf69a9daf3264891e7fb38f5aebdd923dc9be", - "header": { - "parent_hash": "142060f3758744fb8090daa92be923aabd81d29d968d01f29996f91419f305e6", - "state_root_hash": "8e7001a819c188c892c750c6a24c328d0f48017a5420a4d6d150c2dafd01fae5", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "c0f75faf426f69ee2f13b1feaa347d6687cebadfb8b46ae5ad95dd352ffe1e4d", - "era_end": null, - "timestamp": "2024-02-28T16:29:40.736Z", - "era_id": 8, - "height": 86, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "012cf6865ab54d73f039c3ba6508f771755a19399f6b5deadbbf801d35bfaefd810f099fc58935acfa98d1da815d2282d08db4342c40d785ca4cf885b3c8f0560e" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01b37f57ceddb945c685d54cee4ca28a2e783acd63e2c231885c6882aadc486c00d7b3a028d0d811867d5f66cf5f40fe8dd0e182b3d636a1280afad206c7f25006" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01859bb0b2269ba611cc9ff43c75c97fc06158c14b3f298dd66ae22bdb4ef116342a97e33cde44f686baaa5562347f76c775c476b619d21e6912a1f49176270900" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0162a000ed11e48f9db076bab3078ae038ed732b12d4b3b13eb2b7f3ac6d3dd7e7d66558d34d9c0f612ce9e36115db490b3b24633f51f8b1411c6b007e8542c008" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "011b65653ca547981052a95367f6ef51f762a9f6ef1e6f7c1456704afdcbf84f72762dadebc10136db46b5a5a1a56569595e7f73b90cb0bc9bd1c72ea07a812f0c" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-87.json b/tests/assets/blocks/block-87.json deleted file mode 100644 index 61aeca7..0000000 --- a/tests/assets/blocks/block-87.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "03762f9a3fdd75bc20fdc3db1c2612b0a1bfd0b7d2900e01342de31336e35db6", - "header": { - "parent_hash": "06887e3944f924e396059064c07cf69a9daf3264891e7fb38f5aebdd923dc9be", - "state_root_hash": "8e7001a819c188c892c750c6a24c328d0f48017a5420a4d6d150c2dafd01fae5", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": true, - "accumulated_seed": "949d497496c4e2b758554f75efc4cd37e10015f5df82a23d5760779d11231925", - "era_end": null, - "timestamp": "2024-02-28T16:29:44.832Z", - "era_id": 8, - "height": 87, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01e52d713aa3d5aecdb5a46c897140a0f4c476a2f1796db5bf0b658ea3f7487acf8d95f2a742bc57ce44ca0772e54e8d6df851e9c8cf8db599829ba96a9f25c809" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "011a452c707dcada3e96eb0a009fe15eef68dd3d4df777d93a7500baa50d48fe6df4348e9ccb7cc9c347cfcccbce98bf972f583c7d18213872e297f3ae65b16a0a" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01fefae7ce1910c7477aa01900f6a27cc0021cbac060235ada825781ea6314e69cde02ea4ab26fc9d2ff606c05374e83f0f4b45f06a8dce290071e182f915cc006" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "0181eccf7f580a3c5981b7acb8adab4d3e7701e6737e959c700f91e40d178b6d2ce62ce133db081bcca4b7a966f441712194926abad343ac6f9325bd94bfa33d0e" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01750afc6351e9aee19c069a3df16c8b1c3424a6955d1ef6ef7b7a05ea4798e8a3f4ecb2de354d351266d99e1a82dc324319822c8e72e490afc5a1f379c3718c01" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-88.json b/tests/assets/blocks/block-88.json deleted file mode 100644 index fde0ef9..0000000 --- a/tests/assets/blocks/block-88.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "hash": "f9a215757bc9c6772befbbe5b977100cea5272fe11a20c1b5c2ae50a91ddcfdb", - "header": { - "parent_hash": "03762f9a3fdd75bc20fdc3db1c2612b0a1bfd0b7d2900e01342de31336e35db6", - "state_root_hash": "ac558d19987eb158c4888f59b1727f67ad1ae84f79c7ac02cbfb7d5f4ce722b6", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "eae1f93464872f9d74b072a22e74168b8692258e9cdf7b828b6a4cd3fef22bd0", - "era_end": { - "era_report": { - "equivocators": [], - "rewards": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "amount": 1999999999990 - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "amount": 1999999999990 - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "amount": 2000000000000 - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "amount": 2000000000000 - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "amount": 2000000000000 - } - ], - "inactive_validators": [] - }, - "next_era_validator_weights": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "weight": "2069999999999650009" - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "weight": "2069999999999650011" - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "weight": "2070000000000000020" - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "weight": "2070000000000000024" - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "weight": "2070000000000000022" - } - ] - }, - "timestamp": "2024-02-28T16:29:48.928Z", - "era_id": 8, - "height": 88, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "0114c0e68bba0f60cc3a97f97a12a4d9e2fa2ebc9f479c5cd1010a8908f12f57fff7955dfacfd2b4d8f3630923e269568ae19a7069425dcdd46e7a2f9affc8720c" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01534f4a985490d54cd242e799d87fc5ee79c9b0c815eaca5dd9ddc1a5393f9b9a7d8e7deed63c4cbaff842ee2cb1146d85d1806c53dd980bb43590a4e7f205a02" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "012f8ed15dc32dd5e61bbd93e7f829572befebffab99636aa6aff8515605abcde848d8093800ab3bbfa17d176869afd6f2822ce5354964a20a2c44afb9cfd7eb0e" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01120dd08ed5784e11014742529aba016003ba3bc57138af73b036e7172b1f5f0fe48f1f1987e4bb2f6246a60a1f2a10f97dc327c11777c5a2e53a25c3f3af4001" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01bdc9ac08d2978f14a5bf203194906c87bc3d38d3fe481675f95ca01771f94de5a3d2bbf30fb5ab357f23e0a19b089750b2d9ecf2f20b28d468a2812b9aaea301" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-89.json b/tests/assets/blocks/block-89.json deleted file mode 100644 index a864428..0000000 --- a/tests/assets/blocks/block-89.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "56c79f327d7a98a23cf8597b3618762676b30660aa75130e26a53e7610211108", - "header": { - "parent_hash": "f9a215757bc9c6772befbbe5b977100cea5272fe11a20c1b5c2ae50a91ddcfdb", - "state_root_hash": "ac558d19987eb158c4888f59b1727f67ad1ae84f79c7ac02cbfb7d5f4ce722b6", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": true, - "accumulated_seed": "b09da75378810bcbf64f48de5d36ed62d77c5148ae7084f5633ab5ea6d1fb3ca", - "era_end": null, - "timestamp": "2024-02-28T16:29:53.024Z", - "era_id": 9, - "height": 89, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01bd33d28ccd9b36aa49fd49d4039c569a20ebe11f43832e779c8ac7f1e3138c5183b70418c5ec0e25bf781e99a5682b60270b341b238d67f11c49e88be96a8000" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01b376c86e2c5baa1386e4d41c3d9f088270fe770256556387e5f66db4ca4b64069ef68581bc9044d3d84e85cb00ebd173ac2e42d07160e69727905dc050420100" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01c36ca14a2c2d5f82b279c06de92d8e2b2c876ed495eda352e1cd15f0ff99739e2aa5ff10a77ce3a0cc7a955ab0318058a30d3c6d7fde0a9568e5e5bc6612c107" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "010d55d292d5ef2f7e18304ad2263957cb549877e244d3bd1e1de01701a7a48fff9be68c83af83e6e3ff02eaf5c2cd45ebb4f50003a6e5578f5127814e42cc230b" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "012f77865e90855a8a4039bb618349aec3ba8084018659708b3e05da676a99f3c5811f49afad62d82fcbdff6de268155c5db20af36d3f3b6995c08dac36ba3a804" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-9.json b/tests/assets/blocks/block-9.json deleted file mode 100644 index 5815fa7..0000000 --- a/tests/assets/blocks/block-9.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "6f7b91aa652da5199000ec901fad2206ee7bd2fd7ccc00f6aa392157404a0fd3", - "header": { - "parent_hash": "6024368105926f2bcf6763014e8d2e404e0ac9bfda12637d389691344bff4644", - "state_root_hash": "7dc0efc0951998f50565066a15899e90f73a55e8faf22a6b6a0904be9a48da7c", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": false, - "accumulated_seed": "824814e5c78b0f662935bce01ad63015dc1a4f6df05a180837e29a0942a90d71", - "era_end": null, - "timestamp": "2024-02-28T16:24:25.344Z", - "era_id": 1, - "height": 9, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01ddedd0cea553d6d00d698686c34aa1d41feec4413f2285126304568a2fd944e0f1a1a3797a3e2aa9d124ae157608634917bc29f7de0c3d149153b3ce90484d04" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01dd18ed0d8f2c6e18d015870480b1ef6bf2e3e0ad118d8a5586c07b0bdacb2e78c7b8e4a2831c2b05f4b0c9509ab4a270f493ac139c47ba6615e45b003a5a2e00" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "019482eebf6142c045da2ee84e8078f5d6bef38251c9ff687488349c843e20b6b80f45a8398c0b0895e47de28599cb4bbc8bfc591bc03503bd959f8ce2fe164b08" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01eba53347af2bb427188694fbd775afeecebaeb061b73c094884349618b0a1d6ed53b881c4c20d1e03904085462459cd11abbdc1d4a89a3d79c64ffb0e2b5d003" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01f159e33aac31def258a8cc5b34df10a3210aead6b7ff472cecac004f52a3d1e5a5a0913a7abc696a49a88ec4af2ce07b4f590fbc5303cd9a194e2ab462996600" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-90.json b/tests/assets/blocks/block-90.json deleted file mode 100644 index 116ce10..0000000 --- a/tests/assets/blocks/block-90.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "ecdc3aa912a6cdbee5943daca5d3e3dabb27e3c15c28c7ecff4ec31cc315a46e", - "header": { - "parent_hash": "56c79f327d7a98a23cf8597b3618762676b30660aa75130e26a53e7610211108", - "state_root_hash": "ac558d19987eb158c4888f59b1727f67ad1ae84f79c7ac02cbfb7d5f4ce722b6", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": false, - "accumulated_seed": "054a876fd5cf24fbee270e6cd909d123fd0bb97a5bf728dc7123b7a9815fc422", - "era_end": null, - "timestamp": "2024-02-28T16:29:57.120Z", - "era_id": 9, - "height": 90, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "017d5a67ecd1dbb2e77ba499e1c4a18d3747317c2115b198e178029123034c3a3f93b5fd01f977a5ad01d14d3152cf5e4d799689d8633b65677410b23afdb59401" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "013d385e112593954c1b4cc72af942b006634a869666244db0617de438f831dfb14285137c17d34c658451debab1ef9c7404d50d3a0702e75d26979a4ae7b04000" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01248096db9dfee2c37e93a90387c0ee36eb59f4c3db66c91dcfaf432fdb5bc696bc17fbed1a88bc497806c6de2f31584ffe2fb70f2ac69db29c8011c45e92bf01" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01e7f660fda4870f1aa4c1fcf2e74c19b55669b5a4922ff236937c52ef13deff02e7860ffed54cab87624a691dc533032827224e96a9f86103060222d56da6e100" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "016a5e26fa02875f9469934736f773c20e78da9cbde28e5f62f5a0af65b43c57e3c8d91fc03b91f4e68c76b50c72abb688fb1ea9ac1cd6b56b20fb4a15af31ac06" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-91.json b/tests/assets/blocks/block-91.json deleted file mode 100644 index 1ea77e6..0000000 --- a/tests/assets/blocks/block-91.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "e4b2f0a35601baedb781ecf3f6a4ff32399746e622f5fe3b0b1bf1e07cc1d721", - "header": { - "parent_hash": "ecdc3aa912a6cdbee5943daca5d3e3dabb27e3c15c28c7ecff4ec31cc315a46e", - "state_root_hash": "ac558d19987eb158c4888f59b1727f67ad1ae84f79c7ac02cbfb7d5f4ce722b6", - "body_hash": "103dd1ad088ee0c1d63c1a39c60ffa0d96ca532accbddb5f9c1ff53658110743", - "random_bit": false, - "accumulated_seed": "1aee5820aa422a2f45371d54452370f9ad439d45969274a75d81ed3aa938f25c", - "era_end": null, - "timestamp": "2024-02-28T16:30:01.216Z", - "era_id": 9, - "height": 91, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01f25ce89c69849895737a413bec280be544364afb0ad24c6e90a2a232d3468ff26d3e123a0e989a3d467c0aceefd66d1ad8ff6f7f001ba7d4aeffb7d1b92a2f0e" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01d500d9ca68093ea3365ada9294e43ab96ece4e37ba093e02b9b57fd1a38ba61332a0110fdf0e990a395471baa3403809671c9c1436d3f2c6a0fb8fb7bb1a1a00" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "0110c43b69c79e3dc69eb7a21d0a6ba0182d5fd65ce6f825cc8afa0f78345b129b776595274e695190a74b8144966d628043e6c7b58ce4921d71771c8b919d7701" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01aa46fdd8c294f7666872f75d9bc5ff0a8e97730fadad9c3d5a0b77c3c2992726325f75ddf4634227d7cea7c9a7200e5405e2d37152f8edd27f8f6db74db1480c" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01b329256e5e66e490fbe70f0ac0db6480c056c0e890b9c718869d90babebac582d6671187223fe70d93899d2573f38588ba2b1e3cfb5557b495aa4dd2548b9502" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-92.json b/tests/assets/blocks/block-92.json deleted file mode 100644 index 0921087..0000000 --- a/tests/assets/blocks/block-92.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "21cef2a816d02c4913e508aec5ae1882237fa2bd3e3c492c0cac2db99af49cb8", - "header": { - "parent_hash": "e4b2f0a35601baedb781ecf3f6a4ff32399746e622f5fe3b0b1bf1e07cc1d721", - "state_root_hash": "ac558d19987eb158c4888f59b1727f67ad1ae84f79c7ac02cbfb7d5f4ce722b6", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": false, - "accumulated_seed": "1491b23d79d425fbfa47597b208b8596edc7f1b8628dcc2f5a3e125ab4051b10", - "era_end": null, - "timestamp": "2024-02-28T16:30:05.312Z", - "era_id": 9, - "height": 92, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "0104ef30fee739b5f2ad9b7fa4104b5e8df368c8203d6a5b3598a656946b191f4b0254acdaea268b133829f1704af90370c759af0cbbc6ba5f834eded62cb00e05" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0123a038fadbfc79d52bf42a136b0f3cabf363d1ed53c1c31f4cfa76a52f09d2d8fa934579006b5b377b155f41e96d5f413b93350c9d0dfdc16b94221bf0f68202" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01623998a7bb156be2b62dcebfb840daf1665e8dcdcd8b5c6ba3885f58e4a80eb7150a24ea06edb3a7a79fc9316657739f86cf8c130c64aee48bcead7648c1920f" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01508c72692541be678365a6541d8f8f21221d35ba63078dcd872699683e0d1240e34f432e75d6b7b97b59df05de6553d02ae26de9d71ebc371fbc44c064c9b80a" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01d05d3134f2c029d076ae23afae36c35a8887451ebfd0ae7ebf94138a7c59cbc76208d4c39077db57e117fca553a8fa310ccf660d65867f92c071070c9def2602" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-93.json b/tests/assets/blocks/block-93.json deleted file mode 100644 index 382000b..0000000 --- a/tests/assets/blocks/block-93.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "f26f134bd90fa027461967081b12befba221294b0ed584716a26508b27a865a1", - "header": { - "parent_hash": "21cef2a816d02c4913e508aec5ae1882237fa2bd3e3c492c0cac2db99af49cb8", - "state_root_hash": "ac558d19987eb158c4888f59b1727f67ad1ae84f79c7ac02cbfb7d5f4ce722b6", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": false, - "accumulated_seed": "f1cfcc5511f494fab1cfa45ec837088649109478e3700e7d74579e0bc44ef7be", - "era_end": null, - "timestamp": "2024-02-28T16:30:09.408Z", - "era_id": 9, - "height": 93, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01ce13c349194139c51613e5753df610ce4fa3363ee923cee10f0f5c5dd24e1c54b398210944e71771cea02ffa9c307e3141475c5ffa22396882020ea1b6351909" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01a4ed873bdcb9bf3bd6bccc3cb5de1dd40deddda324a0f636791e4c867ac3d53ea746191275c2f5583e3e704ccdfe8032b3c7d2e4e85421b2a56c55ed490b5a03" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01a5c8b925be9e254f1b285ec3b79277ccf4cdbc0289408ed8ec86e0e55da2678afde6269ce3ea4b8e42ba93b04751817b40f9b28ac616549f94c2f1bc206dad09" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "015832168f54e7b1982b41a62ff9630c942955b5e1c569c7460ccb112190b964b2d1ac95954b50f9734468f6c7bc12271c68583a54e68b037419b1cb93dab8ec0a" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01a966d271bdf0d50f6609280604269b974859dd4c650639a33891494ddcbe64320bade2c6d383fd6fea80a45d51451079d3e029b827d9d18c5eed0e56cef00e01" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-94.json b/tests/assets/blocks/block-94.json deleted file mode 100644 index 8ca4ada..0000000 --- a/tests/assets/blocks/block-94.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "978d3486fc6c80234af7a03386d46ce4c8857d086cd0582f2e4d23efaf361fbe", - "header": { - "parent_hash": "f26f134bd90fa027461967081b12befba221294b0ed584716a26508b27a865a1", - "state_root_hash": "ac558d19987eb158c4888f59b1727f67ad1ae84f79c7ac02cbfb7d5f4ce722b6", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": false, - "accumulated_seed": "76052189cb9144a5c870dd42e2568e0615d8f4de4b83f112738f5f6e61acfa0e", - "era_end": null, - "timestamp": "2024-02-28T16:30:13.504Z", - "era_id": 9, - "height": 94, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01a0a7622f8300ae2746144acd84a23c907102e4f1b380bedacecede282b4285be67c3fd33625cadb27b46417dafdb75af98e4fe1d0c42d443322b07555f532c0a" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "018a48539bd878ff43c717193af82e21af62d24e929428a6cfde84d14210d4c7979db4a87813b6287c78278e6da914e078c171eb1e3a74fe219d7e24e9048d2301" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01d36e0b83fe93a96a334ee6aaba861e3645071e71b84898fa5bba897a5050782461501e303e8bee5bb7ee73b92ebc2bbe708b6b111e160cf65f3ce72a48e0d50b" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01ab1f849be0b04b4f926ef7b9e33276b1809147902dab8c5a490f2ac10754de1c81e988c35d6a74a094835bde3f8691d327b3349d4b5b3abb55472b03fa38a302" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01dd11f0e1f0cf72129d47377fa3f3283d1dd1aa36b1e189f645500aee3ba80d645ddcf11c948b96a60ed414f5956bca276991a97d7087df96e9b3b31d69d43d0e" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-95.json b/tests/assets/blocks/block-95.json deleted file mode 100644 index f8c1a6a..0000000 --- a/tests/assets/blocks/block-95.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "3c036fd165403190e882ac617112cc7db0065b981aa83f7b646bbde15c0a235a", - "header": { - "parent_hash": "978d3486fc6c80234af7a03386d46ce4c8857d086cd0582f2e4d23efaf361fbe", - "state_root_hash": "ac558d19987eb158c4888f59b1727f67ad1ae84f79c7ac02cbfb7d5f4ce722b6", - "body_hash": "9795ec386b71cee3c0b831b582ba41a1021422065b238f915174324fa77f4772", - "random_bit": true, - "accumulated_seed": "8353a905c52f538abee2d1b114a278ff53ae13f2809984acba8688f9d4308407", - "era_end": null, - "timestamp": "2024-02-28T16:30:17.600Z", - "era_id": 9, - "height": 95, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01cc9343634d1704dde71c18306e637101fce86c007a11c5616bf2a74c1ab67c8f687085e9da76d08de97aadfcf631bd6e072311e838c338b30e28f38ea6796f0e" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "018ffc31232481d3c01ba4b70ff0d3537aac040e06f5e55e77dd41c080aea816e757908a6566942b7427667cd547059b9ffd862efba55c5b433a263d7dcb147d00" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01b098f29fc615cd34e6f52e07cf6f9db7e26739ba6908addc1b768b87de892a382eec9147728759207296f3652e022c750175c24401f67af3c512b93275f04300" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01235f330db05007d9a5d53a907fdecce9792895eeb2f57e07e0434e5166c9dc1a71183d10f715b68e13a81d67a6663cdcf73abae84f1e7bcb460ed1245754ad02" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01c046966b941659f4f3b65636b8160026198a2cf2bf98cac77517c3e73ee31adb3bf0d4cc288c29b1dd00ce32d77880e139a08430a7e08eacae2f58b2410ca50f" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-96.json b/tests/assets/blocks/block-96.json deleted file mode 100644 index b6e4854..0000000 --- a/tests/assets/blocks/block-96.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "9ffff15afc1c4b7f4a621541ef4f344dfcb68d61b3d6f6106f1e5c302954753c", - "header": { - "parent_hash": "3c036fd165403190e882ac617112cc7db0065b981aa83f7b646bbde15c0a235a", - "state_root_hash": "ac558d19987eb158c4888f59b1727f67ad1ae84f79c7ac02cbfb7d5f4ce722b6", - "body_hash": "3fe1e1ff39fa045bd498787a2d235145ee6518548f14c546838b5816a8f4adab", - "random_bit": false, - "accumulated_seed": "5ab20fa180713a5ca8aff1878db875ebdcc06500bc7ca6c836f781060c8d01b1", - "era_end": null, - "timestamp": "2024-02-28T16:30:21.696Z", - "era_id": 9, - "height": 96, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "016d1eb90d48b96103922717bf162cf57cf3db7a2760052cb2205fd0e2789b2a6fcc56e87d76941149736bb04bb0b031acacf32a11d2f9588bd86a0367146d1503" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01a349bdbf0c3ef49eb56efa507aa1afe7cea6df63be7bdbdef3d054ae0c71266c19b50fd60c9f2525d7cb41f5a5e5314b839c3eec8b02c5dfc7d8f27dbcaf3300" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01c124f9f4ce15803d155d2b95747c24fa1e21896c0f2ff6c5bd66fef366163f69ef5a1543fa729de46637096bc346feb537b16f212fb7f9ee1282ca01cc18ca07" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01158b038e1487cfce03f4be1161d928083ce401c8807460ed78fa13fd780fcb35d0fe9ee3dcdd0cedc97b94b6e9647e4ebdcb4f27cf32efcf6a82b44ae20d9a05" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "014666620f235a383b87bc73f301abf02f55b034f7e4df108bd668eae93fc2f9d59ffc2b4388ba235e5b74eca05be5b38feab40fb2d06d1e267e4c66c66f5d750f" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-97.json b/tests/assets/blocks/block-97.json deleted file mode 100644 index 7a55fb8..0000000 --- a/tests/assets/blocks/block-97.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "0885a02050e8e36c0c4a648cbdb08563b45948216ccdedc615659ab04e8dfcd3", - "header": { - "parent_hash": "9ffff15afc1c4b7f4a621541ef4f344dfcb68d61b3d6f6106f1e5c302954753c", - "state_root_hash": "ac558d19987eb158c4888f59b1727f67ad1ae84f79c7ac02cbfb7d5f4ce722b6", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": false, - "accumulated_seed": "0702f1ab088181c3aea2be2e51cc27cc5dbb22090b0a34874188f73aa7331907", - "era_end": null, - "timestamp": "2024-02-28T16:30:25.792Z", - "era_id": 9, - "height": 97, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "013ff0185c9b4162f73c2403b83a1d11f7550bd2762353a0d4b6c25d2ca5ca84cf8986669b3dcf2ec7d3dc0f981f0021acc55a9272bfa2a7f27e3de474805e310c" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0101768d98e5b3de6af860c720b5b5636ab4c2c443d8ef12f88117ca201cb331ed678dc638bc35b4f9ed143a92f61b38cc042a36432888ff875b147be70545b70d" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01c27d4f62383f01b3196e9333969901d95c9e16d531b490cc27736c7dac75b35c7e0dc07badd27c7d11c4c82bf8c20b44e442de4a1617f53b2380b09177d0a605" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "01b07cf7ae1730620b4870ce56b2cd97960a4eb3f88afa4f6aff58508b14399a632d50802c6488b0e8c754d8f5318e6e2f20b29fbbf738228bedbf5bba063bd702" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "019e4578712462a932584b35284ed9a23d8a77507f7ef65efff982f6c957533d79ce6da613132a062bf2c884c73898622e1b4025a72b4b2be60ec5d12d32b6a40c" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-98.json b/tests/assets/blocks/block-98.json deleted file mode 100644 index 5957e2a..0000000 --- a/tests/assets/blocks/block-98.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "hash": "dbc28b0a3382d4abfc4d64fa24014bff15aa5f9f044a92c8610065f1a1a06109", - "header": { - "parent_hash": "0885a02050e8e36c0c4a648cbdb08563b45948216ccdedc615659ab04e8dfcd3", - "state_root_hash": "ac558d19987eb158c4888f59b1727f67ad1ae84f79c7ac02cbfb7d5f4ce722b6", - "body_hash": "bcc608eac0c4f65ea803df48eaf819730a530f60d90348e93b28514a9f6a86e6", - "random_bit": true, - "accumulated_seed": "097bd7deac3a345d0ee675a70ab631b240bf2e6939df4ba94a50957660efc73e", - "era_end": null, - "timestamp": "2024-02-28T16:30:29.888Z", - "era_id": 9, - "height": 98, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "0120d7edd450bf3655ed621e7b5381a47524a9d102524c746847a0f8d07705f99453a5a85e4b336ddca22ff06f99bff032b532cdce3d0e696a9470fc03bb14ac0d" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "0176f00cd897dfdfa9d529cf7098fa4d8c8b21ada0212eb8e1171c61e29e85fdf1a741f59771ffabcf5ce0decc9e80e2ee0d1425d3a3fe16d5c4f3ffd6f8723309" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01a38783ae286ff2f8ebb58fc1b15f54485a361eef71747e0857eff66b1381c56252193a7a7d8b937894b5a3006f1911cf2a631b9c356ed6e7318005fb64f99102" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "017ca2d6bd7a3782d930b426e208b8d12042e534ea137ae7f7881b00bcb008c2715dc2322ae333336c7f4ad55f4e73cabb996c1047a9da9c852a4fa226b1378506" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "01a9978908297a164f6094cb92a19089c19e1e0aae230214f2d6ac728ebefe494fa52bbb5f33fb9d85b0b0c477612831a884ec8b1438c43de584563d55cc04a906" - } - ] -} \ No newline at end of file diff --git a/tests/assets/blocks/block-99.json b/tests/assets/blocks/block-99.json deleted file mode 100644 index a1eb54a..0000000 --- a/tests/assets/blocks/block-99.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "hash": "120b4a179c9f54975e57e0c40390c0a6c6875fcf017e6c0f8a46ca4e0feedc41", - "header": { - "parent_hash": "dbc28b0a3382d4abfc4d64fa24014bff15aa5f9f044a92c8610065f1a1a06109", - "state_root_hash": "35c667bc6cb1600a180c3c1c19542fe95f7a4def19527dfc37e8ce035c3b5707", - "body_hash": "803bda5c7b232fd5e25a203b95c6d269708d17528775603f3c597ac159be2354", - "random_bit": false, - "accumulated_seed": "41be7fb7cd840e787d8f43796e5b41819235d9556ebbf96034f03ee8a1ef1a64", - "era_end": { - "era_report": { - "equivocators": [], - "rewards": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "amount": 1999999999990 - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "amount": 1999999999990 - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "amount": 2000000000000 - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "amount": 2000000000000 - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "amount": 2000000000000 - } - ], - "inactive_validators": [] - }, - "next_era_validator_weights": [ - { - "validator": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "weight": "2079999999999600010" - }, - { - "validator": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "weight": "2079999999999600012" - }, - { - "validator": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "weight": "2080000000000000022" - }, - { - "validator": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "weight": "2080000000000000026" - }, - { - "validator": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "weight": "2080000000000000024" - } - ] - }, - "timestamp": "2024-02-28T16:30:33.984Z", - "era_id": 9, - "height": 99, - "protocol_version": "1.0.0" - }, - "body": { - "proposer": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "deploy_hashes": [], - "transfer_hashes": [] - }, - "proofs": [ - { - "public_key": "016c07fa407f46f7381bb424fbe18c320e8184a7d3e4360acb38d2d58172a9028a", - "signature": "01bdcd625b62501174098a267fefe6bf598dd3651302daf1e9a319cb5af71258b7d45e6216749b7461042cd827961cfa3723414e5ecca407b1c4631d5dd439c70d" - }, - { - "public_key": "01706f36a2ebfccea720b49a6424c196cf0bb7aa929f39842975865848b87773ef", - "signature": "01ea5638bd8310de58663239f43d15228fae37f3b1b50491327abbcdc6991a324be47244015f2fcada59ba07a91566b1da271db235256284427f5ef7e515af2d07" - }, - { - "public_key": "018b2bda41097182c387b72c41a490984aad26a64bc75cd926dee7f0b8d82b4e43", - "signature": "01cf1c3de35cfaefd2db23d1320e4f4eec3c5419cbd55faf2ad6fb6433d4bab4039fc5b6e440c0076b087ba2aceb8b8d3bdc17fbd9650192bc7d2ad993cac8710a" - }, - { - "public_key": "019b5bd3e7f3c2ba280bb264928ba0d18aab832eb92714d9a455e7737e976c8a41", - "signature": "010bfc8c544baa6c2228125b0b052e8c85b71c2e9367d736f03199361fae702a9211963caa72264e37e71908e8be83efbd817a3510862bb681b267ddcec8271a0e" - }, - { - "public_key": "01f0aaadbf1ef00a83e161eaccadaf4e499d9730a09e8979cb9e8c2d3fc4d8b6f7", - "signature": "013fc767eed4475b302d77012c37693712bbd6a391833e3f59ffae481d65f8ef1db8fdeb06c6fa8237788208640c1c1de8f44aa0fbe1d30cb7b1609f7d3ed96205" - } - ] -} \ No newline at end of file From 081588011ae69e065a2b6ed2832a169830b23d6c Mon Sep 17 00:00:00 2001 From: Avi Dessauer Date: Wed, 18 Sep 2024 14:30:41 -0700 Subject: [PATCH 11/12] Remove Trie and PointerBlock --- src/merkle_proof.rs | 270 +------------------------------------------- 1 file changed, 1 insertion(+), 269 deletions(-) diff --git a/src/merkle_proof.rs b/src/merkle_proof.rs index 857c43b..c5bd55c 100644 --- a/src/merkle_proof.rs +++ b/src/merkle_proof.rs @@ -1,281 +1,13 @@ // See https://github.com/casper-network/casper-node/blob/76ea7104cda02fcf1bd6edb686fd00b162dabde8/execution_engine/src/storage/trie/mod.rs // and https://github.com/casper-network/casper-node/blob/76ea7104cda02fcf1bd6edb686fd00b162dabde8/execution_engine/src/storage/trie/merkle_proof.rs -use core::mem::MaybeUninit; - -use std::{boxed::Box, string::String, vec::Vec}; use casper_storage::global_state::trie_store::operations::compute_state_hash; pub use casper_types::global_state::TrieMerkleProofStep; -use casper_types::{ - bytesrepr::{self, Bytes, FromBytes, ToBytes, U8_SERIALIZED_LENGTH}, - CLValueError, Digest, Key, StoredValue, -}; -#[cfg(test)] -use proptest::prelude::*; - -const DIGEST_LENGTH: usize = 32; -const RADIX: usize = 256; +use casper_types::{bytesrepr, CLValueError, Digest, Key, StoredValue}; pub type TrieMerkleProof = casper_types::global_state::TrieMerkleProof; -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum Pointer { - LeafPointer(Digest), - NodePointer(Digest), -} - -impl Pointer { - pub fn hash(&self) -> &Digest { - match self { - Pointer::LeafPointer(hash) => hash, - Pointer::NodePointer(hash) => hash, - } - } -} - -#[cfg(test)] -impl Arbitrary for Pointer { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - prop_oneof![ - any::<[u8; DIGEST_LENGTH]>().prop_map(|h| Pointer::LeafPointer(Digest::from_raw(h))), - any::<[u8; DIGEST_LENGTH]>().prop_map(|h| Pointer::NodePointer(Digest::from_raw(h))), - ] - .boxed() - } -} - -impl ToBytes for Pointer { - fn to_bytes(&self) -> Result, bytesrepr::Error> { - let mut ret = bytesrepr::unchecked_allocate_buffer(self); - self.write_bytes(&mut ret)?; - Ok(ret) - } - - fn serialized_length(&self) -> usize { - U8_SERIALIZED_LENGTH + DIGEST_LENGTH - } - - fn write_bytes(&self, writer: &mut Vec) -> Result<(), bytesrepr::Error> { - let tag: u8 = match self { - Pointer::LeafPointer(_) => 0, - Pointer::NodePointer(_) => 1, - }; - writer.push(tag); - writer.extend_from_slice(self.hash().as_ref()); - Ok(()) - } -} - -impl FromBytes for Pointer { - fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { - let (tag, rem) = u8::from_bytes(bytes)?; - match tag { - 0 => { - let (hash, rem) = Digest::from_bytes(rem)?; - Ok((Pointer::LeafPointer(hash), rem)) - } - 1 => { - let (hash, rem) = Digest::from_bytes(rem)?; - Ok((Pointer::NodePointer(hash), rem)) - } - _ => Err(bytesrepr::Error::Formatting), - } - } -} - -pub type PointerBlockValue = Option; - -pub type PointerBlockArray = [PointerBlockValue; RADIX]; - -#[derive(Debug, PartialEq, Eq, Clone)] -#[cfg_attr(test, derive(proptest_derive::Arbitrary))] -pub struct PointerBlock(PointerBlockArray); - -impl Default for PointerBlock { - fn default() -> Self { - Self::new() - } -} - -impl PointerBlock { - pub fn new() -> Self { - PointerBlock([ - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, - ]) - } - - pub fn from_indexed_pointers(indexed_pointers: &[(u8, Pointer)]) -> Self { - let PointerBlock(mut pointer_block_array) = PointerBlock::new(); - for (idx, ptr) in indexed_pointers.iter() { - pointer_block_array[*idx as usize] = Some(ptr.clone()); - } - PointerBlock(pointer_block_array) - } -} - -impl ToBytes for PointerBlock { - fn to_bytes(&self) -> Result, bytesrepr::Error> { - let mut result = bytesrepr::allocate_buffer(self)?; - for pointer in self.0.iter() { - result.append(&mut pointer.to_bytes()?); - } - Ok(result) - } - - fn serialized_length(&self) -> usize { - self.0.iter().map(ToBytes::serialized_length).sum() - } - - fn write_bytes(&self, writer: &mut Vec) -> Result<(), bytesrepr::Error> { - for pointer in self.0.iter() { - pointer.write_bytes(writer)?; - } - Ok(()) - } -} - -impl FromBytes for PointerBlock { - fn from_bytes(mut bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> { - let pointer_block_array = { - // With MaybeUninit here we can avoid default initialization of result array below. - let mut result: MaybeUninit = MaybeUninit::uninit(); - let result_ptr = result.as_mut_ptr() as *mut PointerBlockValue; - for i in 0..RADIX { - let (t, remainder) = match FromBytes::from_bytes(bytes) { - Ok(success) => success, - Err(error) => { - for j in 0..i { - unsafe { result_ptr.add(j).drop_in_place() } - } - return Err(error); - } - }; - unsafe { result_ptr.add(i).write(t) }; - bytes = remainder; - } - unsafe { result.assume_init() } - }; - Ok((PointerBlock(pointer_block_array), bytes)) - } -} - -// FIXME not sure if this is used anywhere? -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum Trie { - Leaf { key: Key, value: StoredValue }, - Node { pointer_block: Box }, - Extension { affix: Bytes, pointer: Pointer }, -} - -impl Trie { - pub fn trie_hash(&self) -> Result { - self.to_bytes() - .map(|bytes| Digest::hash_into_chunks_if_necessary(&bytes)) - } - - pub fn node(indexed_pointers: &[(u8, Pointer)]) -> Self { - let pointer_block = PointerBlock::from_indexed_pointers(indexed_pointers); - let pointer_block = Box::new(pointer_block); - Trie::Node { pointer_block } - } - - pub fn extension(affix: Vec, pointer: Pointer) -> Self { - Trie::Extension { - affix: affix.into(), - pointer, - } - } -} - -#[cfg(test)] -impl Arbitrary for Trie { - type Parameters = (); - type Strategy = BoxedStrategy; - - fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy { - prop_oneof![ - ( - casper_types::gens::key_arb(), - casper_types::gens::stored_value_arb() - ) - .prop_map(|(key, value)| Trie::Leaf { key, value }), - any::().prop_map(|pointer_block| Trie::Node { - pointer_block: Box::new(pointer_block) - }), - ( - proptest::collection::vec(any::(), 0..32), - any::() - ) - .prop_map(|(affix, pointer)| Trie::Extension { - affix: affix.into(), - pointer, - }) - ] - .boxed() - } -} - -impl ToBytes for Trie { - fn to_bytes(&self) -> Result, bytesrepr::Error> { - let mut ret = bytesrepr::allocate_buffer(self)?; - self.write_bytes(&mut ret)?; - Ok(ret) - } - - fn serialized_length(&self) -> usize { - U8_SERIALIZED_LENGTH - + match self { - Trie::Leaf { key, value } => key.serialized_length() + value.serialized_length(), - Trie::Node { pointer_block } => pointer_block.serialized_length(), - Trie::Extension { affix, pointer } => { - affix.serialized_length() + pointer.serialized_length() - } - } - } - - fn write_bytes(&self, writer: &mut Vec) -> Result<(), bytesrepr::Error> { - match self { - Trie::Leaf { key, value } => { - writer.push(0u8); - key.write_bytes(writer)?; - value.write_bytes(writer)?; - } - Trie::Node { pointer_block } => { - writer.push(1u8); - pointer_block.write_bytes(writer)? - } - Trie::Extension { affix, pointer } => { - writer.push(2u8); - affix.write_bytes(writer)?; - pointer.write_bytes(writer)?; - } - } - Ok(()) - } -} - #[derive(Debug, PartialEq, Eq)] pub enum ValidationError { PathLengthDifferentThanProofLessOne, From e0e8a58ff081d9810f40b30f480013987182e956 Mon Sep 17 00:00:00 2001 From: Avi Dessauer Date: Mon, 23 Sep 2024 10:57:25 -0700 Subject: [PATCH 12/12] Address review, check claimed hashes against computed hashes --- src/kernel.rs | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/kernel.rs b/src/kernel.rs index 6e724c3..cb5b614 100644 --- a/src/kernel.rs +++ b/src/kernel.rs @@ -1,4 +1,4 @@ -use casper_types::{EraId, JsonBlockWithSignatures, PublicKey, U512}; +use casper_types::{BlockBody, EraId, JsonBlockWithSignatures, PublicKey, U512}; use std::collections::BTreeMap; pub struct EraInfo { @@ -15,18 +15,14 @@ pub enum BlockSignaturesValidationError { }, BogusValidator(PublicKey), SignatureVerificationError, + BlockHashMismatch, + BlockBodyHashMismatch, InsufficientWeight { bad_signature_weight: U512, total_weight: U512, }, } -// impl From for BlockSignaturesValidationError { -// fn from(signature_verification_error: SignatureVerificationError) -> Self { -// BlockSignaturesValidationError::SignatureVerificationError(signature_verification_error) -// } -// } - impl EraInfo { pub fn new(era_id: EraId, validator_weights: BTreeMap) -> Self { let total_weight = validator_weights @@ -55,8 +51,32 @@ impl EraInfo { block_header_era_id: block.era_id(), }); } + + let block_header = block.clone_header(); + let block_body = block.clone_body(); + + // The OnceCell in these will not be initialized prior to calling these hash + // methods since the `OnceCell` is not serialized upstream. + let computed_block_hash = block_header.block_hash(); + let computed_block_body_hash = match block_body { + BlockBody::V1(block_body_v1) => block_body_v1.hash(), + BlockBody::V2(block_body_v2) => block_body_v2.hash(), + }; + + let claimed_block_hash = block.hash(); + let claimed_block_body_hash = block.body_hash(); + + if computed_block_hash != *claimed_block_hash { + return Err(BlockSignaturesValidationError::BlockHashMismatch); + } + + if computed_block_body_hash != *claimed_block_body_hash { + return Err(BlockSignaturesValidationError::BlockBodyHashMismatch); + } + // See: https://github.com/casper-network/casper-node/blob/8ca9001dabba0dae95f92ad8c54eddd163200b5d/node/src/types/block.rs#L2465-L2474 - let mut signature_data = block.hash().inner().into_vec(); + let mut signature_data = computed_block_hash.inner().into_vec(); + signature_data.extend_from_slice(&block.era_id().to_le_bytes()); for (public_key, signature) in proofs.iter() { if let Some(validator_weight) = self.validator_weights.get(public_key) {