Skip to content

test_worst_msize()

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

Generate fixtures for these test cases for Prague with:

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

Test running a block with as many MSIZE opcodes as possible.

The mem_size parameter indicates by how much the memory is expanded.

Source code in tests/zkevm/test_worst_compute.py
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
@pytest.mark.valid_from("Cancun")
@pytest.mark.parametrize("mem_size", [0, 1, 1_000, 100_000, 1_000_000])
def test_worst_msize(
    state_test: StateTestFiller,
    pre: Alloc,
    fork: Fork,
    mem_size: int,
):
    """
    Test running a block with as many MSIZE opcodes as possible.

    The `mem_size` parameter indicates by how much the memory is expanded.
    """
    env = Environment()
    max_stack_height = fork.max_stack_height()

    code_sequence = Op.MLOAD(Op.CALLVALUE) + Op.POP + Op.MSIZE * max_stack_height
    target_address = pre.deploy_contract(code=code_sequence)

    calldata = Bytecode()
    attack_block = Op.POP(Op.STATICCALL(Op.GAS, target_address, 0, 0, 0, 0))
    code = code_loop_precompile_call(calldata, attack_block, fork)
    assert len(code) <= fork.max_code_size()

    code_address = pre.deploy_contract(code=code)

    tx = Transaction(
        to=code_address,
        gas_limit=env.gas_limit,
        sender=pre.fund_eoa(),
        value=mem_size,
    )

    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) mem_size
...fork_Cancun-state_test-mem_size_0 0
...fork_Cancun-state_test-mem_size_1 1
...fork_Cancun-state_test-mem_size_1000 1000
...fork_Cancun-state_test-mem_size_100000 100000
...fork_Cancun-state_test-mem_size_1000000 1000000
...fork_Cancun-blockchain_test_from_state_test-mem_size_0 0
...fork_Cancun-blockchain_test_from_state_test-mem_size_1 1
...fork_Cancun-blockchain_test_from_state_test-mem_size_1000 1000
...fork_Cancun-blockchain_test_from_state_test-mem_size_100000 100000
...fork_Cancun-blockchain_test_from_state_test-mem_size_1000000 1000000
...fork_Prague-state_test-mem_size_0 0
...fork_Prague-state_test-mem_size_1 1
...fork_Prague-state_test-mem_size_1000 1000
...fork_Prague-state_test-mem_size_100000 100000
...fork_Prague-state_test-mem_size_1000000 1000000
...fork_Prague-blockchain_test_from_state_test-mem_size_0 0
...fork_Prague-blockchain_test_from_state_test-mem_size_1 1
...fork_Prague-blockchain_test_from_state_test-mem_size_1000 1000
...fork_Prague-blockchain_test_from_state_test-mem_size_100000 100000
...fork_Prague-blockchain_test_from_state_test-mem_size_1000000 1000000
...fork_Osaka-state_test-mem_size_0 0
...fork_Osaka-state_test-mem_size_1 1
...fork_Osaka-state_test-mem_size_1000 1000
...fork_Osaka-state_test-mem_size_100000 100000
...fork_Osaka-state_test-mem_size_1000000 1000000
...fork_Osaka-blockchain_test_from_state_test-mem_size_0 0
...fork_Osaka-blockchain_test_from_state_test-mem_size_1 1
...fork_Osaka-blockchain_test_from_state_test-mem_size_1000 1000
...fork_Osaka-blockchain_test_from_state_test-mem_size_100000 100000
...fork_Osaka-blockchain_test_from_state_test-mem_size_1000000 1000000