Skip to content

test_all_opcodes()

Documentation for tests/frontier/opcodes/test_all_opcodes.py::test_all_opcodes@bfe359d3.

Generate fixtures for these test cases for Prague with:

fill -v tests/frontier/opcodes/test_all_opcodes.py::test_all_opcodes --fork Prague

Test each possible opcode on the fork with a single contract that calls each opcode in succession. Check that each subcall passes if the opcode is supported and fails otherwise.

Source code in tests/frontier/opcodes/test_all_opcodes.py
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
@pytest.mark.ported_from(
    [
        "https://github.com/ethereum/tests/blob/v13.3/src/GeneralStateTestsFiller/stBadOpcode/badOpcodesFiller.json",
        "https://github.com/ethereum/tests/blob/v13.3/src/GeneralStateTestsFiller/stBugs/evmBytecodeFiller.json",
    ],
    pr=["https://github.com/ethereum/execution-spec-tests/pull/748"],
)
@pytest.mark.valid_from("Frontier")
def test_all_opcodes(state_test: StateTestFiller, pre: Alloc, fork: Fork):
    """
    Test each possible opcode on the fork with a single contract that
    calls each opcode in succession. Check that each subcall passes
    if the opcode is supported and fails otherwise.
    """
    code_worked = 1000

    code_contract: Dict[Opcode, Address] = {}
    for opcode in sorted(set(Op) | set(UndefinedOpcodes)):
        code_contract[opcode] = pre.deploy_contract(
            balance=10,
            code=prepare_stack(opcode) + opcode + prepare_suffix(opcode),
            storage={},
        )

    # EVM code to make the call and store the result
    contract_address = pre.deploy_contract(
        code=sum(
            Op.SSTORE(
                Op.PUSH1(opcode.int()),
                # Limit gas to limit the gas consumed by the exceptional aborts in each
                # subcall that uses an undefined opcode.
                Op.CALL(35_000, opcode_address, 0, 0, 0, 0, 0),
            )
            for opcode, opcode_address in code_contract.items()
        )
        + Op.SSTORE(code_worked, 1)
        + Op.STOP,
    )

    post = {
        contract_address: Account(
            storage={
                **{
                    opcode.int(): 1 if opcode != Op.REVERT else 0
                    for opcode in fork.valid_opcodes()
                },
                code_worked: 1,
            }
        ),
    }

    tx = Transaction(
        sender=pre.fund_eoa(),
        gas_limit=9_000_000,
        to=contract_address,
        data=b"",
        value=0,
        protected=False,
    )

    state_test(pre=pre, post=post, tx=tx)

Parametrized Test Cases

This test case is only parametrized by fork and fixture format.

Test ID (Abbreviated)
...fork_Frontier-state_test
...fork_Frontier-blockchain_test_from_state_test
...fork_Homestead-state_test
...fork_Homestead-blockchain_test_from_state_test
...fork_Byzantium-state_test
...fork_Byzantium-blockchain_test_from_state_test
...fork_Constantinople-state_test
...fork_Constantinople-blockchain_test_from_state_test
...fork_ConstantinopleFix-state_test
...fork_ConstantinopleFix-blockchain_test_from_state_test
...fork_Istanbul-state_test
...fork_Istanbul-blockchain_test_from_state_test
...fork_Berlin-state_test
...fork_Berlin-blockchain_test_from_state_test
...fork_London-state_test
...fork_London-blockchain_test_from_state_test
...fork_Paris-state_test
...fork_Paris-blockchain_test_from_state_test
...fork_Shanghai-state_test
...fork_Shanghai-blockchain_test_from_state_test
...fork_Cancun-state_test
...fork_Cancun-blockchain_test_from_state_test
...fork_Prague-state_test
...fork_Prague-blockchain_test_from_state_test
...fork_Osaka-state_test
...fork_Osaka-blockchain_test_from_state_test