ethereum.prague.utils.message
Hardfork Utility Functions For The Message Data-structure ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. contents:: Table of Contents :backlinks: none :local:
Introduction
Message specific functions used in this prague version of specification.
prepare_message
Execute a transaction against the provided environment.
Parameters
block_env : Environment for the Ethereum Virtual Machine. tx_env : Environment for the transaction. tx : Transaction to be executed.
Returns
message: ethereum.prague.vm.Message
Items containing contract creation or message call specific data.
def prepare_message(block_env: BlockEnvironment, tx_env: TransactionEnvironment, tx: Transaction) -> Message:
32 | """ |
---|---|
33 | Execute a transaction against the provided environment. |
34 |
|
35 | Parameters |
36 | ---------- |
37 | block_env : |
38 | Environment for the Ethereum Virtual Machine. |
39 | tx_env : |
40 | Environment for the transaction. |
41 | tx : |
42 | Transaction to be executed. |
43 |
|
44 | Returns |
45 | ------- |
46 | message: `ethereum.prague.vm.Message` |
47 | Items containing contract creation or message call specific data. |
48 | """ |
49 | accessed_addresses = set() |
50 | accessed_addresses.add(tx_env.origin) |
51 | accessed_addresses.update(PRE_COMPILED_CONTRACTS.keys()) |
52 | accessed_addresses.update(tx_env.access_list_addresses) |
53 | |
54 | if isinstance(tx.to, Bytes0): |
55 | current_target = compute_contract_address( |
56 | tx_env.origin, |
57 | get_account(block_env.state, tx_env.origin).nonce - Uint(1), |
58 | ) |
59 | msg_data = Bytes(b"") |
60 | code = tx.data |
61 | code_address = None |
62 | elif isinstance(tx.to, Address): |
63 | current_target = tx.to |
64 | msg_data = tx.data |
65 | code = get_account(block_env.state, tx.to).code |
66 | code_address = tx.to |
67 | else: |
68 | raise AssertionError("Target must be address or empty bytes") |
69 | |
70 | accessed_addresses.add(current_target) |
71 | |
72 | return Message( |
73 | block_env=block_env, |
74 | tx_env=tx_env, |
75 | caller=tx_env.origin, |
76 | target=tx.to, |
77 | gas=tx_env.gas, |
78 | value=tx.value, |
79 | data=msg_data, |
80 | code=code, |
81 | depth=Uint(0), |
82 | current_target=current_target, |
83 | code_address=code_address, |
84 | should_transfer_value=True, |
85 | is_static=False, |
86 | accessed_addresses=accessed_addresses, |
87 | accessed_storage_keys=set(tx_env.access_list_storage_keys), |
88 | disable_precompiles=False, |
89 | parent_evm=None, |
90 | ) |