Merge branch 'blockchain' into cache

This commit is contained in:
debris 2015-12-13 17:50:51 +01:00
commit 96298299e3
3 changed files with 73 additions and 33 deletions

View File

@ -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<Bytes> { 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<Bytes>,
}
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<D>(decoder: &D) -> Result<Self, DecoderError> 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<E>(&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.
})
}
}

View File

@ -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() {

View File

@ -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<Address>,
value: U256,
data: Vec<u8>,
data: Bytes,
}
impl Transaction {