diff --git a/src/blockheader.rs b/src/blockheader.rs index a11b83ca5..c57171f65 100644 --- a/src/blockheader.rs +++ b/src/blockheader.rs @@ -1,4 +1,5 @@ use util::hash::*; +use util::bytes::*; use util::uint::*; use util::rlp::*; use util::sha3; @@ -23,7 +24,7 @@ impl<'a> BlockView<'a> { pub fn parent_hash(&self) -> H256 { self.rlp.val_at(0) } pub fn uncles_hash(&self) -> H256 { self.rlp.val_at(1) } - pub fn coinbase(&self) -> Address { self.rlp.val_at(2) } + pub fn author(&self) -> Address { self.rlp.val_at(2) } pub fn state_root(&self) -> H256 { self.rlp.val_at(3) } pub fn transactions_root(&self) -> H256 { self.rlp.val_at(4) } pub fn receipts_root(&self) -> H256 { self.rlp.val_at(5) } @@ -31,10 +32,10 @@ impl<'a> BlockView<'a> { pub fn difficulty(&self) -> U256 { self.rlp.val_at(7) } pub fn number(&self) -> U256 { self.rlp.val_at(8) } pub fn gas_limit(&self) -> U256 { self.rlp.val_at(9) } - pub fn gas_usd(&self) -> U256 { self.rlp.val_at(10) } + pub fn gas_used(&self) -> U256 { self.rlp.val_at(10) } pub fn timestamp(&self) -> U256 { self.rlp.val_at(11) } - pub fn mix_hash(&self) -> H256 { self.rlp.val_at(12) } - pub fn nonce(&self) -> H64 { self.rlp.val_at(13) } + pub fn extra_data(&self) -> Bytes { self.rlp.val_at(12) } + pub fn seal(&self) -> Vec { self.rlp.val_at(13) } } impl<'a> sha3::Hashable for BlockView<'a> { @@ -43,33 +44,64 @@ impl<'a> sha3::Hashable for BlockView<'a> { } } -/// Data structure represening block header -/// similar to cpp-ethereum's BlockInfo -pub struct BlockHeader { +pub static ZERO_ADDRESS: Address = Address([0x00; 20]); +pub static ZERO_H256: H256 = H256([0x00; 32]); +pub static ZERO_LOGBLOOM: LogBloom = H2048([0x00; 256]); + +pub type LogBloom = H2048; + +#[derive(Debug)] +pub struct Header { parent_hash: H256, - uncles_hash: H256, - coinbase: Address, - state_root: H256, - transactions_root: H256, - receipts_root: H256, - log_bloom: H2048, - difficulty: U256, - number: U256, - gas_limit: U256, - gas_used: U256, timestamp: U256, - mix_hash: H256, - nonce: H64 + number: U256, + author: Address, + + transactions_root: H256, + uncles_hash: H256, + extra_data: Bytes, + + state_root: H256, + receipts_root: H256, + log_bloom: LogBloom, + gas_used: U256, + gas_limit: U256, + + difficulty: U256, + seal: Vec, } -impl Decodable for BlockHeader { +impl Header { + pub fn new() -> Header { + Header { + parent_hash: ZERO_H256.clone(), + timestamp: BAD_U256.clone(), + number: ZERO_U256.clone(), + author: ZERO_ADDRESS.clone(), + + transactions_root: ZERO_H256.clone(), + uncles_hash: ZERO_H256.clone(), + extra_data: vec![], + + state_root: ZERO_H256.clone(), + receipts_root: ZERO_H256.clone(), + log_bloom: ZERO_LOGBLOOM.clone(), + gas_used: ZERO_U256.clone(), + gas_limit: ZERO_U256.clone(), + + difficulty: ZERO_U256.clone(), + seal: vec![], + } + } +} + +impl Decodable for Header { fn decode(decoder: &D) -> Result where D: Decoder { decoder.read_list(| d | { - // return an error if d != 14 - let blockheader = BlockHeader { + let blockheader = Header { parent_hash: try!(Decodable::decode(&d[0])), uncles_hash: try!(Decodable::decode(&d[1])), - coinbase: try!(Decodable::decode(&d[2])), + author: try!(Decodable::decode(&d[2])), state_root: try!(Decodable::decode(&d[3])), transactions_root: try!(Decodable::decode(&d[4])), receipts_root: try!(Decodable::decode(&d[5])), @@ -79,20 +111,21 @@ impl Decodable for BlockHeader { gas_limit: try!(Decodable::decode(&d[9])), gas_used: try!(Decodable::decode(&d[10])), timestamp: try!(Decodable::decode(&d[11])), - mix_hash: try!(Decodable::decode(&d[12])), - nonce: try!(Decodable::decode(&d[13])) + extra_data: try!(Decodable::decode(&d[12])), + seal: vec![], }; + // TODO: fill blockheader.seal with (raw) list items index 12..) Ok(blockheader) }) } } -impl Encodable for BlockHeader { +impl Encodable for Header { fn encode(&self, encoder: &mut E) where E: Encoder { encoder.emit_list(| e | { self.parent_hash.encode(e); self.uncles_hash.encode(e); - self.coinbase.encode(e); + self.author.encode(e); self.state_root.encode(e); self.transactions_root.encode(e); self.receipts_root.encode(e); @@ -102,8 +135,8 @@ impl Encodable for BlockHeader { self.gas_limit.encode(e); self.gas_used.encode(e); self.timestamp.encode(e); - self.mix_hash.encode(e); - self.nonce.encode(e); + self.extra_data.encode(e); + // TODO: emit raw seal items. }) } } diff --git a/src/lib.rs b/src/lib.rs index d4096cfcf..bd6e5c33f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -69,18 +69,25 @@ //! sudo ldconfig //! ``` -#[macro_use] +#[macro_use] extern crate log; extern crate rustc_serialize; extern crate flate2; -extern crate ethcore_util as util; +extern crate env_logger; #[cfg(feature = "jit" )] extern crate evmjit; +extern crate ethcore_util as util; + +//use util::error::*; +pub use util::hash::*; +pub use util::uint::*; +pub use util::bytes::*; pub mod account; pub mod block; pub mod blockchain; +pub mod state; pub mod blockheader; pub mod transaction; pub mod extras; @@ -92,7 +99,6 @@ pub mod importroute; pub mod networkparams; pub mod denominations; -pub mod state; #[test] fn it_works() { diff --git a/src/transaction.rs b/src/transaction.rs index e8905fd3c..fc2159c8a 100644 --- a/src/transaction.rs +++ b/src/transaction.rs @@ -1,4 +1,5 @@ use util::hash::*; +use util::bytes::*; use util::uint::*; use util::rlp::*; @@ -8,7 +9,7 @@ pub struct Transaction { gas: U256, receive_address: Option
, value: U256, - data: Vec, + data: Bytes, } impl Transaction {