Skip to content

monad-developers/execution-specs

 
 

Ethereum Execution Client Specifications

GitPOAP Badge codecov Python Specification

Monadized execution-specs and spec tests

IMPORTANT: Read this first if you're planning to use it for Monad.


This fork implements the execution layer client features specific to Monad.

It mainly serves as an alternative implementation of https://github.com/category-labs/monad, and a tool to generate (fill) spec tests for it to consume.

Getting started

  1. Install uv: curl -LsSf https://astral.sh/uv/install.sh | sh
  2. Clone and setup:
git clone --depth 1 https://github.com/monad-developers/execution-specs
cd execution-specs
uv python install 3.12
uv python pin 3.12
uv sync --all-extras
  1. Fill all monadized spec tests as of writing this (see below for explanation of flags):
uv run fill --clean -m "blockchain_test or transaction_test" --from MONAD_EIGHT --until MONAD_NINE --chain-id 143 -n auto tests
  1. The test fixtures to be found in fixtures/ directory under repo root.

(c.f. somewhat outdated upstream "Getting started")

Filling tests

Filling tests is the process of running Python generators of spec tests like ones you can find here, to generate JSON files with test fixtures. The fixtures are then in turn consumed by monad. In the process of filling the tests, the Python implementation of Monad execution layer is used to produce reference results including the state root.

uv run fill flags

  • -m blockchain_test or transaction_test: causes these two flavors of fixtures to be generated
    • blockchain_test is the currently supported by monad flavor of a spec test checking correctness of the state transition. Note this includes blockchain_test_from_state_test, meaning that all state_test(...) fillers are included
    • transaction_test is also supported, tests only correctness of static transaction checks
  • --from MONAD_EIGHT --until MONAD_NINE: hardforks for which to generate fixtures. Must match with those defined in monad, inclusive
  • --chain-id 143: must be specified for signatures and EIP-7702 to work correctly
  • -n auto: from pytest, parallel execution of tests
  • tests: root directory to traverse to discover tests
    • inside the tests are organized by EIP/MIP and the hardfork when they became relevant. For Monad these are monad_eight and monad_nine as of writing this. Here hardfork is informative only, doesn't need to match with monad.
    • note that tests relevant for previous hardforks, e.g. tests/prague/eip7702_set_code_tx, are filled for hardforks requested with --from, --until flags, respecting any constraints the test itself might define. In other words, in the invocation above, EIP-7702 tests will be filled

pytest flags are in general supported, while --traces will give you detailed EVM step traces. Refer to https://eest.ethereum.org/main/filling_tests/ for more details.

Gotchas

  • not all Ethereum-only features have been switched off, e.g. eth-specific system contracts and tx types are available in the monadized execution-specs implementation. We're skipping their respective spec tests, and we don't have tests testing lack of these features in Monad.
  • we're going to be keeping up with upstream changes (currently forks/amsterdam branch). This should work by opening a PR with the upstream changes to be commit-merged into our default branch (currently forks/monad_nine).
  • when adding a new Monad-hardfork we should use the ethereum-spec-new-fork tool provided to clone the parent hardfork into the new hardfork. If that new Monad-hardfork also adopts upstream (Ethereum) hardfork improvements, you will need to apply these yourself.

Description

This repository contains the specifications related to the Ethereum execution client, specifically the pyspec and specifications for network upgrades. The JSON-RPC API specification can be found in a separate repository.

Ethereum Protocol Releases

