EVM State#
The EVM is a state machine. A valid Ethereum program or valid bytecode can manipulate that state.
A specific opcode is an operation that manipulates that state.
Program Counter (pc)#
The program counter points to the next opcode that the EVM is going to execute.
Stack / Memory / Storage#
All of them are part of the EVM state. And are the areas where the EVM manipulates and stores data.
Program#
This is where we store the bytecode of the current program. It can not change during execution, which makes it immutable.
Sender#
Address of the account currently executing this program. Equivalent to msg.sender
in Solidity.
Gas#
We need to keep track how much gas we currently have and how much we already consumed. Most opcodes make the gas counter go down.
Value#
How much Ether (wei) this current execution can consume.
Calldata#
Is the input to our program.
Flags#
We are going to keep track of two flags. The stop_flag
and revert_flag
. If one of them is True
the current execution is going to stop.
Returndata#
The EVM can return data after execution. We store this data in return
.
Logs#
There are several opcodes that emit logs when executed. The result of these logs is saved here.
class State:
def __init__(self,
sender,
program,
gas,
value,
calldata=[]):
self.pc = 0
self.stack = Stack()
self.memory = Memory()
self.storage = Storage()
self.sender = sender
self.program = program
self.gas = gas
self.value = value
self.calldata = calldata
self.stop_flag = False
self.revert_flag = False
self.returndata = []
self.logs = []