From 4ca353b021bb9c0c0cf4ed4e47a4a0c9a0b376f0 Mon Sep 17 00:00:00 2001 From: debris Date: Thu, 14 Jan 2016 22:41:39 +0100 Subject: [PATCH] common changes, added json state tests --- src/account.rs | 6 +++++- src/env_info.rs | 6 ++++-- src/evm/jit.rs | 1 - src/executive.rs | 12 +++++++++++- src/state.rs | 7 +++++-- src/tests/state.rs | 7 +++++-- 6 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/account.rs b/src/account.rs index 3806aae98..7dbb099b3 100644 --- a/src/account.rs +++ b/src/account.rs @@ -513,6 +513,10 @@ impl Account { pub fn set_storage(&mut self, key: H256, value: H256) { self.storage_overlay.borrow_mut().insert(key, (Filth::Dirty, value)); } + + pub fn reset_storage(&mut self, key: &H256) { + self.storage_overlay.borrow_mut().remove(key); + } /// Get (and cache) the contents of the trie's storage at `key`. pub fn storage_at(&self, db: &HashDB, key: &H256) -> H256 { @@ -741,4 +745,4 @@ fn create_account() { assert_eq!(a.rlp().to_hex(), "f8448045a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"); } -} \ No newline at end of file +} diff --git a/src/env_info.rs b/src/env_info.rs index 9620dd7b8..a8f99d6ec 100644 --- a/src/env_info.rs +++ b/src/env_info.rs @@ -39,7 +39,7 @@ impl EnvInfo { pub fn from_json(json: &Json) -> EnvInfo { let current_number = u64_from_json(&json["currentNumber"]); - EnvInfo { + let e = EnvInfo { number: current_number, author: address_from_json(&json["currentCoinbase"]), difficulty: u256_from_json(&json["currentDifficulty"]), @@ -47,7 +47,9 @@ impl EnvInfo { timestamp: u64_from_json(&json["currentTimestamp"]), last_hashes: (0..current_number).map(|i| format!("{}", current_number - i).as_bytes().sha3()).collect(), gas_used: x!(0), - } + }; + println!("hashes: {:?}", e.last_hashes); + e } } diff --git a/src/evm/jit.rs b/src/evm/jit.rs index c997ac89b..4e0bb1012 100644 --- a/src/evm/jit.rs +++ b/src/evm/jit.rs @@ -325,7 +325,6 @@ impl evm::Evm for JitEvm { let mut context = unsafe { evmjit::ContextHandle::new(data.into_jit(), &mut ext_handle) }; let res = context.exec(); - println!("jit res: {:?}", res); // check in adapter if execution of children contracts failed. if let Some(err) = optional_err { diff --git a/src/executive.rs b/src/executive.rs index a8dc1b968..c57368125 100644 --- a/src/executive.rs +++ b/src/executive.rs @@ -278,7 +278,17 @@ impl<'a> Executive<'a> { contracts_created: substate.contracts_created }) }, - _err => { unreachable!() } + _err => { + Ok(Executed { + gas: t.gas, + gas_used: t.gas, + refunded: U256::zero(), + cumulative_gas_used: self.info.gas_used + t.gas, + logs: vec![], + out_of_gas: true, + contracts_created: vec![] + }) + } } } diff --git a/src/state.rs b/src/state.rs index fc7ffdb4c..e417bbbcc 100644 --- a/src/state.rs +++ b/src/state.rs @@ -125,7 +125,10 @@ impl State { /// Mutate storage of account `a` so that it is `value` for `key`. pub fn set_storage(&mut self, a: &Address, key: H256, value: H256) { - self.require(a, false).set_storage(key, value); + match value == H256::new() { + true => self.require(a, false).reset_storage(&key), + false => self.require(a, false).set_storage(key, value) + } } /// Initialise the code of account `a` so that it is `value` for `key`. @@ -138,7 +141,7 @@ impl State { /// This will change the state accordingly. pub fn apply(&mut self, env_info: &EnvInfo, engine: &Engine, t: &Transaction) -> ApplyResult { let e = try!(Executive::new(self, env_info, engine).transact(t)); - println!("Executed: {:?}", e); + //println!("Executed: {:?}", e); self.commit(); Ok(Receipt::new(self.root().clone(), e.gas_used, e.logs)) } diff --git a/src/tests/state.rs b/src/tests/state.rs index 29fe30c96..9ad764236 100644 --- a/src/tests/state.rs +++ b/src/tests/state.rs @@ -39,8 +39,8 @@ fn do_json_test(json_data: &[u8]) -> Vec { if fail_unless(&r.state_root == &post_state_root) { println!("!!! {}: State mismatch (got: {}, expect: {}):", name, r.state_root, post_state_root); let our_post = s.to_pod(); - println!("Got:\n{}", our_post); - println!("Expect:\n{}", post); + println!("Got:\n{:?}", our_post); + println!("Expect:\n{:?}", post); println!("Diff ---expect -> +++got:\n{}", pod_state_diff(&post, &our_post)); } @@ -58,4 +58,7 @@ fn do_json_test(json_data: &[u8]) -> Vec { } declare_test!{StateTests_stExample, "StateTests/stExample"} +declare_test!{StateTests_stBlockHashTest, "StateTests/stBlockHashTest"} declare_test!{StateTests_stLogTests, "StateTests/stLogTests"} +declare_test!{StateTests_stCallCodes, "StateTests/stCallCodes"} +declare_test_ignore!{StateTests_stCallCreateCallCodeTest, "StateTests/stCallCreateCallCodeTest"}