Version and Code Name Block No. Released Incl EIPs Fork Specifications Blog
Osaka 23935694 2025-12-03 EIP-7594
EIP-7642
EIP-7823
EIP-7825
EIP-7883
EIP-7892
EIP-7910
EIP-7917
EIP-7918
EIP-7934
EIP-7935
EIP-7939
EIP-7951
Hardfork Meta EIP-7607
Fork Manifest
Blog
Prague 22431084 2025-05-07 EIP-2537
EIP-2935
EIP-6110
EIP-7002
EIP-7251
EIP-7549
EIP-7623
EIP-7685
EIP-7691
EIP-7702
Hardfork Meta EIP-7600
Fork Manifest
Blog
Cancun 19426587 2024-03-13
(1710338135)
EIP-1153
EIP-4788
EIP-4844
EIP-5656
EIP-6780
EIP-7044
EIP-7045
EIP-7514
EIP-7516
Hardfork Meta EIP-7569
Fork Manifest
Blog
Shanghai 17034870 2023-04-12
(1681338455)
EIP-3651
EIP-3855
EIP-3860
EIP-4895
(Backfill) Meta EIP-7568
Fork Manifest
Blog
Paris 15537394 2022-09-15 EIP-3675
EIP-4399
(Backfill) Meta EIP-7568
Fork Manifest
Blog
Gray Glacier 15050000 2022-06-30 EIP-5133 (Backfill) Meta EIP-7568
Fork Manifest
Blog
Arrow Glacier 13773000 2021-12-09 EIP-4345 (Backfill) Meta EIP-7568
Fork Manifest
Blog
London 12965000 2021-08-05 EIP-1559
EIP-3198
EIP-3529
EIP-3541
EIP-3554
(Backfill) Meta EIP-7568
Fork Manifest
Blog
Berlin 12244000 2021-04-15 EIP-2565
EIP-2929
EIP-2718
EIP-2930
Hardfork Meta EIP-2070
(Backfill) Meta EIP-7568
Fork Manifest
Blog
Muir Glacier 9200000 2020-01-02 EIP-2384 Hardfork Meta EIP-2387
Fork Manifest
Blog
Istanbul 9069000 2019-12-07 EIP-152
EIP-1108
EIP-1344
EIP-1884
EIP-2028
EIP-2200
Hardfork Meta EIP-1679
Fork Manifest
Blog
Petersburg 7280000 2019-02-28 EIP-145
EIP-1014
EIP-1052
EIP-1234
Hardfork Meta EIP-1716 Blog
Constantinople 7280000 2019-02-28 EIP-145
EIP-1014
EIP-1052
EIP-1234
EIP-1283
Hardfork Meta EIP-1013
Fork Manifest
Blog
Byzantium 4370000 2017-10-16 EIP-100
EIP-140
EIP-196
EIP-197
EIP-198
EIP-211
EIP-214
EIP-649
EIP-658
Hardfork Meta EIP-609
Fork Manifest
Blog
Spurious Dragon 2675000 2016-11-22 EIP-155
EIP-160
EIP-161
EIP-170
Hardfork Meta EIP-607
Fork Manifest
Blog
Tangerine Whistle 2463000 2016-10-18 EIP-150 Hardfork Meta EIP-608
Fork Manifest
Blog
DAO Fork 1920000 2016-07-20 Hardfork Meta EIP-779
Fork Manifest
Blog
DAO Wars aborted aborted Blog
Homestead 1150000 2016-03-14 EIP-2
EIP-7
EIP-8
Hardfork Meta EIP-606
Fork Manifest
Blog
Frontier Thawing 200000 2015-09-07 Blog
Frontier 1 2015-07-30 Fork Manifest Blog

Note: Starting with Paris, updates are no longer rolled out based on block numbers. Paris was enabled once proof-of-work Total Difficulty reached 58750000000000000000000. As of Shanghai (at 1681338455), upgrade activation is based on timestamps.

Some clarifications were enabled without protocol releases:

EIP Block No.
EIP-2681 0
EIP-3607 0
EIP-7523 15537394
EIP-7610 0

Execution Specification (work-in-progress)

The execution specification is a python implementation of Ethereum that prioritizes readability and simplicity. It will be accompanied by both narrative and API level documentation of the various components written in markdown and rendered using docc...

Usage

The Ethereum specification is maintained as a Python library, for better integration with tooling and testing.

Requires Python 3.11+

Building Specification Documentation

Building the spec documentation is most easily done through tox:

uvx --with=tox-uv tox -e spec-docs

The path to the generated HTML will be printed to the console.

Browsing Updated Documentation

To view the updated local documentation, run:

uv run mkdocs serve

then connect to localhost:8000 in a browser

License

The Ethereum Execution Layer Specification code is licensed under the Creative Commons Zero v1.0 Universal.

About

Specification for the Execution Layer. Tracking network upgrades.

Resources

License

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

  • Python 100.0%