Skip to content

test_worst_returndatasize_nonzero()

Documentation for tests/zkevm/test_worst_compute.py::test_worst_returndatasize_nonzero@64f949d0.

Generate fixtures for these test cases for Prague with:

fill -v tests/zkevm/test_worst_compute.py::test_worst_returndatasize_nonzero --fork Prague

Test running a block which execute as many RETURNDATASIZE opcodes which return a non-zero buffer as possible.

The returned_size parameter indicates the size of the returned data buffer. The return_data_style indicates how returned data is produced for the opcode caller.

Source code in tests/zkevm/test_worst_compute.py
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
@pytest.mark.valid_from("Cancun")
@pytest.mark.parametrize(
    "return_data_style",
    [
        ReturnDataStyle.RETURN,
        ReturnDataStyle.REVERT,
        ReturnDataStyle.IDENTITY,
    ],
)
@pytest.mark.parametrize("returned_size", [1, 0])
def test_worst_returndatasize_nonzero(
    state_test: StateTestFiller,
    pre: Alloc,
    fork: Fork,
    returned_size: int,
    return_data_style: ReturnDataStyle,
):
    """
    Test running a block which execute as many RETURNDATASIZE opcodes which return a non-zero
    buffer as possible.

    The `returned_size` parameter indicates the size of the returned data buffer.
    The `return_data_style` indicates how returned data is produced for the opcode caller.
    """
    env = Environment()
    max_code_size = fork.max_code_size()

    dummy_contract_call = Bytecode()
    if return_data_style != ReturnDataStyle.IDENTITY:
        dummy_contract_call = Op.STATICCALL(
            address=pre.deploy_contract(
                code=Op.REVERT(0, returned_size)
                if return_data_style == ReturnDataStyle.REVERT
                else Op.RETURN(0, returned_size)
            )
        )
    else:
        dummy_contract_call = Op.MSTORE8(0, 1) + Op.STATICCALL(
            address=0x04,  # Identity precompile
            args_size=returned_size,
        )

    code_prefix = dummy_contract_call + Op.JUMPDEST
    iter_loop = Op.POP(Op.RETURNDATASIZE)
    code_suffix = Op.JUMP(len(code_prefix) - 1)
    code_iter_len = (max_code_size - len(code_prefix) - len(code_suffix)) // len(iter_loop)
    code = code_prefix + iter_loop * code_iter_len + code_suffix
    assert len(code) <= max_code_size

    tx = Transaction(
        to=pre.deploy_contract(code=bytes(code)),
        gas_limit=env.gas_limit,
        sender=pre.fund_eoa(),
    )

    state_test(
        env=env,
        pre=pre,
        post={},
        tx=tx,
    )

Parametrized Test Cases

The interactive table below is also available as a standalone page.

