Skip to content

test_worst_tstore()

Documentation for tests/benchmark/test_worst_compute.py::test_worst_tstore@0f7c73a7.

Generate fixtures for these test cases for Prague with:

fill -v tests/benchmark/test_worst_compute.py::test_worst_tstore --fork Prague

Test running a block with as many TSTORE calls as possible.

Source code in tests/benchmark/test_worst_compute.py
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
@pytest.mark.valid_from("Cancun")
@pytest.mark.parametrize("key_mut", [True, False])
@pytest.mark.parametrize("dense_val_mut", [True, False])
def test_worst_tstore(
    state_test: StateTestFiller,
    fork: Fork,
    pre: Alloc,
    key_mut: bool,
    dense_val_mut: bool,
):
    """Test running a block with as many TSTORE calls as possible."""
    env = Environment()
    max_code_size = fork.max_code_size()

    init_key = 42
    code_prefix = Op.PUSH1(init_key) + Op.JUMPDEST

    # If `key_mut` is True, we mutate the key on every iteration of the big loop.
    code_key_mut = Op.POP + Op.GAS if key_mut else Bytecode()
    code_suffix = code_key_mut + Op.JUMP(len(code_prefix) - 1)

    # If `dense_val_mut` is set, we use GAS as a cheap way of always storing a different value than
    # the previous one.
    loop_iter = Op.TSTORE(Op.DUP2, Op.GAS if dense_val_mut else Op.DUP1)

    code_body_len = (max_code_size - len(code_prefix) - len(code_suffix)) // len(loop_iter)
    code_body = loop_iter * code_body_len
    code = code_prefix + code_body + code_suffix
    assert len(code) <= max_code_size

    tx = Transaction(
        to=pre.deploy_contract(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) dense_val_mut key_mut
...fork_Cancun-state_test-dense_val_mut_True-key_mut_True True True
...fork_Cancun-state_test-dense_val_mut_True-key_mut_False True False
...fork_Cancun-state_test-dense_val_mut_False-key_mut_True False True
...fork_Cancun-state_test-dense_val_mut_False-key_mut_False False False
...fork_Cancun-blockchain_test_from_state_test-dense_val_mut_True-key_mut_True True True
...fork_Cancun-blockchain_test_from_state_test-dense_val_mut_True-key_mut_False True False
...fork_Cancun-blockchain_test_from_state_test-dense_val_mut_False-key_mut_True False True
...fork_Cancun-blockchain_test_from_state_test-dense_val_mut_False-key_mut_False False False
...fork_Prague-state_test-dense_val_mut_True-key_mut_True True True
...fork_Prague-state_test-dense_val_mut_True-key_mut_False True False
...fork_Prague-state_test-dense_val_mut_False-key_mut_True False True
...fork_Prague-state_test-dense_val_mut_False-key_mut_False False False
...fork_Prague-blockchain_test_from_state_test-dense_val_mut_True-key_mut_True True True
...fork_Prague-blockchain_test_from_state_test-dense_val_mut_True-key_mut_False True False
...fork_Prague-blockchain_test_from_state_test-dense_val_mut_False-key_mut_True False True
...fork_Prague-blockchain_test_from_state_test-dense_val_mut_False-key_mut_False False False
...fork_Osaka-state_test-dense_val_mut_True-key_mut_True True True
...fork_Osaka-state_test-dense_val_mut_True-key_mut_False True False
...fork_Osaka-state_test-dense_val_mut_False-key_mut_True False True
...fork_Osaka-state_test-dense_val_mut_False-key_mut_False False False
...fork_Osaka-blockchain_test_from_state_test-dense_val_mut_True-key_mut_True True True
...fork_Osaka-blockchain_test_from_state_test-dense_val_mut_True-key_mut_False True False
...fork_Osaka-blockchain_test_from_state_test-dense_val_mut_False-key_mut_True False True
...fork_Osaka-blockchain_test_from_state_test-dense_val_mut_False-key_mut_False False False