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)