Struct evm_rs_emulator::Runner
source · pub struct Runner {Show 14 fields
pub pc: usize,
pub bytecode: Vec<u8>,
pub debug_level: Option<u8>,
pub call_depth: u32,
pub gas: u64,
pub origin: [u8; 20],
pub caller: [u8; 20],
pub callvalue: [u8; 32],
pub address: [u8; 20],
pub state: EvmState,
pub memory: Memory,
pub calldata: Memory,
pub returndata: Memory,
pub stack: Stack,
}
Fields§
§pc: usize
§bytecode: Vec<u8>
§debug_level: Option<u8>
§call_depth: u32
§gas: u64
§origin: [u8; 20]
§caller: [u8; 20]
§callvalue: [u8; 32]
§address: [u8; 20]
§state: EvmState
§memory: Memory
§calldata: Memory
§returndata: Memory
§stack: Stack
Implementations§
source§impl Runner
impl Runner
Implementation of the Runner struct, which is responsible for executing EVM bytecode.
sourcepub fn new(
caller: [u8; 20],
origin: Option<[u8; 20]>,
address: Option<[u8; 20]>,
callvalue: Option<[u8; 32]>,
calldata: Option<Vec<u8>>,
state: Option<EvmState>
) -> Self
pub fn new( caller: [u8; 20], origin: Option<[u8; 20]>, address: Option<[u8; 20]>, callvalue: Option<[u8; 32]>, calldata: Option<Vec<u8>>, state: Option<EvmState> ) -> Self
Creates a new instance of the EVM runner with the given parameters.
Arguments
caller
- The address of the account that initiated the call.origin
- The address of the account that originally initiated the transaction.address
- The address of the account that will receive the call.callvalue
- The value (in wei) that was sent along with the call.calldata
- The input data for the call.state
- The initial state of the EVM.
Returns
A new instance of the EVM runner.
sourcepub fn increment_pc(&mut self, size: usize) -> Result<(), ExecutionError>
pub fn increment_pc(&mut self, size: usize) -> Result<(), ExecutionError>
sourcepub fn set_pc(&mut self, value: usize)
pub fn set_pc(&mut self, value: usize)
Sets the program counter to the specified value.
Arguments
value
- The value to set the program counter to.
sourcepub fn interpret(
&mut self,
bytecode: Vec<u8>,
debug: Option<u8>,
initial_interpretation: bool
) -> Result<(), ExecutionError>
pub fn interpret( &mut self, bytecode: Vec<u8>, debug: Option<u8>, initial_interpretation: bool ) -> Result<(), ExecutionError>
Interprets the given bytecode and executes it on the EVM.
Arguments
bytecode
- A vector of bytes representing the bytecode to be executed.debug
- An optional u8 value representing the debug level. If set to 2 or higher, debug information will be printed.initial_interpretation
- A boolean value indicating whether this is the initial interpretation of the bytecode.
Errors
Returns an ExecutionError
if an error occurs during execution.
Examples
use evm_rs_emulator::Runner;
let mut runner = Runner::_default(255);
let bytecode = vec![0x60, 0x01, 0x60, 0x02, 0x01, 0x00, 0x00];
let result = runner.interpret(bytecode, Some(2), true);
assert!(result.is_ok());
sourcepub fn interpret_op_code(&mut self, opcode: u8) -> Result<(), ExecutionError>
pub fn interpret_op_code(&mut self, opcode: u8) -> Result<(), ExecutionError>
Interpret a single opcode.
Arguments
opcode
- A single opcode to interpret.
Errors
Returns an ExecutionError
if the opcode is invalid or if an error occurs during execution.
OpCodes
The function matches the given opcode with the corresponding function from the op_codes
module.
The OpCodes are divided into the following categories:
- Execution OpCodes
- Math operations OpCodes
- Push OpCodes
- Dup OpCodes
- Swap OpCodes
- Memory OpCodes
- Storage OpCodes
For more information on each OpCode, please refer to the op_codes
module.
sourcepub fn call(
&mut self,
to: [u8; 20],
value: [u8; 32],
calldata: Vec<u8>,
_gas: u64,
delegate: bool
) -> Result<(), ExecutionError>
pub fn call( &mut self, to: [u8; 20], value: [u8; 32], calldata: Vec<u8>, _gas: u64, delegate: bool ) -> Result<(), ExecutionError>
Executes a call to a contract. Set up a new runner environment for the call and interpret the bytecode.
Arguments
to
- The address of the contract to call.value
- The value to send with the call.calldata
- The input data to the contract._gas
- The gas limit for the call (currently unused).delegate
- Whether the call is a delegate call.
Errors
Returns an ExecutionError
if the call fails.
sourcepub fn print_debug(&self, s: &str)
pub fn print_debug(&self, s: &str)
Prints a debug message with a tab prefix that indicates the current call depth. The more the call depth is high, the more the tab prefix will be long.
Auto Trait Implementations§
impl !RefUnwindSafe for Runner
impl Send for Runner
impl Sync for Runner
impl Unpin for Runner
impl !UnwindSafe for Runner
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where &'a Self: for<'a> IntoIterator,
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere Self: Borrow<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> Rwhere Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere Self: AsRef<U>, U: 'a + ?Sized, R: 'a,
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere Self: AsMut<U>, U: 'a + ?Sized, R: 'a,
self
, then passes self.as_mut()
into the pipe
function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere Self: DerefMut<Target = T> + Deref, T: ?Sized,
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
.tap_ref_mut()
only in debug builds, and is erased in release
builds.