ethereum.berlin.vm.instructions.bitwise

Ethereum Virtual Machine (EVM) Bitwise Instructions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. contents:: Table of Contents :backlinks: none :local:

Introduction

Implementations of the EVM bitwise instructions.

bitwise_and

Bitwise AND operation of the top 2 elements of the stack. Pushes the result back on the stack.

Parameters

evm : The current EVM frame.

def bitwise_and(evm: Evm) -> None:
23
    """
24
    Bitwise AND operation of the top 2 elements of the stack. Pushes the
25
    result back on the stack.
26
27
    Parameters
28
    ----------
29
    evm :
30
        The current EVM frame.
31
32
    """
33
    # STACK
34
    x = pop(evm.stack)
35
    y = pop(evm.stack)
36
37
    # GAS
38
    charge_gas(evm, GAS_VERY_LOW)
39
40
    # OPERATION
41
    push(evm.stack, x & y)
42
43
    # PROGRAM COUNTER
44
    evm.pc += Uint(1)

bitwise_or

Bitwise OR operation of the top 2 elements of the stack. Pushes the result back on the stack.

Parameters

evm : The current EVM frame.

def bitwise_or(evm: Evm) -> None:
48
    """
49
    Bitwise OR operation of the top 2 elements of the stack. Pushes the
50
    result back on the stack.
51
52
    Parameters
53
    ----------
54
    evm :
55
        The current EVM frame.
56
57
    """
58
    # STACK
59
    x = pop(evm.stack)
60
    y = pop(evm.stack)
61
62
    # GAS
63
    charge_gas(evm, GAS_VERY_LOW)
64
65
    # OPERATION
66
    push(evm.stack, x | y)
67
68
    # PROGRAM COUNTER
69
    evm.pc += Uint(1)

bitwise_xor

Bitwise XOR operation of the top 2 elements of the stack. Pushes the result back on the stack.

Parameters

evm : The current EVM frame.

def bitwise_xor(evm: Evm) -> None:
73
    """
74
    Bitwise XOR operation of the top 2 elements of the stack. Pushes the
75
    result back on the stack.
76
77
    Parameters
78
    ----------
79
    evm :
80
        The current EVM frame.
81
82
    """
83
    # STACK
84
    x = pop(evm.stack)
85
    y = pop(evm.stack)
86
87
    # GAS
88
    charge_gas(evm, GAS_VERY_LOW)
89
90
    # OPERATION
91
    push(evm.stack, x ^ y)
92
93
    # PROGRAM COUNTER
94
    evm.pc += Uint(1)

bitwise_not

Bitwise NOT operation of the top element of the stack. Pushes the result back on the stack.

Parameters

evm : The current EVM frame.

def bitwise_not(evm: Evm) -> None:
98
    """
99
    Bitwise NOT operation of the top element of the stack. Pushes the
100
    result back on the stack.
101
102
    Parameters
103
    ----------
104
    evm :
105
        The current EVM frame.
106
107
    """
108
    # STACK
109
    x = pop(evm.stack)
110
111
    # GAS
112
    charge_gas(evm, GAS_VERY_LOW)
113
114
    # OPERATION
115
    push(evm.stack, ~x)
116
117
    # PROGRAM COUNTER
118
    evm.pc += Uint(1)

get_byte

For a word (defined by next top element of the stack), retrieve the Nth byte (0-indexed and defined by top element of stack) from the left (most significant) to right (least significant).

Parameters

evm : The current EVM frame.

def get_byte(evm: Evm) -> None:
122
    """
123
    For a word (defined by next top element of the stack), retrieve the
124
    Nth byte (0-indexed and defined by top element of stack) from the
125
    left (most significant) to right (least significant).
126
127
    Parameters
128
    ----------
129
    evm :
130
        The current EVM frame.
131
132
    """
133
    # STACK
134
    byte_index = pop(evm.stack)
135
    word = pop(evm.stack)
136
137
    # GAS
138
    charge_gas(evm, GAS_VERY_LOW)
139
140
    # OPERATION
141
    if byte_index >= U256(32):
142
        result = U256(0)
143
    else:
144
        extra_bytes_to_right = U256(31) - byte_index
145
        # Remove the extra bytes in the right
146
        word = word >> (extra_bytes_to_right * U256(8))
147
        # Remove the extra bytes in the left
148
        word = word & U256(0xFF)
149
        result = word
150
151
    push(evm.stack, result)
152
153
    # PROGRAM COUNTER
154
    evm.pc += Uint(1)

bitwise_shl

Logical shift left (SHL) operation of the top 2 elements of the stack. Pushes the result back on the stack. Parameters

evm : The current EVM frame.

def bitwise_shl(evm: Evm) -> None:
158
    """
159
    Logical shift left (SHL) operation of the top 2 elements of the stack.
160
    Pushes the result back on the stack.
161
    Parameters
162
    ----------
163
    evm :
164
        The current EVM frame.
165
    """
166
    # STACK
167
    shift = Uint(pop(evm.stack))
168
    value = Uint(pop(evm.stack))
169
170
    # GAS
171
    charge_gas(evm, GAS_VERY_LOW)
172
173
    # OPERATION
174
    if shift < Uint(256):
175
        result = U256((value << shift) & Uint(U256.MAX_VALUE))
176
    else:
177
        result = U256(0)
178
179
    push(evm.stack, result)
180
181
    # PROGRAM COUNTER
182
    evm.pc += Uint(1)

bitwise_shr

Logical shift right (SHR) operation of the top 2 elements of the stack. Pushes the result back on the stack. Parameters

evm : The current EVM frame.

def bitwise_shr(evm: Evm) -> None:
186
    """
187
    Logical shift right (SHR) operation of the top 2 elements of the stack.
188
    Pushes the result back on the stack.
189
    Parameters
190
    ----------
191
    evm :
192
        The current EVM frame.
193
    """
194
    # STACK
195
    shift = pop(evm.stack)
196
    value = pop(evm.stack)
197
198
    # GAS
199
    charge_gas(evm, GAS_VERY_LOW)
200
201
    # OPERATION
202
    if shift < U256(256):
203
        result = value >> shift
204
    else:
205
        result = U256(0)
206
207
    push(evm.stack, result)
208
209
    # PROGRAM COUNTER
210
    evm.pc += Uint(1)

bitwise_sar

Arithmetic shift right (SAR) operation of the top 2 elements of the stack. Pushes the result back on the stack. Parameters

evm : The current EVM frame.

def bitwise_sar(evm: Evm) -> None:
214
    """
215
    Arithmetic shift right (SAR) operation of the top 2 elements of the stack.
216
    Pushes the result back on the stack.
217
    Parameters
218
    ----------
219
    evm :
220
        The current EVM frame.
221
    """
222
    # STACK
223
    shift = int(pop(evm.stack))
224
    signed_value = pop(evm.stack).to_signed()
225
226
    # GAS
227
    charge_gas(evm, GAS_VERY_LOW)
228
229
    # OPERATION
230
    if shift < 256:
231
        result = U256.from_signed(signed_value >> shift)
232
    elif signed_value >= 0:
233
        result = U256(0)
234
    else:
235
        result = U256.MAX_VALUE
236
237
    push(evm.stack, result)
238
239
    # PROGRAM COUNTER
240
    evm.pc += Uint(1)