Skip to content

Commit

Permalink
new(tests): Add generic precompile-absence test (#1036)
Browse files Browse the repository at this point in the history
* new(tests): Add precompile-absence test

* more parametrize

* fix(tests): Use zero gas to guarantee failure in case of unexpected precompile

* docs: Changelog

* fix: ruff
  • Loading branch information
marioevz authored Jan 10, 2025
1 parent aff955b commit ceb39e1
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 0 deletions.
1 change: 1 addition & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ Test fixtures for use by clients are available for each release on the [Github r
-[EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) set code of non-empty-storage account test ([#948](https://github.com/ethereum/execution-spec-tests/pull/948))
-[EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) Remove delegation behavior of EXTCODE* ([#984](https://github.com/ethereum/execution-spec-tests/pull/984))
-[EIP-7623](https://eips.ethereum.org/EIPS/eip-7623) Increase calldata cost ([#1004](https://github.com/ethereum/execution-spec-tests/pull/1004))
- ✨ Add generic precompile-absence test ([#1036](https://github.com/ethereum/execution-spec-tests/pull/1036))
- ✨ Add test for [EIP-2537](https://eips.ethereum.org/EIPS/eip-2537) which uses the full discount table of G2 MSM ([#1038](https://github.com/ethereum/execution-spec-tests/pull/1038))

### 🛠️ Framework
Expand Down
1 change: 1 addition & 0 deletions tests/frontier/precompiles/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Test for precompiles that apply for all forks starting from Frontier."""
74 changes: 74 additions & 0 deletions tests/frontier/precompiles/test_precompile_absence.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
"""abstract: Test Calling Precompile Range (close to zero)."""

import pytest

from ethereum_test_forks import Fork
from ethereum_test_tools import (
Account,
Address,
Alloc,
Bytecode,
StateTestFiller,
Storage,
Transaction,
)
from ethereum_test_tools import Opcodes as Op

UPPER_BOUND = 0x101
RETURNDATASIZE_OFFSET = 0x10000000000000000 # Must be greater than UPPER_BOUND


@pytest.mark.parametrize(
"calldata_size",
[
pytest.param(0, id="empty_calldata"),
pytest.param(31, id="31_bytes"),
pytest.param(32, id="32_bytes"),
],
)
@pytest.mark.valid_from("Byzantium")
def test_precompile_absence(
state_test: StateTestFiller,
pre: Alloc,
fork: Fork,
calldata_size: int,
):
"""Test that addresses close to zero are not precompiles unless active in the fork."""
active_precompiles = fork.precompiles()
storage = Storage()
call_code = Bytecode()
for address in range(1, UPPER_BOUND + 1):
if Address(address) in active_precompiles:
continue
call_code += Op.SSTORE(
address,
Op.CALL(gas=0, address=address, args_size=calldata_size),
)
storage[address] = 1
if Op.RETURNDATASIZE in fork.valid_opcodes():
call_code += Op.SSTORE(
address + RETURNDATASIZE_OFFSET,
Op.RETURNDATASIZE,
)
storage[address + RETURNDATASIZE_OFFSET] = 0

call_code += Op.STOP

entry_point_address = pre.deploy_contract(call_code, storage=storage.canary())

tx = Transaction(
to=entry_point_address,
gas_limit=10_000_000,
sender=pre.fund_eoa(),
protected=True,
)

state_test(
pre=pre,
tx=tx,
post={
entry_point_address: Account(
storage=storage,
)
},
)

0 comments on commit ceb39e1

Please sign in to comment.