ethereum.forks.spurious_dragon.vm.instructions.stackethereum.forks.byzantium.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.
def pop(evm: Evm) -> None:
| 25 | """ |
|---|---|
| 26 | Removes an item from the stack. |
| 27 | |
| 28 | Parameters |
| 29 | ---------- |
| 30 | evm : |
| 31 | The current EVM frame. |
| 32 | |
| 33 | """ |
| 34 | # STACK |
| 35 | stack.pop(evm.stack) |
| 36 | |
| 37 | # GAS |
| 38 | charge_gas(evm, GAS_BASE) |
| 39 | |
| 40 | # OPERATION |
| 41 | pass |
| 42 | |
| 43 | # PROGRAM COUNTER |
| 44 | evm.pc += Uint(1) |
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:
| 48 | """ |
|---|---|
| 49 | Pushes an N-byte immediate onto the stack. |
| 50 | |
| 51 | Parameters |
| 52 | ---------- |
| 53 | evm : |
| 54 | The current EVM frame. |
| 55 | |
| 56 | num_bytes : |
| 57 | The number of immediate bytes to be read from the code and pushed to |
| 58 | the stack. |
| 59 | |
| 60 | """ |
| 61 | # STACK |
| 62 | pass |
| 63 | |
| 64 | # GAS |
| 65 | charge_gas(evm, GAS_VERY_LOW) |
| 66 | |
| 67 | # OPERATION |
| 68 | data_to_push = U256.from_be_bytes( |
| 69 | buffer_read(evm.code, U256(evm.pc + Uint(1)), U256(num_bytes)) |
| 70 | ) |
| 71 | stack.push(evm.stack, data_to_push) |
| 72 | |
| 73 | # PROGRAM COUNTER |
| 74 | 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:
| 78 | """ |
|---|---|
| 79 | Duplicates the Nth stack item (from top of the stack) to the top of stack. |
| 80 | |
| 81 | Parameters |
| 82 | ---------- |
| 83 | evm : |
| 84 | The current EVM frame. |
| 85 | |
| 86 | item_number : |
| 87 | The stack item number (0-indexed from top of stack) to be duplicated |
| 88 | to the top of stack. |
| 89 | |
| 90 | """ |
| 91 | # STACK |
| 92 | pass |
| 93 | |
| 94 | # GAS |
| 95 | charge_gas(evm, GAS_VERY_LOW) |
| 96 | if item_number >= len(evm.stack): |
| 97 | raise StackUnderflowError |
| 98 | data_to_duplicate = evm.stack[len(evm.stack) - 1 - item_number] |
| 99 | stack.push(evm.stack, data_to_duplicate) |
| 100 | |
| 101 | # PROGRAM COUNTER |
| 102 | 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:
| 106 | """ |
|---|---|
| 107 | Swaps the top and the `item_number` element of the stack, where |
| 108 | the top of the stack is position zero. |
| 109 | |
| 110 | If `item_number` is zero, this function does nothing (which should not be |
| 111 | possible, since there is no `SWAP0` instruction). |
| 112 | |
| 113 | Parameters |
| 114 | ---------- |
| 115 | evm : |
| 116 | The current EVM frame. |
| 117 | |
| 118 | item_number : |
| 119 | The stack item number (0-indexed from top of stack) to be swapped |
| 120 | with the top of stack element. |
| 121 | |
| 122 | """ |
| 123 | # STACK |
| 124 | pass |
| 125 | |
| 126 | # GAS |
| 127 | charge_gas(evm, GAS_VERY_LOW) |
| 128 | if item_number >= len(evm.stack): |
| 129 | raise StackUnderflowError |
| 130 | evm.stack[-1], evm.stack[-1 - item_number] = ( |
| 131 | evm.stack[-1 - item_number], |
| 132 | evm.stack[-1], |
| 133 | ) |
| 134 | |
| 135 | # PROGRAM COUNTER |
| 136 | evm.pc += Uint(1) |
push1¶
| 139 | push1 = partial(push_n, num_bytes=1) |
|---|
push2¶
| 140 | push2 = partial(push_n, num_bytes=2) |
|---|
push3¶
| 141 | push3 = partial(push_n, num_bytes=3) |
|---|
push4¶
| 142 | push4 = partial(push_n, num_bytes=4) |
|---|
push5¶
| 143 | push5 = partial(push_n, num_bytes=5) |
|---|
push6¶
| 144 | push6 = partial(push_n, num_bytes=6) |
|---|
push7¶
| 145 | push7 = partial(push_n, num_bytes=7) |
|---|
push8¶
| 146 | push8 = partial(push_n, num_bytes=8) |
|---|
push9¶
| 147 | push9 = partial(push_n, num_bytes=9) |
|---|
push10¶
| 148 | push10 = partial(push_n, num_bytes=10) |
|---|
push11¶
| 149 | push11 = partial(push_n, num_bytes=11) |
|---|
push12¶
| 150 | push12 = partial(push_n, num_bytes=12) |
|---|
push13¶
| 151 | push13 = partial(push_n, num_bytes=13) |
|---|
push14¶
| 152 | push14 = partial(push_n, num_bytes=14) |
|---|
push15¶
| 153 | push15 = partial(push_n, num_bytes=15) |
|---|
push16¶
| 154 | push16 = partial(push_n, num_bytes=16) |
|---|
push17¶
| 155 | push17 = partial(push_n, num_bytes=17) |
|---|
push18¶
| 156 | push18 = partial(push_n, num_bytes=18) |
|---|
push19¶
| 157 | push19 = partial(push_n, num_bytes=19) |
|---|
push20¶
| 158 | push20 = partial(push_n, num_bytes=20) |
|---|
push21¶
| 159 | push21 = partial(push_n, num_bytes=21) |
|---|
push22¶
| 160 | push22 = partial(push_n, num_bytes=22) |
|---|
push23¶
| 161 | push23 = partial(push_n, num_bytes=23) |
|---|
push24¶
| 162 | push24 = partial(push_n, num_bytes=24) |
|---|
push25¶
| 163 | push25 = partial(push_n, num_bytes=25) |
|---|
push26¶
| 164 | push26 = partial(push_n, num_bytes=26) |
|---|
push27¶
| 165 | push27 = partial(push_n, num_bytes=27) |
|---|
push28¶
| 166 | push28 = partial(push_n, num_bytes=28) |
|---|
push29¶
| 167 | push29 = partial(push_n, num_bytes=29) |
|---|
push30¶
| 168 | push30 = partial(push_n, num_bytes=30) |
|---|
push31¶
| 169 | push31 = partial(push_n, num_bytes=31) |
|---|
push32¶
| 170 | push32 = partial(push_n, num_bytes=32) |
|---|
dup1¶
| 172 | dup1 = partial(dup_n, item_number=0) |
|---|
dup2¶
| 173 | dup2 = partial(dup_n, item_number=1) |
|---|
dup3¶
| 174 | dup3 = partial(dup_n, item_number=2) |
|---|
dup4¶
| 175 | dup4 = partial(dup_n, item_number=3) |
|---|
dup5¶
| 176 | dup5 = partial(dup_n, item_number=4) |
|---|
dup6¶
| 177 | dup6 = partial(dup_n, item_number=5) |
|---|
dup7¶
| 178 | dup7 = partial(dup_n, item_number=6) |
|---|
dup8¶
| 179 | dup8 = partial(dup_n, item_number=7) |
|---|
dup9¶
| 180 | dup9 = partial(dup_n, item_number=8) |
|---|
dup10¶
| 181 | dup10 = partial(dup_n, item_number=9) |
|---|
dup11¶
| 182 | dup11 = partial(dup_n, item_number=10) |
|---|
dup12¶
| 183 | dup12 = partial(dup_n, item_number=11) |
|---|
dup13¶
| 184 | dup13 = partial(dup_n, item_number=12) |
|---|
dup14¶
| 185 | dup14 = partial(dup_n, item_number=13) |
|---|
dup15¶
| 186 | dup15 = partial(dup_n, item_number=14) |
|---|
dup16¶
| 187 | dup16 = partial(dup_n, item_number=15) |
|---|
swap1¶
| 189 | swap1 = partial(swap_n, item_number=1) |
|---|
swap2¶
| 190 | swap2 = partial(swap_n, item_number=2) |
|---|
swap3¶
| 191 | swap3 = partial(swap_n, item_number=3) |
|---|
swap4¶
| 192 | swap4 = partial(swap_n, item_number=4) |
|---|
swap5¶
| 193 | swap5 = partial(swap_n, item_number=5) |
|---|
swap6¶
| 194 | swap6 = partial(swap_n, item_number=6) |
|---|
swap7¶
| 195 | swap7 = partial(swap_n, item_number=7) |
|---|
swap8¶
| 196 | swap8 = partial(swap_n, item_number=8) |
|---|
swap9¶
| 197 | swap9 = partial(swap_n, item_number=9) |
|---|
swap10¶
| 198 | swap10 = partial(swap_n, item_number=10) |
|---|
swap11¶
| 199 | swap11 = partial(swap_n, item_number=11) |
|---|
swap12¶
| 200 | swap12 = partial(swap_n, item_number=12) |
|---|
swap13¶
| 201 | swap13 = partial(swap_n, item_number=13) |
|---|
swap14¶
| 202 | swap14 = partial(swap_n, item_number=14) |
|---|
swap15¶
| 203 | swap15 = partial(swap_n, item_number=15) |
|---|
swap16¶
| 204 | swap16 = partial(swap_n, item_number=16) |
|---|