ethereum.forks.arrow_glacier.vm.instructions.stackethereum.forks.gray_glacier.vm.instructions.stack
Ethereum Virtual Machine (EVM) Stack Instructions.
.. contents:: Table of Contents :backlinks: none :local:
Introduction
Implementations of the EVM stack related instructions.
pop ¶
Removes an item from the stack.
Parameters
evm : The current EVM frame.
push_n ¶
Pushes an N-byte immediate onto the stack.
Parameters
evm : The current EVM frame.
num_bytes : The number of immediate bytes to be read from the code and pushed to the stack.
def push_n(evm: Evm, num_bytes: int) -> None:
| 52 | <snip> |
|---|---|
| 65 | # STACK |
| 66 | pass |
| 67 | |
| 68 | # GAS |
| 69 | charge_gas(evm, GasCosts.OPCODE_PUSH) |
| 70 | |
| 71 | # OPERATION |
| 72 | data_to_push = U256.from_be_bytes( |
| 73 | buffer_read(evm.code, U256(evm.pc + Uint(1)), U256(num_bytes)) |
| 74 | ) |
| 75 | stack.push(evm.stack, data_to_push) |
| 76 | |
| 77 | # PROGRAM COUNTER |
| 78 | evm.pc += Uint(1) + Uint(num_bytes) |
dup_n ¶
Duplicates the Nth stack item (from top of the stack) to the top of stack.
Parameters
evm : The current EVM frame.
item_number : The stack item number (0-indexed from top of stack) to be duplicated to the top of stack.
def dup_n(evm: Evm, item_number: int) -> None:
| 82 | <snip> |
|---|---|
| 95 | # STACK |
| 96 | pass |
| 97 | |
| 98 | # GAS |
| 99 | charge_gas(evm, GasCosts.OPCODE_DUP) |
| 100 | if item_number >= len(evm.stack): |
| 101 | raise StackUnderflowError |
| 102 | data_to_duplicate = evm.stack[len(evm.stack) - 1 - item_number] |
| 103 | stack.push(evm.stack, data_to_duplicate) |
| 104 | |
| 105 | # PROGRAM COUNTER |
| 106 | evm.pc += Uint(1) |
swap_n ¶
Swaps the top and the item_number element of the stack, where
the top of the stack is position zero.
If item_number is zero, this function does nothing (which should not be
possible, since there is no SWAP0 instruction).
Parameters
evm : The current EVM frame.
item_number : The stack item number (0-indexed from top of stack) to be swapped with the top of stack element.
def swap_n(evm: Evm, item_number: int) -> None:
| 110 | <snip> |
|---|---|
| 127 | # STACK |
| 128 | pass |
| 129 | |
| 130 | # GAS |
| 131 | charge_gas(evm, GasCosts.OPCODE_SWAP) |
| 132 | if item_number >= len(evm.stack): |
| 133 | raise StackUnderflowError |
| 134 | evm.stack[-1], evm.stack[-1 - item_number] = ( |
| 135 | evm.stack[-1 - item_number], |
| 136 | evm.stack[-1], |
| 137 | ) |
| 138 | |
| 139 | # PROGRAM COUNTER |
| 140 | evm.pc += Uint(1) |
push1¶
| 143 | push1: Callable[[Evm], None] = partial(push_n, num_bytes=1) |
|---|
push2¶
| 144 | push2: Callable[[Evm], None] = partial(push_n, num_bytes=2) |
|---|
push3¶
| 145 | push3: Callable[[Evm], None] = partial(push_n, num_bytes=3) |
|---|
push4¶
| 146 | push4: Callable[[Evm], None] = partial(push_n, num_bytes=4) |
|---|
push5¶
| 147 | push5: Callable[[Evm], None] = partial(push_n, num_bytes=5) |
|---|
push6¶
| 148 | push6: Callable[[Evm], None] = partial(push_n, num_bytes=6) |
|---|
push7¶
| 149 | push7: Callable[[Evm], None] = partial(push_n, num_bytes=7) |
|---|
push8¶
| 150 | push8: Callable[[Evm], None] = partial(push_n, num_bytes=8) |
|---|
push9¶
| 151 | push9: Callable[[Evm], None] = partial(push_n, num_bytes=9) |
|---|
push10¶
| 152 | push10: Callable[[Evm], None] = partial(push_n, num_bytes=10) |
|---|
push11¶
| 153 | push11: Callable[[Evm], None] = partial(push_n, num_bytes=11) |
|---|
push12¶
| 154 | push12: Callable[[Evm], None] = partial(push_n, num_bytes=12) |
|---|
push13¶
| 155 | push13: Callable[[Evm], None] = partial(push_n, num_bytes=13) |
|---|
push14¶
| 156 | push14: Callable[[Evm], None] = partial(push_n, num_bytes=14) |
|---|
push15¶
| 157 | push15: Callable[[Evm], None] = partial(push_n, num_bytes=15) |
|---|
push16¶
| 158 | push16: Callable[[Evm], None] = partial(push_n, num_bytes=16) |
|---|
push17¶
| 159 | push17: Callable[[Evm], None] = partial(push_n, num_bytes=17) |
|---|
push18¶
| 160 | push18: Callable[[Evm], None] = partial(push_n, num_bytes=18) |
|---|
push19¶
| 161 | push19: Callable[[Evm], None] = partial(push_n, num_bytes=19) |
|---|
push20¶
| 162 | push20: Callable[[Evm], None] = partial(push_n, num_bytes=20) |
|---|
push21¶
| 163 | push21: Callable[[Evm], None] = partial(push_n, num_bytes=21) |
|---|
push22¶
| 164 | push22: Callable[[Evm], None] = partial(push_n, num_bytes=22) |
|---|
push23¶
| 165 | push23: Callable[[Evm], None] = partial(push_n, num_bytes=23) |
|---|
push24¶
| 166 | push24: Callable[[Evm], None] = partial(push_n, num_bytes=24) |
|---|
push25¶
| 167 | push25: Callable[[Evm], None] = partial(push_n, num_bytes=25) |
|---|
push26¶
| 168 | push26: Callable[[Evm], None] = partial(push_n, num_bytes=26) |
|---|
push27¶
| 169 | push27: Callable[[Evm], None] = partial(push_n, num_bytes=27) |
|---|
push28¶
| 170 | push28: Callable[[Evm], None] = partial(push_n, num_bytes=28) |
|---|
push29¶
| 171 | push29: Callable[[Evm], None] = partial(push_n, num_bytes=29) |
|---|
push30¶
| 172 | push30: Callable[[Evm], None] = partial(push_n, num_bytes=30) |
|---|
push31¶
| 173 | push31: Callable[[Evm], None] = partial(push_n, num_bytes=31) |
|---|
push32¶
| 174 | push32: Callable[[Evm], None] = partial(push_n, num_bytes=32) |
|---|
dup1¶
| 176 | dup1: Callable[[Evm], None] = partial(dup_n, item_number=0) |
|---|
dup2¶
| 177 | dup2: Callable[[Evm], None] = partial(dup_n, item_number=1) |
|---|
dup3¶
| 178 | dup3: Callable[[Evm], None] = partial(dup_n, item_number=2) |
|---|
dup4¶
| 179 | dup4: Callable[[Evm], None] = partial(dup_n, item_number=3) |
|---|
dup5¶
| 180 | dup5: Callable[[Evm], None] = partial(dup_n, item_number=4) |
|---|
dup6¶
| 181 | dup6: Callable[[Evm], None] = partial(dup_n, item_number=5) |
|---|
dup7¶
| 182 | dup7: Callable[[Evm], None] = partial(dup_n, item_number=6) |
|---|
dup8¶
| 183 | dup8: Callable[[Evm], None] = partial(dup_n, item_number=7) |
|---|
dup9¶
| 184 | dup9: Callable[[Evm], None] = partial(dup_n, item_number=8) |
|---|
dup10¶
| 185 | dup10: Callable[[Evm], None] = partial(dup_n, item_number=9) |
|---|
dup11¶
| 186 | dup11: Callable[[Evm], None] = partial(dup_n, item_number=10) |
|---|
dup12¶
| 187 | dup12: Callable[[Evm], None] = partial(dup_n, item_number=11) |
|---|
dup13¶
| 188 | dup13: Callable[[Evm], None] = partial(dup_n, item_number=12) |
|---|
dup14¶
| 189 | dup14: Callable[[Evm], None] = partial(dup_n, item_number=13) |
|---|
dup15¶
| 190 | dup15: Callable[[Evm], None] = partial(dup_n, item_number=14) |
|---|
dup16¶
| 191 | dup16: Callable[[Evm], None] = partial(dup_n, item_number=15) |
|---|
swap1¶
| 193 | swap1: Callable[[Evm], None] = partial(swap_n, item_number=1) |
|---|
swap2¶
| 194 | swap2: Callable[[Evm], None] = partial(swap_n, item_number=2) |
|---|
swap3¶
| 195 | swap3: Callable[[Evm], None] = partial(swap_n, item_number=3) |
|---|
swap4¶
| 196 | swap4: Callable[[Evm], None] = partial(swap_n, item_number=4) |
|---|
swap5¶
| 197 | swap5: Callable[[Evm], None] = partial(swap_n, item_number=5) |
|---|
swap6¶
| 198 | swap6: Callable[[Evm], None] = partial(swap_n, item_number=6) |
|---|
swap7¶
| 199 | swap7: Callable[[Evm], None] = partial(swap_n, item_number=7) |
|---|
swap8¶
| 200 | swap8: Callable[[Evm], None] = partial(swap_n, item_number=8) |
|---|
swap9¶
| 201 | swap9: Callable[[Evm], None] = partial(swap_n, item_number=9) |
|---|
swap10¶
| 202 | swap10: Callable[[Evm], None] = partial(swap_n, item_number=10) |
|---|
swap11¶
| 203 | swap11: Callable[[Evm], None] = partial(swap_n, item_number=11) |
|---|
swap12¶
| 204 | swap12: Callable[[Evm], None] = partial(swap_n, item_number=12) |
|---|
swap13¶
| 205 | swap13: Callable[[Evm], None] = partial(swap_n, item_number=13) |
|---|
swap14¶
| 206 | swap14: Callable[[Evm], None] = partial(swap_n, item_number=14) |
|---|
swap15¶
| 207 | swap15: Callable[[Evm], None] = partial(swap_n, item_number=15) |
|---|
swap16¶
| 208 | swap16: Callable[[Evm], None] = partial(swap_n, item_number=16) |
|---|