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