From 7a0dfec115c85c683d10ef166e5f25bd094a6e85 Mon Sep 17 00:00:00 2001 From: debris Date: Thu, 17 Mar 2016 14:03:53 +0100 Subject: [PATCH] added genesis method to ethjson blockchain --- json/src/blockchain/blockchain.rs | 16 ++++++++++ json/src/blockchain/header.rs | 49 +++++++++++++++++++++---------- json/src/hash.rs | 2 +- json/src/spec/genesis.rs | 29 +++++++++++------- json/src/uint.rs | 2 +- 5 files changed, 70 insertions(+), 28 deletions(-) diff --git a/json/src/blockchain/blockchain.rs b/json/src/blockchain/blockchain.rs index 8c67799e1..75d321a4d 100644 --- a/json/src/blockchain/blockchain.rs +++ b/json/src/blockchain/blockchain.rs @@ -20,6 +20,7 @@ use bytes::Bytes; use blockchain::state::State; use blockchain::header::Header; use blockchain::block::Block; +use spec::Genesis; /// Blockchain deserialization. #[derive(Debug, PartialEq, Deserialize)] @@ -45,6 +46,21 @@ impl BlockChain { pub fn blocks_rlp(&self) -> Vec> { self.blocks.iter().map(|block| block.rlp()).collect() } + + /// Returns spec compatible genesis struct. + pub fn genesis(&self) -> Genesis { + Genesis { + nonce: Some(self.genesis_block.nonce.clone()), + mix_hash: Some(self.genesis_block.mix_hash.clone()), + seal_fields: None, + seal_rlp: None, + difficulty: self.genesis_block.difficulty, + author: self.genesis_block.author.clone(), + timestamp: self.genesis_block.timestamp, + parent_hash: self.genesis_block.parent_hash.clone(), + gas_limit: self.genesis_block.gas_limit, + } + } } #[cfg(test)] diff --git a/json/src/blockchain/header.rs b/json/src/blockchain/header.rs index e97039213..f4ebee01b 100644 --- a/json/src/blockchain/header.rs +++ b/json/src/blockchain/header.rs @@ -23,31 +23,48 @@ use bytes::Bytes; /// Blockchain test header deserializer. #[derive(Debug, PartialEq, Deserialize)] pub struct Header { - bloom: Bloom, - coinbase: Address, - difficulty: Uint, + /// Blocks bloom. + pub bloom: Bloom, + /// Blocks author. + #[serde(rename="coinbase")] + pub author: Address, + /// Difficulty. + pub difficulty: Uint, #[serde(rename="extraData")] - extra_data: Bytes, + /// Extra data. + pub extra_data: Bytes, + /// Gas limit. #[serde(rename="gasLimit")] - gas_limit: Uint, + pub gas_limit: Uint, + /// Gas used. #[serde(rename="gasUsed")] - gas_used: Uint, - hash: H256, + pub gas_used: Uint, + /// Hash. + pub hash: H256, #[serde(rename="mixHash")] - mix_hash: H256, - nonce: H64, - number: Uint, + /// Mix hash. + pub mix_hash: H256, + /// Seal nonce. + pub nonce: H64, + /// Block number. + pub number: Uint, + /// Parent hash. #[serde(rename="parentHash")] - parent_hash: H256, + pub parent_hash: H256, + /// Receipt root. #[serde(rename="receiptTrie")] - receipt_trie: H256, + pub receipt_root: H256, + /// State root. #[serde(rename="stateRoot")] - state_root: H256, - timestamp: Uint, + pub state_root: H256, + /// Timestamp. + pub timestamp: Uint, + /// Transactions root. #[serde(rename="transactionsTrie")] - transactions_trie: H256, + pub transactions_root: H256, + /// Uncles hash. #[serde(rename="uncleHash")] - uncle_hash: H256, + pub uncles_hash: H256, } #[cfg(test)] diff --git a/json/src/hash.rs b/json/src/hash.rs index bece68011..c555b6266 100644 --- a/json/src/hash.rs +++ b/json/src/hash.rs @@ -25,7 +25,7 @@ use util::hash::{H64 as Hash64, Address as Hash160, H256 as Hash256, H2048 as Ha macro_rules! impl_hash { ($name: ident, $inner: ident) => { /// Lenient hash json deserialization for test json files. - #[derive(Default, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] + #[derive(Default, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Clone)] pub struct $name($inner); impl Into<$inner> for $name { diff --git a/json/src/spec/genesis.rs b/json/src/spec/genesis.rs index 4c66a9e35..a8b5b30e3 100644 --- a/json/src/spec/genesis.rs +++ b/json/src/spec/genesis.rs @@ -17,30 +17,39 @@ //! Spec genesis deserialization. use uint::Uint; -use hash::{Address, H256}; +use hash::{H64, Address, H256}; use bytes::Bytes; /// Spec genesis. #[derive(Debug, PartialEq, Deserialize)] pub struct Genesis { // old seal - nonce: Option, + /// Seal nonce. + pub nonce: Option, #[serde(rename="mixHash")] - mix_hash: Option, + /// Seal mix hash. + pub mix_hash: Option, // new seal // TODO: consider moving it to a separate seal structure #[serde(rename="sealFields")] - seal_fields: Option, + /// Number of seal fields. + pub seal_fields: Option, #[serde(rename="sealRlp")] - seal_rlp: Option, + /// Seal rlp. + pub seal_rlp: Option, - difficulty: Uint, - author: Address, - timestamp: Uint, + /// Difficulty. + pub difficulty: Uint, + /// Block author. + pub author: Address, + /// Block timestamp. + pub timestamp: Uint, + /// Parent hash. #[serde(rename="parentHash")] - parent_hash: H256, + pub parent_hash: H256, + /// Gas limit. #[serde(rename="gasLimit")] - gas_limit: Uint, + pub gas_limit: Uint, } #[cfg(test)] diff --git a/json/src/uint.rs b/json/src/uint.rs index 41e717277..2d24c3f7e 100644 --- a/json/src/uint.rs +++ b/json/src/uint.rs @@ -22,7 +22,7 @@ use serde::de::Visitor; use util::numbers::{U256, Uint as U}; /// Lenient uint json deserialization for test json files. -#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] pub struct Uint(U256); impl Into for Uint {