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
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) |
---|