Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ jobs:

- name: Run Tox (CPython)
if: "${{ !startsWith(matrix.py, 'pypy') }}"
run: tox -e static,optimized,py3
run: tox -e static,py3_eest,optimized,py3

- name: Run Tox (PyPy)
if: "${{ startsWith(matrix.py, 'pypy') }}"
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,5 @@ pip-delete-this-directory.txt
tests/execution-spec-generated-tests
tests/fixtures
tests/t8n_testdata

fixtures
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "eest_tests"]
path = eest_tests
url = https://github.com/ethereum/execution-spec-tests
8 changes: 8 additions & 0 deletions conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import pytest
from ethereum_spec_tools.evm_tools.t8n.transition_tool import EELST8N
from ethereum_clis import TransitionTool


@pytest.hookimpl(tryfirst=True)
def pytest_configure(config):
TransitionTool.set_default_tool(EELST8N)
1 change: 1 addition & 0 deletions eest_tests
Submodule eest_tests added at dd83fb
23 changes: 23 additions & 0 deletions pytest-eest.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
[pytest]
console_output_style = count
minversion = 7.0
python_files = *.py
testpaths = tests/
markers =
slow
pre_alloc_modify
ported_from
addopts =
-p pytest_plugins.concurrency
-p pytest_plugins.filler.pre_alloc
-p pytest_plugins.solc.solc
-p pytest_plugins.filler.filler
-p pytest_plugins.filler.static_filler
-p pytest_plugins.shared.execute_fill
-p pytest_plugins.forks.forks
-p pytest_plugins.help.help
--tb short
--ignore tests/cancun/eip4844_blobs/point_evaluation_vectors/
# these customizations require the pytest-custom-report plugin
report_passed_verbose = FILLED
report_xpassed_verbose = XFILLED
7 changes: 5 additions & 2 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,8 @@ install_requires =
ethereum-types>=0.2.1,<0.3
ethereum-rlp>=0.1.4,<0.2
cryptography>=45.0.1,<46
ethereum-execution-spec-tests @ git+https://github.com/ethereum/execution-spec-tests@dd83fba10492e6f63453b1a35608900b3aee1a87
ethereum-spec-evm-resolver @ git+https://github.com/petertdavies/ethereum-spec-evm-resolver

[options.package_data]
ethereum =
Expand All @@ -158,6 +160,7 @@ console_scripts =
ethereum-spec-new-fork = ethereum_spec_tools.new_fork:main
ethereum-spec-patch = ethereum_spec_tools.patch_tool:main
ethereum-spec-evm = ethereum_spec_tools.evm_tools:main
ethereum-spec-fill = cli.pytest_commands.fill:fill

docc.plugins =
ethereum_spec_tools.docc.discover = ethereum_spec_tools.docc:EthereumDiscover
Expand All @@ -172,11 +175,11 @@ docc.plugins.html =

[options.extras_require]
test =
pytest>=7.4.0,<8
pytest>=8,<9
pytest-cov>=4.1.0,<5
pytest-xdist>=3.3.1,<4
GitPython>=3.1.0,<3.2
filelock>=3.12.3,<3.13
filelock>=3.15.1,<4
requests
requests-cache>=1.2.1,<2

Expand Down
4 changes: 2 additions & 2 deletions src/ethereum/osaka/vm/instructions/bitwise.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from ethereum_types.numeric import U256, Uint

from .. import Evm
from ..gas import GAS_VERY_LOW, charge_gas
from ..gas import GAS_LOW, GAS_VERY_LOW, charge_gas
from ..stack import pop, push


Expand Down Expand Up @@ -256,7 +256,7 @@ def count_leading_zeros(evm: Evm) -> None:
x = pop(evm.stack)

# GAS
charge_gas(evm, GAS_VERY_LOW)
charge_gas(evm, GAS_LOW)

# OPERATION
bit_length = U256(x.bit_length())
Expand Down
2 changes: 1 addition & 1 deletion src/ethereum_spec_tools/evm_tools/t8n/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ def read_block_hashes(self, data: Any, t8n: "T8N") -> None:
clean_block_hashes: Dict[int, Hash32] = {}
if "blockHashes" in data:
for key, value in data["blockHashes"].items():
int_key = int(key, 16)
int_key = int(key)
clean_block_hashes[int_key] = Hash32(hex_to_bytes(value))

# Store a maximum of 256 block hashes.
Expand Down
128 changes: 128 additions & 0 deletions src/ethereum_spec_tools/evm_tools/t8n/transition_tool.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
"""
Implementation of the EELS T8N for execution-spec-tests.
"""

import json
import tempfile
from io import StringIO
from typing import Any, Dict, Optional

