|
1 | 1 | # EEST Fixture Releases |
2 | 2 |
|
| 3 | +!!! warning "Two repositories — do not confuse them" |
| 4 | + - **`ethereum/execution-specs`** publishes Python *spec package* releases tagged `vX.Y.Z` (e.g. [`v2.20.0`](https://github.com/ethereum/execution-specs/releases/tag/v2.20.0)). **These contain no test fixtures** — they are the executable specification package only. |
| 5 | + - **Test fixtures** are published as **feature-scoped releases** on the same repository — `consensus@vX.Y.Z`, `<feat>-devnet@vX.Y.Z`, `benchmark@vX.Y.Z` — and are *not* attached to the `vX.Y.Z` package tags. |
| 6 | + - The legacy `fixtures_stable.tar.gz` / `fixtures_develop.tar.gz` artifacts (previously on `ethereum/execution-spec-tests`) are being retired in favour of the feature-scoped releases described here. |
| 7 | + |
3 | 8 | ## Formats and Release Layout |
4 | 9 |
|
5 | | -@ethereum/execution-specs releases contain JSON test fixtures in various formats. Note that transaction type tests are executed directly from Python source using the [`execute`](./execute/index.md) command. |
| 10 | +Fixture releases contain JSON test fixtures in various formats. Note that transaction type tests are executed directly from Python source using the [`execute`](./execute/index.md) command. |
6 | 11 |
|
7 | 12 | | Format | Consumed by the client | Location in `.tar.gz` release | |
8 | 13 | | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | |
|
12 | 17 | | [Transaction Tests](./test_formats/transaction_test.md) | - using a new simulator coming soon | None; executed directly from Python source,</br>using a release tag | |
13 | 18 | | Blob Transaction Tests | - using the [eels/execute-blobs Simulator](./execute/hive.md#the-eelsexecute-blobs-simulator) and | None; executed directly from Python source,</br>using a release tag | |
14 | 19 |
|
15 | | -## Fixture Output Directory Structure |
16 | | - |
17 | | -Inside each format directory, fixtures are grouped by **target fork**. |
18 | | - |
19 | | -The top-level subdirectory identifies the fork **under test**. Below it, |
20 | | -fixtures mirror the `./tests/` source layout: each directory corresponds |
21 | | -to the fork where the functionality was originally introduced. Because |
22 | | -tests declare `valid_from`, a single target fork directory contains |
23 | | -fixtures from every prior fork whose tests are still valid at that fork. |
24 | | - |
25 | | -### Consensus fixture layout |
26 | | - |
27 | | -```text |
28 | | -fixtures/ |
29 | | -└── blockchain_tests/ |
30 | | - ├── for_prague/ # filled targeting Prague |
31 | | - │ ├── istanbul/ # tests introduced in Istanbul |
32 | | - │ │ └── eip1344_chainid/... |
33 | | - │ ├── cancun/ # tests introduced in Cancun |
34 | | - │ │ └── eip4844_blobs/... |
35 | | - │ └── prague/ # tests introduced in Prague |
36 | | - │ └── eip7702_set_code_tx/... |
37 | | - └── for_osaka/ # filled targeting Osaka |
38 | | - ├── istanbul/ |
39 | | - │ └── eip1344_chainid/... |
40 | | - ├── cancun/ |
41 | | - │ └── eip4844_blobs/... |
42 | | - ├── prague/ |
43 | | - │ └── eip7702_set_code_tx/... |
44 | | - └── osaka/ # tests introduced in Osaka |
45 | | - └── eip7692_eof_v1/... |
46 | | -``` |
| 20 | +## Release Tracks |
47 | 21 |
|
48 | | -Other format directories (`state_tests/`, `blockchain_tests_engine/`) |
49 | | -follow the same layout. |
| 22 | +Fixtures are released on independent tracks. Each track has its own tag namespace, artifact, and cadence. |
50 | 23 |
|
51 | | -### Benchmark fixture layout |
| 24 | +| Track | Tag | Artifact | Scope | Built from | |
| 25 | +| --------- | -------------------- | ------------------------------- | ------------------------------------------------------------------ | ----------------- | |
| 26 | +| Consensus | `consensus@vX.Y.Z` | `fixtures_consensus.tar.gz` | All forks, all tests (including legacy tests) | `main`/`master` | |
| 27 | +| Devnet | `<feat>-devnet@vX.Y.Z` | `fixtures_<feat>-devnet.tar.gz` | All forks, all tests, for an upcoming-fork feature under active devnet testing | the devnet branch | |
| 28 | +| Benchmark | `benchmark@vX.Y.Z` | `fixtures_benchmark.tar.gz` | EVM benchmarking tests | `main`/`master` | |
52 | 29 |
|
53 | | -When filling with `--gas-benchmark-values`, benchmark tests additionally |
54 | | -include the gas limit in the subdirectory name (`for_{fork}_at_{gas}M`, |
55 | | -where `{gas}` is in millions, zero-padded to four digits), with one |
56 | | -subdirectory per gas value: |
| 30 | +- **Consensus** releases track clients' production branches and are tagged frequently (roughly once or twice a week). They are the "must pass" release for mainnet CI. |
| 31 | +- **Devnet** releases target a specific feature under active development (e.g. `bal-devnet`). They are still WIP and may not contain full coverage for all EIPs; see the corresponding release notes for the coverage provided. |
| 32 | +- **Benchmark** (and, in future, zkEVM) releases are produced separately for their specialized consumers. |
57 | 33 |
|
58 | | -```text |
59 | | -fixtures/ |
60 | | -└── blockchain_tests/ |
61 | | - ├── for_osaka_at_0001M/ # 1M gas benchmark |
62 | | - │ └── benchmark/compute/... |
63 | | - └── for_osaka_at_0002M/ # 2M gas benchmark |
64 | | - └── benchmark/compute/... |
65 | | -``` |
| 34 | +## Versioning Scheme |
66 | 35 |
|
67 | | -When filling with `--fixed-opcode-count`, the opcode count replaces the |
68 | | -gas limit in the subdirectory name (`for_{fork}_at_opcount_{N}K`, where |
69 | | -`{N}` is in thousands and may include decimals): |
70 | | - |
71 | | -```text |
72 | | -fixtures/ |
73 | | -└── blockchain_tests/ |
74 | | - ├── for_osaka_at_opcount_10K/ # 10K opcodes |
75 | | - │ └── benchmark/compute/... |
76 | | - └── for_osaka_at_opcount_20K/ # 20K opcodes |
77 | | - └── benchmark/compute/... |
78 | | -``` |
| 36 | +Tags use the form `<track>@v<X>.<Y>.<Z>`. The underlying git tag is prefixed with `tests-` (e.g. `tests-consensus@v1.2.3`); the GitHub release title omits the prefix (`consensus@v1.2.3`). |
| 37 | + |
| 38 | +The meaning of `X.Y.Z` depends on the track: |
79 | 39 |
|
80 | | -## Release URLs and Tarballs |
| 40 | +| Component | Consensus track | Devnet track | |
| 41 | +| --------- | --------------------------- | --------------------------- | |
| 42 | +| `X` | Fork number | Devnet version | |
| 43 | +| `Y` | Spec/test change → a change in behaviour | Spec/test change → a change in behaviour | |
| 44 | +| `Z` | New tests only (no behaviour change) | New tests only (no behaviour change) | |
81 | 45 |
|
82 | | -### Versioning Scheme |
| 46 | +This keeps the version purely ordered within a track: a higher `X.Y.Z` on the same track is always the newer release. |
83 | 47 |
|
84 | | -EEST framework and test sources and fixture releases are tagged use a semantic versioning scheme, `<optional:<pre_release_name@>>v<MAJOR>.<MINOR>.<PATCH>` as following: |
| 48 | +## Pinning Guidance |
85 | 49 |
|
86 | | -- `<MAJOR>`: An existing fixture format has changed (potentially breaking change). Action must be taken by client teams to ensure smooth upgrade to the new format. |
87 | | -- `<MINOR>`: Additional coverage (new tests, or a new format) have been added to the release. |
88 | | -- `<PATCH>`: A bug-fix release; an error in the tests or framework has been patched. |
| 50 | +Mapped to a typical client CI setup: |
89 | 51 |
|
90 | | -Please see below for an explanation of the optional `<pre_release_name>` that is used in pre-releases. |
| 52 | +- **Blocking gate (current + past forks).** Pin a specific `consensus@vX.Y.Z` for reproducible, no-rug-pull CI on your `master`/production branch, or follow the latest consensus release if a moving target is acceptable. This supersedes the old `fixtures_develop`/`fixtures_stable` artifacts. |
| 53 | +- **Non-blocking gate (next fork).** Use the current `<feat>-devnet@vX.Y.Z` release for the upcoming fork's active devnet (e.g. `bal-devnet@vX.Y.Z`). Treat it as advisory — devnet coverage changes rapidly and should not block merges. |
91 | 54 |
|
92 | | -### Standard Releases |
| 55 | +!!! note "Devnet vs. consensus overlap" |
| 56 | + Devnet releases are filled for all forks/tests, so they overlap with the consensus release. If your blocking gate already runs a consensus release, the devnet gate re-runs that shared coverage. Deduplicating that overlap is consumer-side concern handled when resolving/consuming releases. |
93 | 57 |
|
94 | | -Releases are published on the @ethereum/execution-specs [releases](https://github.com/ethereum/execution-specs/releases) page. Standard releases are tagged using the format `vX.Y.Z` (they don't have a `<pre_release_name>`). |
| 58 | +## Creating a Fixture Release |
95 | 59 |
|
96 | | -For standard releases, two tarballs are available: |
| 60 | +Fixture releases are produced by manually dispatching the [`release_fixtures.yaml`](https://github.com/ethereum/execution-specs/blob/master/.github/workflows/release_fixtures.yaml) workflow. There is no tag to push by hand: the workflow builds the fixtures and, only on success, creates the tag and the (draft) GitHub release. |
97 | 61 |
|
98 | | -| Release Artifact | Fork/feature scope | |
99 | | -| ------------------------- | ----------------------------------------------------------------------- | |
100 | | -| `fixtures_stable.tar.gz` | Tests for all forks up to and including the last deployed ("stable") mainnet fork ("must pass") | |
101 | | -| `fixtures_develop.tar.gz` | Tests for all forks up to and including the last development fork | |
| 62 | +```bash |
| 63 | +gh workflow run release_fixtures.yaml -f feature=<feature>@vX.Y.Z [-f branch=<branch>] |
| 64 | +``` |
102 | 65 |
|
103 | | -I.e., `fixtures_develop` are a superset of `fixtures_stable`. |
| 66 | +### Inputs |
104 | 67 |
|
105 | | -!!! tip "Release features opt into all fixture formats via `feature.yaml`" |
106 | | - Tarball output (`.tar.gz`) does not by itself include the pre-allocation group formats (`BlockchainEngineXFixture`, `BlockchainEngineStatefulFixture`). A release feature requests them by adding `--generate-all-formats` to its `fill-params` in `.github/configs/feature.yaml`: |
107 | | - ```console |
108 | | - uv run fill --generate-all-formats --output=fixtures_stable.tar.gz tests/ |
109 | | - ``` |
| 68 | +| Input | Required | Description | |
| 69 | +| --------- | ----------------- | ---------------------------------------------------------------------------------------------------- | |
| 70 | +| `feature` | yes | `<feature>@vX.Y.Z` (the `tests-` prefix is optional and is added automatically to the tag). | |
| 71 | +| `branch` | for `*-devnet` | Branch to build and release from. Optional for non-devnet features; **required** for devnet releases. | |
110 | 72 |
|
111 | | -### Pre-Release and Devnet Releases |
| 73 | +`<feature>` must be a key in [`.github/configs/feature.yaml`](https://github.com/ethereum/execution-specs/blob/master/.github/configs/feature.yaml) (e.g. `consensus`, `benchmark`), or a `<feat>-devnet` name that resolves to the shared `devnet` feature. |
112 | 74 |
|
113 | | -Intermediate releases that target specific subsets of features or tests under active development are published at @ethereum/execution-specs [releases](https://github.com/ethereum/execution-specs/releases). |
| 75 | +### Devnet releases |
114 | 76 |
|
115 | | -These releases are tagged using the format `<pre_release_name>@vX.Y.Z`. |
| 77 | +Devnet releases must be named `<feat>-devnet@vX.Y.Z` (e.g. `bal-devnet@v1.0.0`) and must specify the branch to release from: |
116 | 78 |
|
117 | | -<!-- TODO: These example tags live in the legacy @ethereum/execution-spec-tests repo; replace with current @ethereum/execution-specs examples once available. --> |
118 | | -Examples: |
| 79 | +```bash |
| 80 | +gh workflow run release_fixtures.yaml -f feature=bal-devnet@v1.0.0 -f branch=bal-devnet-7 |
| 81 | +``` |
| 82 | + |
| 83 | +A bare `devnet@vX.Y.Z` (no `<feat>-` prefix), or a `*-devnet` release without a `branch`, fails fast in the first job before any fixtures are built. |
| 84 | + |
| 85 | +### What the workflow produces |
| 86 | + |
| 87 | +On success the workflow: |
| 88 | + |
| 89 | +1. Builds `fixtures_<feature>.tar.gz` for the resolved feature (per its `evm-type` and `fill-params` in `feature.yaml`). |
| 90 | +2. Creates the git tag `tests-<feature>@vX.Y.Z` on the released commit (the `branch` HEAD when given, otherwise the dispatch commit). |
| 91 | +3. Publishes a **draft pre-release** to [`ethereum/execution-specs`](https://github.com/ethereum/execution-specs/releases), titled `<feature>@vX.Y.Z` (no `tests-` prefix), with the fixture tarball(s) attached. |
119 | 92 |
|
120 | | -- [`fusaka-devnet-1@v1.0.0`](https://github.com/ethereum/execution-spec-tests/releases/tag/fusaka-devnet-1%40v1.0.0) - this fixture release contains tests adhering to the [Fusaka Devnet 1 spec](https://notes.ethereum.org/@ethpandaops/fusaka-devnet-1). |
121 | | -- [`benchmark@v0.0.3`](https://github.com/ethereum/execution-spec-tests/releases/tag/benchmark%40v0.0.3) - this fixture release contains tests specifically aimed at benchmarking EVMs. |
| 93 | +| Example dispatch | Git tag | Release title | Artifact | |
| 94 | +| ---------------- | ------- | ------------- | -------- | |
| 95 | +| `feature=consensus@v1.2.3` | `tests-consensus@v1.2.3` | `consensus@v1.2.3` | `fixtures_consensus.tar.gz` | |
| 96 | +| `feature=bal-devnet@v1.0.0 branch=bal-devnet-7` | `tests-bal-devnet@v1.0.0` | `bal-devnet@v1.0.0` | `fixtures_bal-devnet.tar.gz` | |
122 | 97 |
|
123 | | -Devnet releases should be treated as WIP and may not yet contain full test coverage (or even coverage for all EIPs). The coverage provided by these releases is detailed in the corresponding release notes. |
| 98 | +The release is created as a draft; review and publish it from the GitHub releases page. |
| 99 | + |
| 100 | +!!! tip "Release features opt into all fixture formats via `feature.yaml`" |
| 101 | + Tarball output (`.tar.gz`) does not by itself include the pre-allocation group formats (`BlockchainEngineXFixture`, `BlockchainEngineStatefulFixture`). A release feature requests them by adding `--generate-all-formats` to its `fill-params` in `.github/configs/feature.yaml`: |
| 102 | + ```console |
| 103 | + # Automatically enables --generate-all-formats due to .tar.gz output |
| 104 | + uv run fill --output=fixtures_consensus.tar.gz tests/ |
| 105 | + ``` |
124 | 106 |
|
125 | | -### Help Downloading Releases |
| 107 | +## Help Downloading Releases |
126 | 108 |
|
127 | 109 | The [`consume cache`](./consume/cache.md) command can be used to resolve EEST release and pre-release tags to release URLs and download them. |
0 commit comments