ethereum.shanghai.vm.instructions.memoryethereum.cancun.vm.instructions.memory
Ethereum Virtual Machine (EVM) Memory Instructions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. contents:: Table of Contents :backlinks: none :local:
Introduction
Implementations of the EVM Memory instructions.
mstore
Stores a word to memory. This also expands the memory, if the memory is insufficient to store the word.
Parameters
evm : The current EVM frame.
def mstore(evm: Evm) -> None:
30 | """ |
---|---|
31 | Stores a word to memory. |
32 | This also expands the memory, if the memory is |
33 | insufficient to store the word. |
34 |
|
35 | Parameters |
36 | ---------- |
37 | evm : |
38 | The current EVM frame. |
39 |
|
40 | """ |
41 | # STACK |
42 | start_position = pop(evm.stack) |
43 | value = pop(evm.stack).to_be_bytes32() |
44 | |
45 | # GAS |
46 | extend_memory = calculate_gas_extend_memory( |
47 | evm.memory, [(start_position, U256(len(value)))] |
48 | ) |
49 | |
50 | charge_gas(evm, GAS_VERY_LOW + extend_memory.cost) |
51 | |
52 | # OPERATION |
53 | evm.memory += b"\x00" * extend_memory.expand_by |
54 | memory_write(evm.memory, start_position, value) |
55 | |
56 | # PROGRAM COUNTER |
57 | evm.pc += 1 |
mstore8
Stores a byte to memory. This also expands the memory, if the memory is insufficient to store the word.
Parameters
evm : The current EVM frame.
def mstore8(evm: Evm) -> None:
61 | """ |
---|---|
62 | Stores a byte to memory. |
63 | This also expands the memory, if the memory is |
64 | insufficient to store the word. |
65 |
|
66 | Parameters |
67 | ---------- |
68 | evm : |
69 | The current EVM frame. |
70 |
|
71 | """ |
72 | # STACK |
73 | start_position = pop(evm.stack) |
74 | value = pop(evm.stack) |
75 | |
76 | # GAS |
77 | extend_memory = calculate_gas_extend_memory( |
78 | evm.memory, [(start_position, U256(1))] |
79 | ) |
80 | |
81 | charge_gas(evm, GAS_VERY_LOW + extend_memory.cost) |
82 | |
83 | # OPERATION |
84 | evm.memory += b"\x00" * extend_memory.expand_by |
85 | normalized_bytes_value = Bytes([value & 0xFF]) |
86 | memory_write(evm.memory, start_position, normalized_bytes_value) |
87 | |
88 | # PROGRAM COUNTER |
89 | evm.pc += 1 |
mload
Load word from memory.
Parameters
evm : The current EVM frame.
def mload(evm: Evm) -> None:
93 | """ |
---|---|
94 | Load word from memory. |
95 |
|
96 | Parameters |
97 | ---------- |
98 | evm : |
99 | The current EVM frame. |
100 |
|
101 | """ |
102 | # STACK |
103 | start_position = pop(evm.stack) |
104 | |
105 | # GAS |
106 | extend_memory = calculate_gas_extend_memory( |
107 | evm.memory, [(start_position, U256(32))] |
108 | ) |
109 | charge_gas(evm, GAS_VERY_LOW + extend_memory.cost) |
110 | |
111 | # OPERATION |
112 | evm.memory += b"\x00" * extend_memory.expand_by |
113 | value = U256.from_be_bytes( |
114 | memory_read_bytes(evm.memory, start_position, U256(32)) |
115 | ) |
116 | push(evm.stack, value) |
117 | |
118 | # PROGRAM COUNTER |
119 | evm.pc += 1 |
msize
Push the size of active memory in bytes onto the stack.
Parameters
evm : The current EVM frame.
def msize(evm: Evm) -> None:
123 | """ |
---|---|
124 | Push the size of active memory in bytes onto the stack. |
125 |
|
126 | Parameters |
127 | ---------- |
128 | evm : |
129 | The current EVM frame. |
130 |
|
131 | """ |
132 | # STACK |
133 | pass |
134 | |
135 | # GAS |
136 | charge_gas(evm, GAS_BASE) |
137 | |
138 | # OPERATION |
139 | push(evm.stack, U256(len(evm.memory))) |
140 | |
141 | # PROGRAM COUNTER |
142 | evm.pc += 1 |
mcopy
Copy the bytes in memory from one location to another.
Parameters
evm : The current EVM frame.
def mcopy(evm: Evm) -> None:
146 | """ |
---|---|
147 | Copy the bytes in memory from one location to another. |
148 |
|
149 | Parameters |
150 | ---------- |
151 | evm : |
152 | The current EVM frame. |
153 |
|
154 | """ |
155 | # STACK |
156 | destination = pop(evm.stack) |
157 | source = pop(evm.stack) |
158 | length = pop(evm.stack) |
159 | |
160 | # GAS |
161 | words = ceil32(Uint(length)) // 32 |
162 | copy_gas_cost = GAS_COPY * words |
163 | |
164 | extend_memory = calculate_gas_extend_memory( |
165 | evm.memory, [(source, length), (destination, length)] |
166 | ) |
167 | charge_gas(evm, GAS_VERY_LOW + copy_gas_cost + extend_memory.cost) |
168 | |
169 | # OPERATION |
170 | evm.memory += b"\x00" * extend_memory.expand_by |
171 | value = memory_read_bytes(evm.memory, source, length) |
172 | memory_write(evm.memory, destination, value) |
173 | |
174 | # PROGRAM COUNTER |
175 | evm.pc += 1 |