Skip to content

test_nested_call_chain()

Documentation for tests/benchmark/compute/instruction/test_system.py::test_nested_call_chain@ffe48572.

Generate fixtures for these test cases for Bogota with:

fill -v tests/benchmark/compute/instruction/test_system.py::test_nested_call_chain --gas-benchmark-values 1

Benchmark nested call frames that each enter a different contract.

Source code in tests/benchmark/compute/instruction/test_system.py
def test_nested_call_chain(
    benchmark_test: BenchmarkTestFiller,
    pre: Alloc,
    fork: Fork,
    tx_gas_limit: int,
    gas_benchmark_value: int,
) -> None:
    """Benchmark nested call frames that each enter a different contract."""
    # Overwriting the slot keeps the tail cheaper than filling a fresh one.
    tail = Op.SSTORE(0, 2, original_value=1, current_value=1, new_value=2)
    tail_address = pre.deploy_contract(code=tail, storage={0: 1})

    # Every level is a distinct account, so the first traversal pays cold
    # access all the way down.
    address = tail_address
    link = Op.POP(Op.CALL(gas=Op.GAS, address=address, address_warm=False))
    tail_call_gas = link.gas_cost(fork) + math.ceil(
        tail.gas_cost(fork) * 64 / 63
    )

    gas = min(tx_gas_limit, gas_benchmark_value)
    gas -= fork.transaction_intrinsic_cost_calculator()(
        return_cost_deducted_prior_execution=True
    )
    while True:
        forwarded_gas = gas - link.gas_cost(fork)
        forwarded_gas -= forwarded_gas // 64
        if forwarded_gas < tail_call_gas:
            break
        gas = forwarded_gas
        address = pre.deploy_contract(code=link)
        link = Op.POP(Op.CALL(gas=Op.GAS, address=address, address_warm=False))

    benchmark_test(
        target_opcode=Op.CALL,
        skip_gas_used_validation=True,
        post={tail_address: Account(storage={0: 2})},
        tx=Transaction(
            to=pre.deploy_contract(code=WhileGas(body=link, fork=fork)),
            sender=pre.fund_eoa(),
        ),
    )

Parametrized Test Cases

This test generates 1 parametrized test case across 4 forks.