from ethereum_clis.clis.execution_specs import ExecutionSpecsExceptionMapper
from ethereum_clis.file_utils import dump_files_to_directory
from ethereum_clis.transition_tool import TransitionTool, model_dump_config
from ethereum_clis.types import TransitionToolOutput
from ethereum_test_forks import Fork

import ethereum

from .. import create_parser
from ..utils import get_supported_forks
from . import T8N


class EELST8N(TransitionTool):
"""Implementation of the EELS T8N for execution-spec-tests."""

def __init__(
self,
*,
trace: bool = False,
):
"""Initialize the EELS Transition Tool interface."""
self.exception_mapper = ExecutionSpecsExceptionMapper()
self.trace = trace
self._info_metadata: Optional[Dict[str, Any]] = {}

def version(self) -> str:
"""Version of the t8n tool."""
return ethereum.__version__

def is_fork_supported(self, fork: Fork) -> bool:
"""Return True if the fork is supported by the tool."""
return fork.transition_tool_name() in get_supported_forks()

def evaluate(
self,
*,
transition_tool_data: TransitionTool.TransitionToolData,
debug_output_path: str = "",
slow_request: bool = False, # noqa: U100, F841
) -> TransitionToolOutput:
"""
Evaluate using the EELS T8N entry point.
"""
request_data = transition_tool_data.get_request_data()
request_data_json = request_data.model_dump(
mode="json", **model_dump_config
)

t8n_args = [
"t8n",
"--input.alloc=stdin",
"--input.env=stdin",
"--input.txs=stdin",
"--output.result=stdout",
"--output.body=stdout",
"--output.alloc=stdout",
f"--state.fork={request_data_json['state']['fork']}",
f"--state.chainid={request_data_json['state']['chainid']}",
f"--state.reward={request_data_json['state']['reward']}",
]

if transition_tool_data.state_test:
t8n_args.append("--state-test")

temp_dir = tempfile.TemporaryDirectory()
if self.trace:
t8n_args.extend(
[
"--trace",
"--trace.memory",
"--trace.returndata",
f"--output.basedir={temp_dir.name}",
]
)

parser = create_parser()
t8n_options = parser.parse_args(t8n_args)

out_stream = StringIO()

in_stream = StringIO(json.dumps(request_data_json["input"]))

t8n = T8N(t8n_options, out_stream, in_stream)
t8n.run()

output_dict = json.loads(out_stream.getvalue())
output: TransitionToolOutput = TransitionToolOutput.model_validate(
output_dict, context={"exception_mapper": self.exception_mapper}
)

if debug_output_path:
dump_files_to_directory(
debug_output_path,
{
"input/alloc.json": request_data.input.alloc,
"input/env.json": request_data.input.env,
"input/txs.json": [
tx.model_dump(mode="json", **model_dump_config)
for tx in request_data.input.txs
],
},
)

dump_files_to_directory(
debug_output_path,
{
"output/alloc.json": output.alloc,
"output/result.json": output.result,
},
)

if self.trace:
self.collect_traces(
output.result.receipts, temp_dir, debug_output_path
)
temp_dir.cleanup()

return output
24 changes: 22 additions & 2 deletions tox.ini
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tox]
min_version = 2.0
envlist = py3,pypy3,static
envlist = py3,pypy3,py3_eest,static

[testenv:static]
extras =
Expand Down Expand Up @@ -30,7 +30,23 @@ commands =
--no-cov-on-fail \
--cov-branch \
--ignore-glob='tests/fixtures/*' \
--basetemp="{temp_dir}/pytest"
--basetemp="{temp_dir}/pytest" \
tests

[testenv:py3_eest]
extras =
test
setenv =
COVERAGE_FILE = {toxworkdir}/.coverage
commands =
pytest \
-c pytest-eest.ini \
-m "not slow and not zkevm" \
-n auto --maxprocesses 10 \
--basetemp="{temp_dir}/pytest" \
--clean \
eest_tests/tests


[testenv:pypy3]
extras =
Expand All @@ -45,7 +61,9 @@ commands =
-m "not slow" \
-n auto --maxprocesses 5 \
--ignore-glob='tests/fixtures/*' \
--ignore-glob='eest_tests/*' \
--basetemp="{temp_dir}/pytest"
tests

[testenv:optimized]
extras =
Expand All @@ -59,8 +77,10 @@ commands =
-n auto --maxprocesses 5 \
--ignore-glob='tests/fixtures/*' \
--ignore-glob='tests/test_t8n.py' \
--ignore-glob='eest_tests/*' \
--basetemp="{temp_dir}/pytest" \
--optimized
tests

[testenv:doc]
basepython = python3
Expand Down
5 changes: 4 additions & 1 deletion whitelist.txt
Original file line number Diff line number Diff line change
Expand Up @@ -494,4 +494,7 @@ SECP256R1P
secp256r1
sig

CLZ
CLZ
EELST8N
clis
T8
Loading