ethereum.forks.constantinople.vm.instructions.stackethereum.forks.istanbul.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
Remove item from stack.
Parameters
evm : The current EVM frame.
def pop(evm: Evm) -> None:
| 25 | """ |
|---|---|
| 26 | Remove item from 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 a 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 a 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
Duplicate 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 | Duplicate 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
Swap 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 | Swap 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) |
|---|