Skip to content

Test Push0

Documentation for tests/shanghai/eip3855_push0/test_push0.py.

Generate fixtures for these test cases with:

fill -v tests/shanghai/eip3855_push0/test_push0.py
Tests EIP-3855: PUSH0 Instruction

Tests for EIP-3855: PUSH0 Instruction.

Tests ported from:

test_push0_key_sstore(state_test, env, pre, post, tx, addr_1)

Use PUSH0 to set a key for SSTORE.

Source code in tests/shanghai/eip3855_push0/test_push0.py
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
def test_push0_key_sstore(
    state_test: StateTestFiller,
    env: Environment,
    pre: dict,
    post: dict,
    tx: Transaction,
    addr_1: str,
):
    """
    Use PUSH0 to set a key for SSTORE.
    """
    code = Op.SSTORE(Op.PUSH0, 1)

    pre[addr_1] = Account(code=code)
    post[addr_1] = Account(storage={0x00: 0x01})

    state_test(env=env, pre=pre, post=post, tx=tx, tag="key_sstore")

test_push0_fill_stack(state_test, env, pre, post, tx, addr_1)

Fill stack with PUSH0, then OR all values and save using SSTORE.

Source code in tests/shanghai/eip3855_push0/test_push0.py
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
def test_push0_fill_stack(
    state_test: StateTestFiller,
    env: Environment,
    pre: dict,
    post: dict,
    tx: Transaction,
    addr_1: str,
):
    """
    Fill stack with PUSH0, then OR all values and save using SSTORE.
    """
    code = Op.PUSH0 * 1024
    code += Op.OR * 1023
    code += Op.SSTORE(Op.SWAP1, 1)

    pre[addr_1] = Account(code=code)
    post[addr_1] = Account(storage={0x00: 0x01})

    state_test(env=env, pre=pre, post=post, tx=tx, tag="fill_stack")

test_push0_stack_overflow(state_test, env, pre, post, tx, addr_1)

Stack overflow by using PUSH0 1025 times.

Source code in tests/shanghai/eip3855_push0/test_push0.py
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
def test_push0_stack_overflow(
    state_test: StateTestFiller,
    env: Environment,
    pre: dict,
    post: dict,
    tx: Transaction,
    addr_1: str,
):
    """
    Stack overflow by using PUSH0 1025 times.
    """
    code = Op.SSTORE(Op.PUSH0, 1)
    code += Op.PUSH0 * 1025

    pre[addr_1] = Account(code=code)
    post[addr_1] = Account(storage={0x00: 0x00})

    state_test(env=env, pre=pre, post=post, tx=tx, tag="stack_overflow")

test_push0_storage_overwrite(state_test, env, pre, post, tx, addr_1)

Update an already existing storage value.

Source code in tests/shanghai/eip3855_push0/test_push0.py
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
def test_push0_storage_overwrite(
    state_test: StateTestFiller,
    env: Environment,
    pre: dict,
    post: dict,
    tx: Transaction,
    addr_1: str,
):
    """
    Update an already existing storage value.
    """
    code = Op.SSTORE(Op.PUSH0, 2) + Op.SSTORE(1, Op.PUSH0)

    pre[addr_1] = Account(code=code, storage={0x00: 0x0A, 0x01: 0x0A})
    post[addr_1] = Account(storage={0x00: 0x02, 0x01: 0x00})

    state_test(env=env, pre=pre, post=post, tx=tx, tag="storage_overwrite")

test_push0_during_staticcall(state_test, env, pre, post, tx, addr_1)

Test PUSH0 during STATICCALL.

Source code in tests/shanghai/eip3855_push0/test_push0.py
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
def test_push0_during_staticcall(
    state_test: StateTestFiller,
    env: Environment,
    pre: dict,
    post: dict,
    tx: Transaction,
    addr_1: str,
):
    """
    Test PUSH0 during STATICCALL.
    """
    addr_2 = Address(0x200)

    code_1 = (
        Op.SSTORE(0, Op.STATICCALL(100000, 0x200, 0, 0, 0, 0))
        + Op.SSTORE(0, 1)
        + Op.RETURNDATACOPY(0x1F, 0, 1)
        + Op.SSTORE(1, Op.MLOAD(0))
    )
    code_2 = Op.MSTORE8(Op.PUSH0, 0xFF) + Op.RETURN(Op.PUSH0, 1)

    pre[addr_1] = Account(code=code_1)
    pre[addr_2] = Account(code=code_2)
    post[addr_1] = Account(storage={0x00: 0x01, 0x01: 0xFF})

    state_test(env=env, pre=pre, post=post, tx=tx, tag="during_staticcall")

test_push0_before_jumpdest(state_test, env, pre, post, tx, addr_1)

Jump to a JUMPDEST next to a PUSH0, must succeed.

Source code in tests/shanghai/eip3855_push0/test_push0.py
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
def test_push0_before_jumpdest(
    state_test: StateTestFiller,
    env: Environment,
    pre: dict,
    post: dict,
    tx: Transaction,
    addr_1: str,
):
    """
    Jump to a JUMPDEST next to a PUSH0, must succeed.
    """
    code = Op.PUSH1(4) + Op.JUMP + Op.PUSH0 + Op.JUMPDEST + Op.SSTORE(Op.PUSH0, 1) + Op.STOP

    pre[addr_1] = Account(code=code)
    post[addr_1] = Account(storage={0x00: 0x01})

    state_test(env=env, pre=pre, post=post, tx=tx, tag="before_jumpdest")

test_push0_gas_cost(state_test, env, pre, post, tx, addr_1)

Test PUSH0 gas cost.

Source code in tests/shanghai/eip3855_push0/test_push0.py
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
def test_push0_gas_cost(
    state_test: StateTestFiller,
    env: Environment,
    pre: dict,
    post: dict,
    tx: Transaction,
    addr_1: str,
):
    """
    Test PUSH0 gas cost.
    """
    code = CodeGasMeasure(
        code=Op.PUSH0,
        extra_stack_items=1,
    )

    pre[addr_1] = Account(code=code)
    post[addr_1] = Account(storage={0x00: 0x02})

    state_test(env=env, pre=pre, post=post, tx=tx, tag="gas_cost")