From ed64bc28788fc471ae6f45f57771271d2a40f37c Mon Sep 17 00:00:00 2001 From: Agusrodri Date: Wed, 19 Jun 2024 06:29:56 -0700 Subject: [PATCH 1/3] add caller parameter to set_code function --- interpreter/src/runtime.rs | 2 +- interpreter/tests/usability.rs | 2 +- src/backend/overlayed.rs | 2 +- src/standard/invoker/mod.rs | 3 +++ src/standard/invoker/routines.rs | 3 ++- 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/interpreter/src/runtime.rs b/interpreter/src/runtime.rs index 992099e04..0aecaadea 100644 --- a/interpreter/src/runtime.rs +++ b/interpreter/src/runtime.rs @@ -156,7 +156,7 @@ pub trait RuntimeBackend: RuntimeBaseBackend { /// Fully delete storages of an account. fn reset_storage(&mut self, address: H160); /// Set code of an account. - fn set_code(&mut self, address: H160, code: Vec) -> Result<(), ExitError>; + fn set_code(&mut self, address: H160, code: Vec, caller: Option) -> Result<(), ExitError>; /// Reset balance of an account. fn reset_balance(&mut self, address: H160); fn deposit(&mut self, target: H160, value: U256); diff --git a/interpreter/tests/usability.rs b/interpreter/tests/usability.rs index d174e82a1..93e58b77d 100644 --- a/interpreter/tests/usability.rs +++ b/interpreter/tests/usability.rs @@ -165,7 +165,7 @@ impl RuntimeBackend for UnimplementedHandler { unimplemented!() } - fn set_code(&mut self, _address: H160, _code: Vec) -> Result<(), ExitError> { + fn set_code(&mut self, _address: H160, _code: Vec, _caller: Option) -> Result<(), ExitError> { unimplemented!() } diff --git a/src/backend/overlayed.rs b/src/backend/overlayed.rs index c8fe2296e..825723d01 100644 --- a/src/backend/overlayed.rs +++ b/src/backend/overlayed.rs @@ -192,7 +192,7 @@ impl RuntimeBackend for OverlayedBackend { self.substate.storage_resets.insert(address); } - fn set_code(&mut self, address: H160, code: Vec) -> Result<(), ExitError> { + fn set_code(&mut self, address: H160, code: Vec, _caller: Option) -> Result<(), ExitError> { self.substate.codes.insert(address, code); Ok(()) } diff --git a/src/standard/invoker/mod.rs b/src/standard/invoker/mod.rs index d0529f668..b1ad9f538 100644 --- a/src/standard/invoker/mod.rs +++ b/src/standard/invoker/mod.rs @@ -375,6 +375,7 @@ where retbuf, &mut substate, handler, + None )?; Ok(TransactValue::Create { @@ -564,6 +565,7 @@ where match trap_data { SubstackInvoke::Create { address, trap } => { let retbuf = retval; + let caller = trap.scheme.caller(); let result = result.and_then(|_| { routines::deploy_create_code( @@ -572,6 +574,7 @@ where retbuf.clone(), &mut substate, handler, + Some(caller), )?; Ok(address) diff --git a/src/standard/invoker/routines.rs b/src/standard/invoker/routines.rs index 9bd3d3fce..26c63d035 100644 --- a/src/standard/invoker/routines.rs +++ b/src/standard/invoker/routines.rs @@ -197,6 +197,7 @@ pub fn deploy_create_code<'config, S, H>( retbuf: Vec, state: &mut S, handler: &mut H, + caller: Option, ) -> Result<(), ExitError> where S: InvokerState<'config>, @@ -212,7 +213,7 @@ where state.record_codedeposit(retbuf.len())?; - handler.set_code(address, retbuf)?; + handler.set_code(address, retbuf, caller)?; Ok(()) } From 8bf38591a6a06e1e51481a3c57cd2fb0ae5ded9a Mon Sep 17 00:00:00 2001 From: Agusrodri Date: Wed, 19 Jun 2024 07:13:25 -0700 Subject: [PATCH 2/3] fmt --- interpreter/src/runtime.rs | 7 ++++++- interpreter/tests/usability.rs | 7 ++++++- src/backend/overlayed.rs | 7 ++++++- src/standard/invoker/mod.rs | 2 +- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/interpreter/src/runtime.rs b/interpreter/src/runtime.rs index 0aecaadea..919086005 100644 --- a/interpreter/src/runtime.rs +++ b/interpreter/src/runtime.rs @@ -156,7 +156,12 @@ pub trait RuntimeBackend: RuntimeBaseBackend { /// Fully delete storages of an account. fn reset_storage(&mut self, address: H160); /// Set code of an account. - fn set_code(&mut self, address: H160, code: Vec, caller: Option) -> Result<(), ExitError>; + fn set_code( + &mut self, + address: H160, + code: Vec, + caller: Option, + ) -> Result<(), ExitError>; /// Reset balance of an account. fn reset_balance(&mut self, address: H160); fn deposit(&mut self, target: H160, value: U256); diff --git a/interpreter/tests/usability.rs b/interpreter/tests/usability.rs index 93e58b77d..d25230a1e 100644 --- a/interpreter/tests/usability.rs +++ b/interpreter/tests/usability.rs @@ -165,7 +165,12 @@ impl RuntimeBackend for UnimplementedHandler { unimplemented!() } - fn set_code(&mut self, _address: H160, _code: Vec, _caller: Option) -> Result<(), ExitError> { + fn set_code( + &mut self, + _address: H160, + _code: Vec, + _caller: Option, + ) -> Result<(), ExitError> { unimplemented!() } diff --git a/src/backend/overlayed.rs b/src/backend/overlayed.rs index 825723d01..4f302c23e 100644 --- a/src/backend/overlayed.rs +++ b/src/backend/overlayed.rs @@ -192,7 +192,12 @@ impl RuntimeBackend for OverlayedBackend { self.substate.storage_resets.insert(address); } - fn set_code(&mut self, address: H160, code: Vec, _caller: Option) -> Result<(), ExitError> { + fn set_code( + &mut self, + address: H160, + code: Vec, + _caller: Option, + ) -> Result<(), ExitError> { self.substate.codes.insert(address, code); Ok(()) } diff --git a/src/standard/invoker/mod.rs b/src/standard/invoker/mod.rs index b1ad9f538..7797dc04e 100644 --- a/src/standard/invoker/mod.rs +++ b/src/standard/invoker/mod.rs @@ -375,7 +375,7 @@ where retbuf, &mut substate, handler, - None + None, )?; Ok(TransactValue::Create { From bc0a9f94c87abc64708b52d7d1f67bf99e43fca8 Mon Sep 17 00:00:00 2001 From: Agusrodri Date: Tue, 25 Jun 2024 06:16:43 -0700 Subject: [PATCH 3/3] add SetCodeOrigin enum --- interpreter/src/runtime.rs | 9 ++++++++- interpreter/tests/usability.rs | 4 ++-- src/backend/overlayed.rs | 4 ++-- src/standard/invoker/mod.rs | 8 ++++---- src/standard/invoker/routines.rs | 6 +++--- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/interpreter/src/runtime.rs b/interpreter/src/runtime.rs index 919086005..63d85dd6c 100644 --- a/interpreter/src/runtime.rs +++ b/interpreter/src/runtime.rs @@ -77,6 +77,13 @@ pub struct Log { pub data: Vec, } +// Identify if the origin of set_code() comes from a transact or subcall. +#[derive(Clone, Debug)] +pub enum SetCodeOrigin { + Transaction, + Subcall(H160), +} + #[auto_impl::auto_impl(&, Box)] pub trait RuntimeEnvironment { /// Get environmental block hash. @@ -160,7 +167,7 @@ pub trait RuntimeBackend: RuntimeBaseBackend { &mut self, address: H160, code: Vec, - caller: Option, + origin: SetCodeOrigin, ) -> Result<(), ExitError>; /// Reset balance of an account. fn reset_balance(&mut self, address: H160); diff --git a/interpreter/tests/usability.rs b/interpreter/tests/usability.rs index d25230a1e..a5b8cecd1 100644 --- a/interpreter/tests/usability.rs +++ b/interpreter/tests/usability.rs @@ -7,7 +7,7 @@ use evm_interpreter::{ opcode::Opcode, runtime::{ Context, Log, RuntimeBackend, RuntimeBaseBackend, RuntimeEnvironment, RuntimeState, - TransactionContext, + SetCodeOrigin, TransactionContext, }, EtableInterpreter, RunInterpreter, }; @@ -169,7 +169,7 @@ impl RuntimeBackend for UnimplementedHandler { &mut self, _address: H160, _code: Vec, - _caller: Option, + _origin: SetCodeOrigin, ) -> Result<(), ExitError> { unimplemented!() } diff --git a/src/backend/overlayed.rs b/src/backend/overlayed.rs index 4f302c23e..638fbc85b 100644 --- a/src/backend/overlayed.rs +++ b/src/backend/overlayed.rs @@ -7,7 +7,7 @@ use core::mem; use evm_interpreter::{ error::{ExitError, ExitException}, - runtime::{Log, RuntimeBackend, RuntimeBaseBackend, RuntimeEnvironment}, + runtime::{Log, RuntimeBackend, RuntimeBaseBackend, RuntimeEnvironment, SetCodeOrigin}, }; use primitive_types::{H160, H256, U256}; @@ -196,7 +196,7 @@ impl RuntimeBackend for OverlayedBackend { &mut self, address: H160, code: Vec, - _caller: Option, + _origin: SetCodeOrigin, ) -> Result<(), ExitError> { self.substate.codes.insert(address, code); Ok(()) diff --git a/src/standard/invoker/mod.rs b/src/standard/invoker/mod.rs index 7797dc04e..b1735eed0 100644 --- a/src/standard/invoker/mod.rs +++ b/src/standard/invoker/mod.rs @@ -12,8 +12,8 @@ use evm_interpreter::{ }, opcode::Opcode, runtime::{ - Context, GasState, RuntimeBackend, RuntimeEnvironment, RuntimeState, TransactionContext, - Transfer, + Context, GasState, RuntimeBackend, RuntimeEnvironment, RuntimeState, SetCodeOrigin, + TransactionContext, Transfer, }, Interpreter, }; @@ -375,7 +375,7 @@ where retbuf, &mut substate, handler, - None, + SetCodeOrigin::Transaction, )?; Ok(TransactValue::Create { @@ -574,7 +574,7 @@ where retbuf.clone(), &mut substate, handler, - Some(caller), + SetCodeOrigin::Subcall(caller), )?; Ok(address) diff --git a/src/standard/invoker/routines.rs b/src/standard/invoker/routines.rs index 26c63d035..cdd3909cb 100644 --- a/src/standard/invoker/routines.rs +++ b/src/standard/invoker/routines.rs @@ -3,7 +3,7 @@ use alloc::vec::Vec; use evm_interpreter::{ error::{CallTrapData, CreateTrapData, ExitError, ExitException, ExitResult}, opcode::Opcode, - runtime::{RuntimeBackend, RuntimeEnvironment, RuntimeState, Transfer}, + runtime::{RuntimeBackend, RuntimeEnvironment, RuntimeState, SetCodeOrigin, Transfer}, }; use primitive_types::{H160, U256}; @@ -197,7 +197,7 @@ pub fn deploy_create_code<'config, S, H>( retbuf: Vec, state: &mut S, handler: &mut H, - caller: Option, + origin: SetCodeOrigin, ) -> Result<(), ExitError> where S: InvokerState<'config>, @@ -213,7 +213,7 @@ where state.record_codedeposit(retbuf.len())?; - handler.set_code(address, retbuf, caller)?; + handler.set_code(address, retbuf, origin)?; Ok(()) }