diff --git a/ethcore/Cargo.toml b/ethcore/Cargo.toml index d9c80f3a3..be7652e17 100644 --- a/ethcore/Cargo.toml +++ b/ethcore/Cargo.toml @@ -10,12 +10,10 @@ authors = ["Ethcore "] log = "0.3" env_logger = "0.3" rustc-serialize = "0.3" -flate2 = "0.2" rocksdb = "0.3" heapsize = "0.2.0" rust-crypto = "0.2.34" time = "0.1" -#interpolate_idents = { git = "https://github.com/SkylerLipthay/interpolate_idents" } ethcore-util = { path = "../util" } evmjit = { path = "../evmjit", optional = true } ethash = { path = "../ethash" } diff --git a/ethcore/src/account.rs b/ethcore/src/account.rs index ab7ad1e53..0d535f7ce 100644 --- a/ethcore/src/account.rs +++ b/ethcore/src/account.rs @@ -21,6 +21,7 @@ pub struct Account { } impl Account { + #[cfg(test)] /// General constructor. pub fn new(balance: U256, nonce: U256, storage: HashMap, code: Bytes) -> Account { Account { @@ -83,15 +84,8 @@ impl Account { } } - /// Reset this account to the status of a not-yet-initialised contract. - /// NOTE: Account should have `init_code()` called on it later. - pub fn reset_code(&mut self) { - self.code_hash = None; - self.code_cache = vec![]; - } - /// Set this account's code to the given code. - /// NOTE: Account should have been created with `new_contract()` or have `reset_code()` called on it. + /// NOTE: Account should have been created with `new_contract()` pub fn init_code(&mut self, code: Bytes) { assert!(self.code_hash.is_none()); self.code_cache = code; diff --git a/ethcore/src/env_info.rs b/ethcore/src/env_info.rs index 8b037036e..7c0516d2a 100644 --- a/ethcore/src/env_info.rs +++ b/ethcore/src/env_info.rs @@ -24,13 +24,6 @@ pub struct EnvInfo { pub gas_used: U256, } -impl EnvInfo { - /// Create empty env_info initialized with zeros - pub fn new() -> EnvInfo { - EnvInfo::default() - } -} - impl Default for EnvInfo { fn default() -> Self { EnvInfo { @@ -97,4 +90,4 @@ r#" assert_eq!(default_env_info.difficulty, x!(0)); } -} \ No newline at end of file +} diff --git a/ethcore/src/executive.rs b/ethcore/src/executive.rs index 1471bdca3..b67b71306 100644 --- a/ethcore/src/executive.rs +++ b/ethcore/src/executive.rs @@ -399,7 +399,7 @@ mod tests { let mut state_result = get_temp_state(); let mut state = state_result.reference_mut(); state.add_balance(&sender, &U256::from(0x100u64)); - let info = EnvInfo::new(); + let info = EnvInfo::default(); let engine = TestEngine::new(0, factory); let mut substate = Substate::new(); @@ -458,7 +458,7 @@ mod tests { let mut state_result = get_temp_state(); let mut state = state_result.reference_mut(); state.add_balance(&sender, &U256::from(100)); - let info = EnvInfo::new(); + let info = EnvInfo::default(); let engine = TestEngine::new(0, factory); let mut substate = Substate::new(); @@ -512,7 +512,7 @@ mod tests { let mut state_result = get_temp_state(); let mut state = state_result.reference_mut(); state.add_balance(&sender, &U256::from(100)); - let info = EnvInfo::new(); + let info = EnvInfo::default(); let engine = TestEngine::new(0, factory); let mut substate = Substate::new(); @@ -564,7 +564,7 @@ mod tests { let mut state_result = get_temp_state(); let mut state = state_result.reference_mut(); state.add_balance(&sender, &U256::from(100)); - let info = EnvInfo::new(); + let info = EnvInfo::default(); let engine = TestEngine::new(1024, factory); let mut substate = Substate::new(); @@ -624,7 +624,7 @@ mod tests { state.init_code(&address_b, code_b.clone()); state.add_balance(&sender, &U256::from(100_000)); - let info = EnvInfo::new(); + let info = EnvInfo::default(); let engine = TestEngine::new(0, factory); let mut substate = Substate::new(); @@ -668,7 +668,7 @@ mod tests { let mut state_result = get_temp_state(); let mut state = state_result.reference_mut(); state.init_code(&address, code.clone()); - let info = EnvInfo::new(); + let info = EnvInfo::default(); let engine = TestEngine::new(0, factory); let mut substate = Substate::new(); @@ -694,7 +694,7 @@ mod tests { let mut state_result = get_temp_state(); let mut state = state_result.reference_mut(); state.add_balance(&sender, &U256::from(18)); - let mut info = EnvInfo::new(); + let mut info = EnvInfo::default(); info.gas_limit = U256::from(100_000); let engine = TestEngine::new(0, factory); @@ -721,7 +721,7 @@ mod tests { let mut state_result = get_temp_state(); let mut state = state_result.reference_mut(); - let mut info = EnvInfo::new(); + let mut info = EnvInfo::default(); info.gas_limit = U256::from(100_000); let engine = TestEngine::new(0, factory); @@ -746,7 +746,7 @@ mod tests { let mut state_result = get_temp_state(); let mut state = state_result.reference_mut(); state.add_balance(&sender, &U256::from(17)); - let mut info = EnvInfo::new(); + let mut info = EnvInfo::default(); info.gas_limit = U256::from(100_000); let engine = TestEngine::new(0, factory); @@ -772,7 +772,7 @@ mod tests { let mut state_result = get_temp_state(); let mut state = state_result.reference_mut(); state.add_balance(&sender, &U256::from(17)); - let mut info = EnvInfo::new(); + let mut info = EnvInfo::default(); info.gas_used = U256::from(20_000); info.gas_limit = U256::from(100_000); let engine = TestEngine::new(0, factory); @@ -799,7 +799,7 @@ mod tests { let mut state_result = get_temp_state(); let mut state = state_result.reference_mut(); state.add_balance(&sender, &U256::from(100_017)); - let mut info = EnvInfo::new(); + let mut info = EnvInfo::default(); info.gas_limit = U256::from(100_000); let engine = TestEngine::new(0, factory); @@ -833,7 +833,7 @@ mod tests { let mut state_result = get_temp_state(); let mut state = state_result.reference_mut(); state.add_balance(&sender, &U256::from_str("152d02c7e14af6800000").unwrap()); - let info = EnvInfo::new(); + let info = EnvInfo::default(); let engine = TestEngine::new(0, factory); let mut substate = Substate::new(); diff --git a/ethcore/src/header.rs b/ethcore/src/header.rs index 531ab93f0..69dba5ec8 100644 --- a/ethcore/src/header.rs +++ b/ethcore/src/header.rs @@ -13,39 +13,39 @@ pub type BlockNumber = u64; /// which is non-specific. /// /// Doesn't do all that much on its own. -#[derive(Default, Debug, Clone)] +#[derive(Debug, Clone)] pub struct Header { // TODO: make all private. - /// TODO [Gav Wood] Please document me + /// Parent hash. pub parent_hash: H256, - /// TODO [arkpar] Please document me + /// Block timestamp. pub timestamp: u64, - /// TODO [debris] Please document me + /// Block number. pub number: BlockNumber, - /// TODO [Gav Wood] Please document me + /// Block author. pub author: Address, - /// TODO [debris] Please document me + /// Transactions root. pub transactions_root: H256, - /// TODO [debris] Please document me + /// Block uncles hash. pub uncles_hash: H256, - /// TODO [Gav Wood] Please document me + /// Block extra data. pub extra_data: Bytes, - /// TODO [debris] Please document me + /// State root. pub state_root: H256, - /// TODO [debris] Please document me + /// Block receipts root. pub receipts_root: H256, - /// TODO [debris] Please document me + /// Block bloom. pub log_bloom: LogBloom, - /// TODO [debris] Please document me + /// Gas used for contracts execution. pub gas_used: U256, - /// TODO [Gav Wood] Please document me + /// Block gas limit. pub gas_limit: U256, - /// TODO [debris] Please document me + /// Block difficulty. pub difficulty: U256, - /// TODO [arkpar] Please document me + /// Block seal. pub seal: Vec, /// TODO [arkpar] Please document me @@ -54,9 +54,8 @@ pub struct Header { pub bare_hash: RefCell>, } -impl Header { - /// Create a new, default-valued, header. - pub fn new() -> Header { +impl Default for Header { + fn default() -> Self { Header { parent_hash: ZERO_H256.clone(), timestamp: 0, @@ -79,6 +78,13 @@ impl Header { bare_hash: RefCell::new(None), } } +} + +impl Header { + /// Create a new, default-valued, header. + pub fn new() -> Self { + Self::default() + } /// TODO [Gav Wood] Please document me pub fn number(&self) -> BlockNumber { self.number } diff --git a/ethcore/src/tests/chain.rs b/ethcore/src/json_tests/chain.rs similarity index 99% rename from ethcore/src/tests/chain.rs rename to ethcore/src/json_tests/chain.rs index 4d1835033..19e792f52 100644 --- a/ethcore/src/tests/chain.rs +++ b/ethcore/src/json_tests/chain.rs @@ -3,7 +3,7 @@ use client::{BlockChainClient,Client}; use pod_state::*; use block::Block; use ethereum; -use super::helpers::*; +use tests::helpers::*; pub fn json_chain_test(json_data: &[u8], era: ChainEra) -> Vec { init_log(); diff --git a/ethcore/src/tests/client.rs b/ethcore/src/json_tests/client.rs similarity index 98% rename from ethcore/src/tests/client.rs rename to ethcore/src/json_tests/client.rs index 56b6e7db0..1d09ed079 100644 --- a/ethcore/src/tests/client.rs +++ b/ethcore/src/json_tests/client.rs @@ -1,6 +1,6 @@ use client::{BlockChainClient,Client}; use super::test_common::*; -use super::helpers::*; +use tests::helpers::*; #[test] fn created() { @@ -75,4 +75,4 @@ fn can_collect_garbage() { let client = client_result.reference(); client.tick(); assert!(client.cache_info().blocks < 100 * 1024); -} \ No newline at end of file +} diff --git a/ethcore/src/tests/executive.rs b/ethcore/src/json_tests/executive.rs similarity index 100% rename from ethcore/src/tests/executive.rs rename to ethcore/src/json_tests/executive.rs diff --git a/ethcore/src/tests/homestead_chain.rs b/ethcore/src/json_tests/homestead_chain.rs similarity index 98% rename from ethcore/src/tests/homestead_chain.rs rename to ethcore/src/json_tests/homestead_chain.rs index 5691f3a19..1962da1bc 100644 --- a/ethcore/src/tests/homestead_chain.rs +++ b/ethcore/src/json_tests/homestead_chain.rs @@ -1,6 +1,6 @@ use super::test_common::*; -use super::helpers::*; use super::chain::json_chain_test; +use tests::helpers::*; fn do_json_test(json_data: &[u8]) -> Vec { json_chain_test(json_data, ChainEra::Homestead) diff --git a/ethcore/src/tests/homestead_state.rs b/ethcore/src/json_tests/homestead_state.rs similarity index 98% rename from ethcore/src/tests/homestead_state.rs rename to ethcore/src/json_tests/homestead_state.rs index f0f7cd21e..474d56f8a 100644 --- a/ethcore/src/tests/homestead_state.rs +++ b/ethcore/src/json_tests/homestead_state.rs @@ -1,5 +1,5 @@ use super::test_common::*; -use super::helpers::*; +use tests::helpers::*; use super::state::json_chain_test; fn do_json_test(json_data: &[u8]) -> Vec { diff --git a/ethcore/src/json_tests/mod.rs b/ethcore/src/json_tests/mod.rs new file mode 100644 index 000000000..b5d6779bc --- /dev/null +++ b/ethcore/src/json_tests/mod.rs @@ -0,0 +1,10 @@ +#[macro_use] +mod test_common; + +mod transaction; +mod executive; +mod state; +mod client; +mod chain; +mod homestead_state; +mod homestead_chain; diff --git a/ethcore/src/tests/state.rs b/ethcore/src/json_tests/state.rs similarity index 99% rename from ethcore/src/tests/state.rs rename to ethcore/src/json_tests/state.rs index 34b24de3b..3fb43c132 100644 --- a/ethcore/src/tests/state.rs +++ b/ethcore/src/json_tests/state.rs @@ -1,5 +1,5 @@ use super::test_common::*; -use super::helpers::*; +use tests::helpers::*; use pod_state::*; use state_diff::*; use ethereum; diff --git a/ethcore/src/tests/test_common.rs b/ethcore/src/json_tests/test_common.rs similarity index 86% rename from ethcore/src/tests/test_common.rs rename to ethcore/src/json_tests/test_common.rs index fd88ae96a..87e7b979e 100644 --- a/ethcore/src/tests/test_common.rs +++ b/ethcore/src/json_tests/test_common.rs @@ -12,7 +12,6 @@ macro_rules! declare_test { #[ignore] #[test] #[allow(non_snake_case)] - #[cfg(feature="json-tests")] fn $id() { test!($name); } @@ -21,7 +20,6 @@ macro_rules! declare_test { #[cfg(feature = "test-heavy")] #[test] #[allow(non_snake_case)] - #[cfg(feature="json-tests")] fn $id() { test!($name); } @@ -29,7 +27,6 @@ macro_rules! declare_test { ($id: ident, $name: expr) => { #[test] #[allow(non_snake_case)] - #[cfg(feature="json-tests")] fn $id() { test!($name); } diff --git a/ethcore/src/tests/transaction.rs b/ethcore/src/json_tests/transaction.rs similarity index 100% rename from ethcore/src/tests/transaction.rs rename to ethcore/src/json_tests/transaction.rs diff --git a/ethcore/src/lib.rs b/ethcore/src/lib.rs index 32792fe34..3df01d898 100644 --- a/ethcore/src/lib.rs +++ b/ethcore/src/lib.rs @@ -63,7 +63,6 @@ #[macro_use] extern crate ethcore_util as util; #[macro_use] extern crate lazy_static; extern crate rustc_serialize; -extern crate flate2; extern crate rocksdb; extern crate heapsize; extern crate crypto; @@ -108,4 +107,8 @@ mod executive; mod externalities; mod verification; -#[cfg(test)] mod tests; +#[cfg(test)] +mod tests; +#[cfg(test)] +#[cfg(feature="json-tests")] +mod json_tests; diff --git a/ethcore/src/pod_account.rs b/ethcore/src/pod_account.rs index 97cfcb6fd..76127b89a 100644 --- a/ethcore/src/pod_account.rs +++ b/ethcore/src/pod_account.rs @@ -16,6 +16,7 @@ pub struct PodAccount { impl PodAccount { /// Construct new object. + #[cfg(test)] pub fn new(balance: U256, nonce: U256, code: Bytes, storage: BTreeMap) -> PodAccount { PodAccount { balance: balance, nonce: nonce, code: code, storage: storage } } diff --git a/ethcore/src/pod_state.rs b/ethcore/src/pod_state.rs index f37a327f8..22969f36b 100644 --- a/ethcore/src/pod_state.rs +++ b/ethcore/src/pod_state.rs @@ -10,6 +10,7 @@ impl PodState { pub fn new() -> PodState { Default::default() } /// Contruct a new object from the `m`. + #[cfg(test)] pub fn from(m: BTreeMap) -> PodState { PodState(m) } /// Get the underlying map. @@ -21,6 +22,7 @@ impl PodState { } /// Drain object to get the underlying map. + #[cfg(test)] pub fn drain(self) -> BTreeMap { self.0 } } diff --git a/ethcore/src/spec.rs b/ethcore/src/spec.rs index 72da929ce..7cb251096 100644 --- a/ethcore/src/spec.rs +++ b/ethcore/src/spec.rs @@ -1,23 +1,10 @@ //! Parameters for a block chain. use common::*; -use flate2::read::GzDecoder; use engine::*; use pod_state::*; use null_engine::*; -/// Converts file from base64 gzipped bytes to json -fn gzip64res_to_json(source: &[u8]) -> Json { - // there is probably no need to store genesis in based64 gzip, - // but that's what go does, and it was easy to load it this way - let data = source.from_base64().expect("Genesis block is malformed!"); - let data_ref: &[u8] = &data; - let mut decoder = GzDecoder::new(data_ref).expect("Gzip is invalid"); - let mut s: String = "".to_owned(); - decoder.read_to_string(&mut s).expect("Gzip is invalid"); - Json::from_str(&s).expect("Json is invalid") -} - /// Convert JSON value to equivalent RLP representation. // TODO: handle container types. fn json_to_rlp(json: &Json) -> Bytes { diff --git a/ethcore/src/state.rs b/ethcore/src/state.rs index 58cdf85a2..fb336f3bb 100644 --- a/ethcore/src/state.rs +++ b/ethcore/src/state.rs @@ -2,7 +2,7 @@ use common::*; use engine::Engine; use executive::Executive; use pod_account::*; -use pod_state::*; +use pod_state::PodState; //use state_diff::*; // TODO: uncomment once to_pod() works correctly. /// TODO [Gav Wood] Please document me @@ -20,6 +20,7 @@ pub struct State { impl State { /// Creates new state with empty state root + #[cfg(test)] pub fn new(mut db: JournalDB, account_start_nonce: U256) -> State { let mut root = H256::new(); { @@ -60,11 +61,6 @@ impl State { &self.root } - /// Expose the underlying database; good to use for calling `state.db().commit()`. - pub fn db(&mut self) -> &mut JournalDB { - &mut self.db - } - /// Create a new contract at address `contract`. If there is already an account at the address /// it will have its code reset, ready for `init_code()`. pub fn new_contract(&mut self, contract: &Address, balance: U256) { @@ -143,7 +139,6 @@ impl State { // let old = self.to_pod(); let e = try!(Executive::new(self, env_info, engine).transact(t)); - //println!("Executed: {:?}", e); // TODO uncomment once to_pod() works correctly. // trace!("Applied transaction. Diff:\n{}\n", StateDiff::diff_pod(&old, &self.to_pod())); @@ -153,16 +148,11 @@ impl State { Ok(receipt) } - /// TODO [debris] Please document me + /// Reverts uncommited changed. pub fn revert(&mut self, backup: State) { self.cache = backup.cache; } - /// Convert into a JSON representation. - pub fn as_json(&self) -> String { - unimplemented!(); - } - /// Commit accounts to SecTrieDBMut. This is similar to cpp-ethereum's dev::eth::commit. /// `accounts` is mutable because we may need to commit the code or storage and record that. #[allow(match_ref_pats)] @@ -196,6 +186,7 @@ impl State { } /// Populate the state from `accounts`. + #[cfg(test)] pub fn populate_from(&mut self, accounts: PodState) { for (add, acc) in accounts.drain().into_iter() { self.cache.borrow_mut().insert(add, Some(Account::from_pod(acc))); @@ -213,6 +204,7 @@ impl State { }) } + #[cfg(test)] /// Populate a PodAccount map from this state. pub fn to_pod(&self) -> PodState { // TODO: handle database rather than just the cache. diff --git a/ethcore/src/tests/helpers.rs b/ethcore/src/tests/helpers.rs index 1923e9164..ddc2aedc2 100644 --- a/ethcore/src/tests/helpers.rs +++ b/ethcore/src/tests/helpers.rs @@ -1,6 +1,6 @@ use client::{BlockChainClient,Client}; use std::env; -use super::test_common::*; +use common::*; use std::path::PathBuf; use spec::*; use std::fs::{remove_dir_all}; diff --git a/ethcore/src/tests/mod.rs b/ethcore/src/tests/mod.rs index bda581eac..1630fabcd 100644 --- a/ethcore/src/tests/mod.rs +++ b/ethcore/src/tests/mod.rs @@ -1,11 +1 @@ -#[macro_use] -mod test_common; - -mod transaction; -mod executive; -mod state; -mod client; -mod chain; pub mod helpers; -mod homestead_state; -mod homestead_chain; \ No newline at end of file diff --git a/ethcore/src/transaction.rs b/ethcore/src/transaction.rs index 61c17a755..d71506672 100644 --- a/ethcore/src/transaction.rs +++ b/ethcore/src/transaction.rs @@ -6,11 +6,11 @@ use error::*; use evm::Schedule; #[derive(Debug, Clone)] -/// TODO [Gav Wood] Please document me +/// Transaction action type. pub enum Action { - /// TODO [Gav Wood] Please document me + /// Create creates new contract. Create, - /// TODO [debris] Please document me + /// Calls contract at given address. Call(Address), } @@ -49,6 +49,7 @@ pub struct Transaction { impl Transaction { /// TODO [Gav Wood] Please document me + #[cfg(test)] pub fn new() -> Self { Transaction { nonce: x!(0), @@ -64,7 +65,9 @@ impl Transaction { sender: RefCell::new(None), } } + /// Create a new message-call transaction. + #[cfg(test)] pub fn new_call(to: Address, value: U256, data: Bytes, gas: U256, gas_price: U256, nonce: U256) -> Transaction { Transaction { nonce: nonce, @@ -82,6 +85,7 @@ impl Transaction { } /// Create a new contract-creation transaction. + #[cfg(test)] pub fn new_create(value: U256, data: Bytes, gas: U256, gas_price: U256, nonce: U256) -> Transaction { Transaction { nonce: nonce, @@ -168,11 +172,6 @@ impl Transaction { } } - /// Note that some fields have changed. Resets the memoised hash. - pub fn note_dirty(&self) { - *self.hash.borrow_mut() = None; - } - /// 0 is `v` is 27, 1 if 28, and 4 otherwise. pub fn standard_v(&self) -> u8 { match self.v { 27 => 0, 28 => 1, _ => 4 } } @@ -205,6 +204,7 @@ impl Transaction { } /// Signs the transaction as coming from `sender`. + #[cfg(test)] pub fn signed(self, secret: &Secret) -> Transaction { let mut r = self; r.sign(secret); r } /// Get the transaction cost in gas for the given params.