ethereum.forks.cancun.vm
Ethereum Virtual Machine (EVM).
.. contents:: Table of Contents :backlinks: none :local:
Introduction
The abstract computer which runs the code stored in an
.fork_types.Account.
__all__
| 30 | __all__ = ("Environment", "Evm", "Message") | 
|---|
BlockEnvironment
Items external to the virtual machine itself, provided by the environment.
| 33 | @dataclass | 
|---|
class BlockEnvironment:
chain_id
| 39 |     chain_id: U64 | 
|---|
state
| 40 |     state: State | 
|---|
block_gas_limit
| 41 |     block_gas_limit: Uint | 
|---|
block_hashes
| 42 |     block_hashes: List[Hash32] | 
|---|
coinbase
| 43 |     coinbase: Address | 
|---|
number
| 44 |     number: Uint | 
|---|
base_fee_per_gas
| 45 |     base_fee_per_gas: Uint | 
|---|
time
| 46 |     time: U256 | 
|---|
prev_randao
| 47 |     prev_randao: Bytes32 | 
|---|
excess_blob_gas
| 48 |     excess_blob_gas: U64 | 
|---|
parent_beacon_block_root
| 49 |     parent_beacon_block_root: Hash32 | 
|---|
BlockOutput
Output from applying the block body to the present state.
Contains the following:
block_gas_used : ethereum.base_types.Uint
Gas used for executing all transactions.
transactions_trie : ethereum.fork_types.Root
Trie of all the transactions in the block.
receipts_trie : ethereum.fork_types.Root
Trie root of all the receipts in the block.
receipt_keys :
Key of all the receipts in the block.
block_logs : Bloom
Logs bloom of all the logs included in all the transactions of the
block.
withdrawals_trie : ethereum.fork_types.Root
Trie root of all the withdrawals in the block.
blob_gas_used : ethereum.base_types.U64
Total blob gas used in the block.
| 52 | @dataclass | 
|---|
class BlockOutput:
block_gas_used
| 76 |     block_gas_used: Uint = Uint(0) | 
|---|
transactions_trie
| 77 |     transactions_trie: Trie[Bytes, Optional[Bytes | LegacyTransaction]] = ( | 
|---|---|
| 78 |         field(default_factory=lambda: Trie(secured=False, default=None)) | 
| 79 |     ) | 
receipts_trie
| 80 |     receipts_trie: Trie[Bytes, Optional[Bytes | Receipt]] = field( | 
|---|---|
| 81 |         default_factory=lambda: Trie(secured=False, default=None) | 
| 82 |     ) | 
receipt_keys
| 83 |     receipt_keys: Tuple[Bytes, ...] = field(default_factory=tuple) | 
|---|
block_logs
| 84 |     block_logs: Tuple[Log, ...] = field(default_factory=tuple) | 
|---|
withdrawals_trie
| 85 |     withdrawals_trie: Trie[Bytes, Optional[Bytes | Withdrawal]] = field( | 
|---|---|
| 86 |         default_factory=lambda: Trie(secured=False, default=None) | 
| 87 |     ) | 
blob_gas_used
| 88 |     blob_gas_used: U64 = U64(0) | 
|---|
TransactionEnvironment
Items that are used by contract creation or message call.
| 91 | @dataclass | 
|---|
class TransactionEnvironment:
origin
| 97 |     origin: Address | 
|---|
gas_price
| 98 |     gas_price: Uint | 
|---|
gas
| 99 |     gas: Uint | 
|---|
access_list_addresses
| 100 |     access_list_addresses: Set[Address] | 
|---|
access_list_storage_keys
| 101 |     access_list_storage_keys: Set[Tuple[Address, Bytes32]] | 
|---|
transient_storage
| 102 |     transient_storage: TransientStorage | 
|---|
blob_versioned_hashes
| 103 |     blob_versioned_hashes: Tuple[VersionedHash, ...] | 
|---|
index_in_block
| 104 |     index_in_block: Optional[Uint] | 
|---|
tx_hash
| 105 |     tx_hash: Optional[Hash32] | 
|---|
Message
Items that are used by contract creation or message call.
| 108 | @dataclass | 
|---|
class Message:
block_env
| 114 |     block_env: BlockEnvironment | 
|---|
tx_env
| 115 |     tx_env: TransactionEnvironment | 
|---|
caller
| 116 |     caller: Address | 
|---|
target
| 117 |     target: Bytes0 | Address | 
|---|
current_target
| 118 |     current_target: Address | 
|---|
gas
| 119 |     gas: Uint | 
|---|
value
| 120 |     value: U256 | 
|---|
data
| 121 |     data: Bytes | 
|---|
code_address
| 122 |     code_address: Optional[Address] | 
|---|
code
| 123 |     code: Bytes | 
|---|
depth
| 124 |     depth: Uint | 
|---|
should_transfer_value
| 125 |     should_transfer_value: bool | 
|---|
is_static
| 126 |     is_static: bool | 
|---|
accessed_addresses
| 127 |     accessed_addresses: Set[Address] | 
|---|
accessed_storage_keys
| 128 |     accessed_storage_keys: Set[Tuple[Address, Bytes32]] | 
|---|
parent_evm
| 129 |     parent_evm: Optional["Evm"] | 
|---|
Evm
The internal state of the virtual machine.
| 132 | @dataclass | 
|---|
class Evm:
pc
| 136 |     pc: Uint | 
|---|
stack
| 137 |     stack: List[U256] | 
|---|
memory
| 138 |     memory: bytearray | 
|---|
code
| 139 |     code: Bytes | 
|---|
gas_left
| 140 |     gas_left: Uint | 
|---|
valid_jump_destinations
| 141 |     valid_jump_destinations: Set[Uint] | 
|---|
logs
| 142 |     logs: Tuple[Log, ...] | 
|---|
refund_counter
| 143 |     refund_counter: int | 
|---|
running
| 144 |     running: bool | 
|---|
message
| 145 |     message: Message | 
|---|
output
| 146 |     output: Bytes | 
|---|
accounts_to_delete
| 147 |     accounts_to_delete: Set[Address] | 
|---|
return_data
| 148 |     return_data: Bytes | 
|---|
error
| 149 |     error: Optional[EthereumException] | 
|---|
accessed_addresses
| 150 |     accessed_addresses: Set[Address] | 
|---|
accessed_storage_keys
| 151 |     accessed_storage_keys: Set[Tuple[Address, Bytes32]] | 
|---|
incorporate_child_on_success
Incorporate the state of a successful child_evm into the parent evm.
Parameters
evm :
The parent EVM.
child_evm :
The child evm to incorporate.
                def incorporate_child_on_success(evm: Evm, child_evm: Evm) -> None:
            