Test ID (Abbreviated) returned_size return_data_style
...fork_Cancun-state_test-returned_size_1-return_data_style_ReturnDataStyle.RETURN 1 ReturnDataStyle.RETURN
...fork_Cancun-state_test-returned_size_1-return_data_style_ReturnDataStyle.REVERT 1 ReturnDataStyle.REVERT
...fork_Cancun-state_test-returned_size_1-return_data_style_ReturnDataStyle.IDENTITY 1 ReturnDataStyle.IDENTITY
...fork_Cancun-state_test-returned_size_0-return_data_style_ReturnDataStyle.RETURN 0 ReturnDataStyle.RETURN
...fork_Cancun-state_test-returned_size_0-return_data_style_ReturnDataStyle.REVERT 0 ReturnDataStyle.REVERT
...fork_Cancun-state_test-returned_size_0-return_data_style_ReturnDataStyle.IDENTITY 0 ReturnDataStyle.IDENTITY
...fork_Cancun-blockchain_test_from_state_test-returned_size_1-return_data_style_ReturnDataStyle.RETURN 1 ReturnDataStyle.RETURN
...fork_Cancun-blockchain_test_from_state_test-returned_size_1-return_data_style_ReturnDataStyle.REVERT 1 ReturnDataStyle.REVERT
...fork_Cancun-blockchain_test_from_state_test-returned_size_1-return_data_style_ReturnDataStyle.IDENTITY 1 ReturnDataStyle.IDENTITY
...fork_Cancun-blockchain_test_from_state_test-returned_size_0-return_data_style_ReturnDataStyle.RETURN 0 ReturnDataStyle.RETURN
...fork_Cancun-blockchain_test_from_state_test-returned_size_0-return_data_style_ReturnDataStyle.REVERT 0 ReturnDataStyle.REVERT
...fork_Cancun-blockchain_test_from_state_test-returned_size_0-return_data_style_ReturnDataStyle.IDENTITY 0 ReturnDataStyle.IDENTITY
...fork_Prague-state_test-returned_size_1-return_data_style_ReturnDataStyle.RETURN 1 ReturnDataStyle.RETURN
...fork_Prague-state_test-returned_size_1-return_data_style_ReturnDataStyle.REVERT 1 ReturnDataStyle.REVERT
...fork_Prague-state_test-returned_size_1-return_data_style_ReturnDataStyle.IDENTITY 1 ReturnDataStyle.IDENTITY
...fork_Prague-state_test-returned_size_0-return_data_style_ReturnDataStyle.RETURN 0 ReturnDataStyle.RETURN
...fork_Prague-state_test-returned_size_0-return_data_style_ReturnDataStyle.REVERT 0 ReturnDataStyle.REVERT
...fork_Prague-state_test-returned_size_0-return_data_style_ReturnDataStyle.IDENTITY 0 ReturnDataStyle.IDENTITY
...fork_Prague-blockchain_test_from_state_test-returned_size_1-return_data_style_ReturnDataStyle.RETURN 1 ReturnDataStyle.RETURN
...fork_Prague-blockchain_test_from_state_test-returned_size_1-return_data_style_ReturnDataStyle.REVERT 1 ReturnDataStyle.REVERT
...fork_Prague-blockchain_test_from_state_test-returned_size_1-return_data_style_ReturnDataStyle.IDENTITY 1 ReturnDataStyle.IDENTITY
...fork_Prague-blockchain_test_from_state_test-returned_size_0-return_data_style_ReturnDataStyle.RETURN 0 ReturnDataStyle.RETURN
...fork_Prague-blockchain_test_from_state_test-returned_size_0-return_data_style_ReturnDataStyle.REVERT 0 ReturnDataStyle.REVERT
...fork_Prague-blockchain_test_from_state_test-returned_size_0-return_data_style_ReturnDataStyle.IDENTITY 0 ReturnDataStyle.IDENTITY
...fork_Osaka-state_test-returned_size_1-return_data_style_ReturnDataStyle.RETURN 1 ReturnDataStyle.RETURN
...fork_Osaka-state_test-returned_size_1-return_data_style_ReturnDataStyle.REVERT 1 ReturnDataStyle.REVERT
...fork_Osaka-state_test-returned_size_1-return_data_style_ReturnDataStyle.IDENTITY 1 ReturnDataStyle.IDENTITY
...fork_Osaka-state_test-returned_size_0-return_data_style_ReturnDataStyle.RETURN 0 ReturnDataStyle.RETURN
...fork_Osaka-state_test-returned_size_0-return_data_style_ReturnDataStyle.REVERT 0 ReturnDataStyle.REVERT
...fork_Osaka-state_test-returned_size_0-return_data_style_ReturnDataStyle.IDENTITY 0 ReturnDataStyle.IDENTITY
...fork_Osaka-blockchain_test_from_state_test-returned_size_1-return_data_style_ReturnDataStyle.RETURN 1 ReturnDataStyle.RETURN
...fork_Osaka-blockchain_test_from_state_test-returned_size_1-return_data_style_ReturnDataStyle.REVERT 1 ReturnDataStyle.REVERT
...fork_Osaka-blockchain_test_from_state_test-returned_size_1-return_data_style_ReturnDataStyle.IDENTITY 1 ReturnDataStyle.IDENTITY
...fork_Osaka-blockchain_test_from_state_test-returned_size_0-return_data_style_ReturnDataStyle.RETURN 0 ReturnDataStyle.RETURN
...fork_Osaka-blockchain_test_from_state_test-returned_size_0-return_data_style_ReturnDataStyle.REVERT 0 ReturnDataStyle.REVERT
...fork_Osaka-blockchain_test_from_state_test-returned_size_0-return_data_style_ReturnDataStyle.IDENTITY 0 ReturnDataStyle.IDENTITY