From aae6d19df9621c330761b0652e95187744883807 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Thu, 22 Sep 2016 19:58:42 +0200 Subject: [PATCH] Separate path for ext code size (#2251) * Separate path for code size * Actually use it for EVM * add extcodesize to TestExt --- ethcore/src/evm/ext.rs | 3 +++ ethcore/src/evm/interpreter/mod.rs | 2 +- ethcore/src/evm/tests.rs | 4 ++++ ethcore/src/externalities.rs | 5 +++++ ethcore/src/json_tests/executive.rs | 4 ++++ ethcore/src/state/mod.rs | 10 ++++++++-- 6 files changed, 25 insertions(+), 3 deletions(-) diff --git a/ethcore/src/evm/ext.rs b/ethcore/src/evm/ext.rs index 0db789507..2bbc7035b 100644 --- a/ethcore/src/evm/ext.rs +++ b/ethcore/src/evm/ext.rs @@ -83,6 +83,9 @@ pub trait Ext { /// Returns code at given address fn extcode(&self, address: &Address) -> Bytes; + /// Returns code size at given address + fn extcodesize(&self, address: &Address) -> usize; + /// Creates log entry with given topics and data fn log(&mut self, topics: Vec, data: &[u8]); diff --git a/ethcore/src/evm/interpreter/mod.rs b/ethcore/src/evm/interpreter/mod.rs index e95fb943e..bf3062de5 100644 --- a/ethcore/src/evm/interpreter/mod.rs +++ b/ethcore/src/evm/interpreter/mod.rs @@ -471,7 +471,7 @@ impl Interpreter { }, instructions::EXTCODESIZE => { let address = u256_to_address(&stack.pop_back()); - let len = ext.extcode(&address).len(); + let len = ext.extcodesize(&address); stack.push(U256::from(len)); }, instructions::CALLDATACOPY => { diff --git a/ethcore/src/evm/tests.rs b/ethcore/src/evm/tests.rs index bdb1f1ddb..ec217b6c5 100644 --- a/ethcore/src/evm/tests.rs +++ b/ethcore/src/evm/tests.rs @@ -140,6 +140,10 @@ impl Ext for FakeExt { self.codes.get(address).unwrap_or(&Bytes::new()).clone() } + fn extcodesize(&self, address: &Address) -> usize { + self.codes.get(address).map(|v| v.len()).unwrap_or(0) + } + fn log(&mut self, topics: Vec, data: &[u8]) { self.logs.push(FakeLogEntry { topics: topics, diff --git a/ethcore/src/externalities.rs b/ethcore/src/externalities.rs index 09c4b4e11..7395522c3 100644 --- a/ethcore/src/externalities.rs +++ b/ethcore/src/externalities.rs @@ -205,6 +205,11 @@ impl<'a, T, V> Ext for Externalities<'a, T, V> where T: 'a + Tracer, V: 'a + VMT self.state.code(address).unwrap_or_else(|| vec![]) } + fn extcodesize(&self, address: &Address) -> usize { + self.state.code_size(address).unwrap_or(0) + } + + #[cfg_attr(feature="dev", allow(match_ref_pats))] fn ret(mut self, gas: &U256, data: &[u8]) -> evm::Result where Self: Sized { diff --git a/ethcore/src/json_tests/executive.rs b/ethcore/src/json_tests/executive.rs index 7304f5931..1fe98acdb 100644 --- a/ethcore/src/json_tests/executive.rs +++ b/ethcore/src/json_tests/executive.rs @@ -131,6 +131,10 @@ impl<'a, T, V> Ext for TestExt<'a, T, V> where T: Tracer, V: VMTracer { self.ext.extcode(address) } + fn extcodesize(&self, address: &Address) -> usize { + self.ext.extcodesize(address) + } + fn log(&mut self, topics: Vec, data: &[u8]) { self.ext.log(topics, data) } diff --git a/ethcore/src/state/mod.rs b/ethcore/src/state/mod.rs index 78eb01c7c..e1299d1dc 100644 --- a/ethcore/src/state/mod.rs +++ b/ethcore/src/state/mod.rs @@ -191,10 +191,16 @@ impl State { })) } - /// Mutate storage of account `a` so that it is `value` for `key`. + /// Get the code of account `a`. pub fn code(&self, a: &Address) -> Option { self.ensure_cached(a, true, - |a| a.as_ref().map_or(None, |a|a.code().map(|x|x.to_vec()))) + |a| a.as_ref().map_or(None, |a| a.code().map(|x| x.to_vec()))) + } + + /// Get the code size of account `a`. + pub fn code_size(&self, a: &Address) -> Option { + self.ensure_cached(a, true, + |a| a.as_ref().map_or(None, |a| a.code().map(|x| x.len()))) } /// Add `incr` to the balance of account `a`.