| 155 |     """ | 
|---|---|
| 156 |     Incorporate the state of a successful `child_evm` into the parent `evm`. | 
| 157 |  | 
| 158 |     Parameters | 
| 159 |     ---------- | 
| 160 |     evm : | 
| 161 |         The parent `EVM`. | 
| 162 |     child_evm : | 
| 163 |         The child evm to incorporate. | 
| 164 |  | 
| 165 |     """ | 
| 166 |     evm.gas_left += child_evm.gas_left | 
| 167 |     evm.logs += child_evm.logs | 
| 168 |     evm.refund_counter += child_evm.refund_counter | 
| 169 |     evm.accounts_to_delete.update(child_evm.accounts_to_delete) | 
| 170 |     evm.accessed_addresses.update(child_evm.accessed_addresses) | 
| 171 |     evm.accessed_storage_keys.update(child_evm.accessed_storage_keys) | 
incorporate_child_on_error
Incorporate the state of an unsuccessful child_evm into the parent evm.
Parameters
evm :
The parent EVM.
child_evm :
The child evm to incorporate.
                def incorporate_child_on_error(evm: Evm, child_evm: Evm) -> None:
            
| 175 |     """ | 
|---|---|
| 176 |     Incorporate the state of an unsuccessful `child_evm` into the parent `evm`. | 
| 177 |  | 
| 178 |     Parameters | 
| 179 |     ---------- | 
| 180 |     evm : | 
| 181 |         The parent `EVM`. | 
| 182 |     child_evm : | 
| 183 |         The child evm to incorporate. | 
| 184 |  | 
| 185 |     """ | 
| 186 |     evm.gas_left += child_evm.gas_left |