diff --git a/Cargo.toml b/Cargo.toml index b0cae8dce..55e9ca79c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ log = "0.3" env_logger = "0.3" ethcore-util = "0.1.0" evmjit = { path = "rust-evmjit", optional = true } +rustc-serialize = "0.3" [features] jit = ["evmjit"] diff --git a/src/account.rs b/src/account.rs index b64b8ee93..250716ce5 100644 --- a/src/account.rs +++ b/src/account.rs @@ -286,6 +286,8 @@ fn rlpio() { #[test] fn new_account() { + use rustc_serialize::hex::ToHex; + let a = Account::new(U256::from(69u8), U256::from(0u8), HashMap::new(), Bytes::new()); assert_eq!(a.rlp().to_hex(), "f8448045a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"); assert_eq!(a.balance(), &U256::from(69u8)); @@ -296,6 +298,8 @@ fn new_account() { #[test] fn create_account() { + use rustc_serialize::hex::ToHex; + let a = Account::new(U256::from(69u8), U256::from(0u8), HashMap::new(), Bytes::new()); assert_eq!(a.rlp().to_hex(), "f8448045a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"); } diff --git a/src/blockheader.rs b/src/blockheader.rs index 566a77f69..2681c55e7 100644 --- a/src/blockheader.rs +++ b/src/blockheader.rs @@ -56,26 +56,30 @@ impl Header { impl Decodable for Header { fn decode(decoder: &D) -> Result where D: Decoder { - decoder.read_list(| d | { - let blockheader = Header { - parent_hash: try!(Decodable::decode(&d[0])), - uncles_hash: try!(Decodable::decode(&d[1])), - 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])), - log_bloom: try!(Decodable::decode(&d[6])), - difficulty: try!(Decodable::decode(&d[7])), - number: try!(Decodable::decode(&d[8])), - gas_limit: try!(Decodable::decode(&d[9])), - gas_used: try!(Decodable::decode(&d[10])), - timestamp: try!(Decodable::decode(&d[11])), - extra_data: try!(Decodable::decode(&d[12])), - seal: vec![], - }; - // TODO: fill blockheader.seal with (raw) list items index 12..) - Ok(blockheader) - }) + let d = try!(decoder.as_list()); + + let mut blockheader = Header { + parent_hash: try!(Decodable::decode(&d[0])), + uncles_hash: try!(Decodable::decode(&d[1])), + 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])), + log_bloom: try!(Decodable::decode(&d[6])), + difficulty: try!(Decodable::decode(&d[7])), + number: try!(Decodable::decode(&d[8])), + gas_limit: try!(Decodable::decode(&d[9])), + gas_used: try!(Decodable::decode(&d[10])), + timestamp: try!(Decodable::decode(&d[11])), + extra_data: try!(Decodable::decode(&d[12])), + seal: vec![], + }; + + for i in 13..d.len() { + blockheader.seal.push(try!(Decodable::decode(&d[i]))); + } + + Ok(blockheader) } } @@ -95,7 +99,10 @@ impl Encodable for Header { self.gas_used.encode(e); self.timestamp.encode(e); self.extra_data.encode(e); - // TODO: emit raw seal items. + + for b in self.seal.iter() { + b.encode(e); + } }) } } diff --git a/src/lib.rs b/src/lib.rs index 8a562cec2..d7f354423 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -72,6 +72,7 @@ #[macro_use] extern crate log; extern crate env_logger; +extern crate rustc_serialize; #[cfg(feature = "jit" )] extern crate evmjit; extern crate ethcore_util as util; diff --git a/src/transaction.rs b/src/transaction.rs index fc2159c8a..4fbd9588b 100644 --- a/src/transaction.rs +++ b/src/transaction.rs @@ -37,17 +37,18 @@ impl Encodable for Transaction { impl Decodable for Transaction { fn decode(decoder: &D) -> Result where D: Decoder { - decoder.read_list(| d | { - let transaction = Transaction { - nonce: try!(Decodable::decode(&d[0])), - gas_price: try!(Decodable::decode(&d[1])), - gas: try!(Decodable::decode(&d[2])), - receive_address: try!(Decodable::decode(&d[3])), - value: try!(Decodable::decode(&d[4])), - data: try!(Decodable::decode(&d[5])), - }; - Ok(transaction) - }) + let d = try!(decoder.as_list()); + + let transaction = Transaction { + nonce: try!(Decodable::decode(&d[0])), + gas_price: try!(Decodable::decode(&d[1])), + gas: try!(Decodable::decode(&d[2])), + receive_address: try!(Decodable::decode(&d[3])), + value: try!(Decodable::decode(&d[4])), + data: try!(Decodable::decode(&d[5])), + }; + + Ok(transaction) } }