ethereum.forks.homestead.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) | 
|---|