Skip to content

test(l1): bump Amsterdam fixtures to glamsterdam-devnet-8 - #7094

Open
edg-l wants to merge 15 commits into
mainfrom
chore/bump-glamsterdam-devnet-8
Open

test(l1): bump Amsterdam fixtures to glamsterdam-devnet-8#7094
edg-l wants to merge 15 commits into
mainfrom
chore/bump-glamsterdam-devnet-8

Conversation

@edg-l

@edg-l edg-l commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Bumps the Amsterdam fixtures from tests-glamsterdam-devnet@v7.2.0 to v8.0.0 and makes the client pass them.

Gas schedule

devnet-8 moved two of the repricing EIPs:

  • EIP-2780: a value transfer is now a single TX_VALUE_COST of 6000 covering both the recipient balance write and the EIP-7708 transfer log, replacing the 4244 + 1756 split. A creation carrying value pays no value charge at all, since CREATE_ACCESS already covers the balance write — create-with-value drops from 24756 to 23000, and the calldata-floor anchor follows because it shares recipient_regular_gas.
  • EIP-8038: access-list entries cost the cold access minus WARM_ACCESS, i.e. 2900 instead of 3000, so prepaying an entry is gas neutral with the cold access it replaces. EIP-2930's extra 100 discount is not restored.

Engine API

engine_newPayloadV1..V4 accepted payloads carrying slotNumber or blockAccessList, which are defined only from V5. A pre-fork block with a slot number was executed instead of being rejected with -32602. V3 previously doubled as both the pre-Amsterdam shape and the base of the Amsterdam one, so the shared Cancun-onwards field checks are split out and V5 keeps requiring what the earlier versions now forbid.

Fixtures and CI

  • .fixtures_url_amsterdam, .github/config/hive/amsterdam.yaml (fixtures + eels_commit) and AMSTERDAM_FIXTURES_BRANCH all point at devnet-8.
  • The bundle is overlaid onto an existing vectors/eest, so the subtrees are cleared before extracting. Fixtures renamed between devnet releases (EIP-8037 regular gas → execution gas) otherwise survived as stale leftovers and ran against the client.
  • Also extract for_bpo2toamsterdamattime15k. It holds the fork-activation fixtures — a header field appearing mid-chain, the gas schedule switching between blocks — and exists only in this bundle, so omitting it left the whole fork boundary untested. The hive limits become fork_.*Amsterdam to sweep them too, and the daily report keys the Amsterdam bundle off an explicit flag rather than a substring of the limit, which no longer contains a literal fork name.
  • Fixture downloads are idempotent: the artifact targets are order-only on the vectors dir, since building it runs clean-vectors and would otherwise wipe the tarball between the curl and the extract. The state suite keeps its tarball, hence the new .gitignore entry. This is what recovers the Amsterdam state fixtures noted below — previously a second clean destroyed them before the tests ran.
  • The state suite's run-evm-ef-tests-ci and test-levm now depend on amsterdam-vectors, so they cover Amsterdam without a separate download step.
  • The stateless Amsterdam+ skip is retargeted at the real cause: tests-zkevm@v0.6.2 is filled against devnet-7 and its gas expectations no longer match a devnet-8 client. Documented in docs/known_issues.md.

New tests pin the EIP-8037 two-dimensional inclusion gate and the per-tx execution-gas cap, including the cap on max(intrinsic, calldata floor).

Verification

  • Engine ef-tests after a full clean-vectors: 10993 tests / 75478 fixtures, 0 failed.
  • cargo fmt --check and cargo clippy --all-targets -D warnings clean.

Notes for review

  • The ef-test comparison shows 56628 → 72432 fixtures, both at 100%. That +15804 is not devnet-8 churn: on main the state suite's Run tests step re-triggers clean-evm-ef-tests, because the $(VECTORS_DIR) rule deletes the tarball and make then rebuilds it, wiping vectors/ and with it the Amsterdam fixtures the Download EF Tests step had just extracted. main was running zero Amsterdam state fixtures. The idempotency change fixes that, so they now actually execute.
  • The EF Tests (no_std crypto) job pulls no Amsterdam fixtures at all, so the no_std crypto path has zero Amsterdam coverage. Pre-existing on main, left alone here to keep this PR scoped; worth its own change.
  • The roadmap lists EIP-8070 (eth/72) as in review rather than done, since it lands with feat(l1): eth/72 sparse blobpool (EIP-8070) #6776.

edg-l added 5 commits August 3, 2026 15:43
EIP-2780 now prices a value transfer with a single TX_VALUE_COST of 6000
covering both the recipient balance write and the transfer log, and a
contract creation carrying value pays no value charge at all because
CREATE_ACCESS already covers the balance write.

Create-with-value drops from 24756 to 23000; the calldata-floor anchor
follows since it shares recipient_regular_gas.
TX_ACCESS_LIST_ADDRESS and TX_ACCESS_LIST_STORAGE_KEY become the cold
access minus WARM_ACCESS (2900), so prepaying an entry is gas neutral
with the cold access it replaces. EIP-2930's 100 discount is not
restored.
… cap

The gate is flat: each dimension measures the tx's worst-case contribution
against its remaining budget, with no intrinsic subtraction and no credit
for the top-frame state charge. Only the execution dimension is capped at
TX_MAX_GAS_LIMIT.

Also cover the cap on max(intrinsic, calldata floor): a floor above
TX_MAX_GAS_LIMIT is rejected no matter how large the gas limit is, since
excess gas limit becomes state-gas reservoir.
Point the shared .fixtures_url_amsterdam, the hive config (fixtures +
eels_commit) and AMSTERDAM_FIXTURES_BRANCH at devnet-8.

Clear vectors/eest/for_amsterdam before overlaying the bundle: fixtures
renamed between devnet releases (EIP-8037 regular gas -> execution gas)
otherwise survived as stale leftovers and ran against the client.

Retarget the stateless Amsterdam+ skip at the real cause: tests-zkevm@v0.6.2
is filled against devnet-7 and its gas expectations no longer match a
devnet-8 client.
The engine harness dropped `slotNumber` when rebuilding a fixture's genesis,
so a chain starting at a non-zero slot got a genesis hash that did not match
the fixture's. The initial FCU then pointed at an unknown head and returned
SYNCING instead of VALID.
@edg-l
edg-l requested a review from a team as a code owner August 3, 2026 13:46
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

⚠️ Known Issues — intentionally skipped tests

Source: docs/known_issues.md

Stateless (zkEVM) Amsterdam+ EF tests skipped

Where: tooling/ef_tests/blockchain/test_runner.rsparse_and_execute skips
fixtures with network >= Fork::Amsterdam when running with a stateless backend.
Affects make test-stateless (the vectors_zkevm/ run); make test-levm is
unaffected.

Why: the stateless run uses the tests-zkevm@v0.6.2 bundle, the newest zkEVM
release, filled against tests-glamsterdam-devnet@v7.2.0. This client targets
glamsterdam-devnet-8, whose gas schedule diverges from devnet-7: EIP-2780 folds the
EIP-7708 transfer log cost into TX_VALUE_COST, and EIP-8038 reprices access-list
entries to the cold cost minus WARM_ACCESS (3000 → 2900 per address and per storage
key). Every Amsterdam+ fixture in the bundle therefore carries devnet-7 gas
expectations that no longer match execution. The skip is by fork rather than by test
name, since cross-fork directories such as for_amsterdam/prague/... still execute at
the Amsterdam fork.

Removal: delete the skip_stateless_amsterdam branch in parse_and_execute once a
tests-zkevm bundle filled against glamsterdam-devnet-8 is released and
.fixtures_url_zkevm is bumped to it.

@github-actions github-actions Bot added the L1 Ethereum client label Aug 3, 2026
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

🤖 Kimi Code Review

Review: Amsterdam devnet-8 gas repricing & payload validation

The PR correctly updates the client for the Amsterdam (Glamsterdam) devnet-8 specification, specifically implementing the EIP-2780 and EIP-8038 gas schedule changes and hardening payload validation. No critical issues found.

Correctness & Consensus Safety

Gas Accounting (crates/vm/levm/src/gas_cost.rs)

  • Lines 218–223: The access-list repricing to 2900 (calculated as COLD_ACCOUNT_ACCESS_AMSTERDAM - WARM_ADDRESS_ACCESS_COST) correctly implements EIP-8038's gas-neutral prepayment semantics. Verified: 3000 − 100 = 2900.
  • Lines 320–335: The refactored recipient_regular_gas correctly folds the transfer log cost into the flat TX_VALUE_COST_AMSTERDAM (6000) per the updated EIP-2780 spec. The early return for TxKind::Create (line 324) is correct—creation pays no separate value charge because the recipient write is covered by CREATE_ACCESS_AMSTERDAM.
  • Lines 213–214: Removal of the separate TRANSFER_LOG_COST_AMSTERDAM constant eliminates the risk of double-charging the log cost.

Engine API Validation (crates/networking/rpc/engine/payload.rs)

  • Lines 938–950: reject_amsterdam_payload_fields is a necessary consensus safeguard. It ensures that pre-Amsterdam payload versions (V1–V3) reject the block_access_list and slot_number fields, preventing a client from accepting Amsterdam-formatted payloads on old forks.
  • Lines 960, 975, 990: Correct integration of the rejection logic into V1–V3 validators.
  • Lines 1005–1018: V4 validation (Amsterdam) correctly requires the block access list and delegates to validate_execution_payload_cancun_fields for the base Cancun fields.

Testing

EIP-8037 2D Gas Gate (test/tests/blockchain/eip8037_block_gate_tests.rs)

  • Lines 45–174: Comprehensive boundary testing for the flat inclusion gate. Item 3 ("no credit for top frame state charge") and Item 4 ("contribution is capped at TX_MAX_GAS_LIMIT") are critical edge cases that prevent accepting transactions that should be rejected under the spec.

EIP-2780 & EIP-8038 Unit Tests

  • test/tests/levm/eip2780_tests.rs: Updated expectations (23000 gas for creation with value, 21000 for transfer) match the devnet-8 spec.
  • test/tests/levm/eip8038_tests.rs: Assertions for 2900 gas per access-list entry are correct.

Infrastructure & Tooling

Makefile Safety (tooling/ef_tests/*/Makefile)

  • Lines 59–65 (blockchain): The use of rm -rf on $(AMSTERDAM_SUBTREES) before extraction prevents stale fixtures from surviving across devnet upgrades. The paths are properly scoped to the test vectors directory.
  • Order-only prerequisites (e.g., | $(SPECTEST_VECTORS_DIR)) correctly handle the dependency ordering between clean-vectors and artifact downloading.

CI/CD (.github/workflows/)

  • Regex changes (fork_.*Amsterdam.*): Correctly captures both fork_Amsterdam and fork_BPO2ToAmsterdamAtTime15k fixtures, ensuring fork-activation boundaries are tested.
  • Explicit amsterdam flag: The introduction of the AMSTERDAM environment variable (line 135 in daily_hive_report.yaml) fixes the fragile substring matching that would have fallen through to mainnet fixtures.

Documentation

  • docs/known_issues.md: Accurately documents the stateless test skip rationale (devnet-7 vs. devnet-8 gas schedule mismatch), preventing confusion about why Amsterdam fixtures are temporarily excluded from the zkEVM test run.

Minor Suggestions

  1. Comment clarity in recipient_regular_gas (crates/vm/levm/src/gas_cost.rs:324): Consider expanding the comment to explicitly cite EIP-2780: "Creation carries no value charge per EIP-2780; the balance write is subsumed by CREATE_ACCESS."
  2. Makefile hygiene: While the paths are controlled, adding -- to rm -rf calls (e.g., rm -rf -- $(addprefix ...)) is a defensive practice against accidental option injection if variables ever contain unexpected values.

Summary

The PR is ready to merge. The gas repricings are arithmetically correct, the payload validation hardening prevents cross-fork confusion, and the test coverage adequately exercises the boundary conditions of the new 2D gas gate.


Automated review by Kimi (Moonshot AI) · kimi-k2.5 · custom prompt

@greptile-apps

greptile-apps Bot commented Aug 3, 2026

Copy link
Copy Markdown

Greptile Summary

The PR updates Amsterdam testing to glamsterdam-devnet-8 and aligns execution, Engine API validation, fixture extraction, and CI coverage with the new bundle.

  • Reprices EIP-2780 value transfers and EIP-8038 access-list entries.
  • Restricts Amsterdam payload fields to Engine API V5 and adds fixture support for genesis slot numbers.
  • Makes fixture overlays clean and repeatable, including fork-activation vectors.
  • Expands Amsterdam test coverage and documents the remaining stateless/no-std limitations.

Confidence Score: 5/5

The PR appears safe to merge with no actionable changed-code failures identified.

Engine payload versioning, gas repricing, and fixture overlay dependencies are internally consistent, while the remaining Amsterdam coverage gaps are pre-existing and explicitly documented.

Important Files Changed

Filename Overview
crates/networking/rpc/engine/payload.rs Splits common Cancun payload validation from version-specific Amsterdam field checks so V1–V4 reject and V5 requires the new fields.
crates/vm/levm/src/gas_cost.rs Updates Amsterdam value-transfer and access-list gas prices consistently across shared intrinsic and calldata-floor callers.
tooling/ef_tests/blockchain/Makefile Replaces a single-directory target with a clean overlay stamp covering regular and fork-activation Amsterdam fixtures.
tooling/ef_tests/engine/Makefile Applies the same repeatable overlay strategy to Engine fixtures.
tooling/ef_tests/state/Makefile Cleans stale Amsterdam state fixtures and wires the overlay into the primary LEVM and CI targets.
tooling/ef_tests/engine/src/fixture.rs Propagates fixture genesis slot numbers into generated genesis JSON.
test/tests/blockchain/eip8037_block_gate_tests.rs Adds focused tests for independent two-dimensional block gas limits and the execution-only transaction cap.
.github/workflows/daily_hive_report.yaml Selects Amsterdam fixture bundles using an explicit matrix flag while broadening fork-boundary matching.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  Bundle["glamsterdam-devnet-8 bundle"] --> Overlay["Clean Amsterdam fixture overlay"]
  Overlay --> State["State tests"]
  Overlay --> Blockchain["Blockchain tests"]
  Overlay --> Engine["Engine tests"]
  Engine --> Versions{"newPayload version"}
  Versions -->|"V1-V4"| Reject["Reject slotNumber and blockAccessList"]
  Versions -->|"V5"| Require["Require slotNumber and blockAccessList"]
  Blockchain --> Gas["Amsterdam execution"]
  State --> Gas
  Gas --> E2780["EIP-2780 value-transfer pricing"]
  Gas --> E8038["EIP-8038 access-list pricing"]
Loading

Reviews (1): Last reviewed commit: "ci(l1): sweep the Amsterdam fork transit..." | Re-trigger Greptile

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

Lines of code report

Total lines added: 13
Total lines removed: 6
Total lines changed: 19

Detailed view
+------------------------------------------------+-------+------+
| File                                           | Lines | Diff |
+------------------------------------------------+-------+------+
| ethrex/crates/networking/rpc/engine/payload.rs | 1419  | +13  |
+------------------------------------------------+-------+------+
| ethrex/crates/vm/levm/src/gas_cost.rs          | 1015  | -6   |
+------------------------------------------------+-------+------+

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

🤖 Codex Code Review

  1. tooling/ef_tests/blockchain/test_runner.rs skips stateless Amsterdam fixtures with test.network >= Fork::Amsterdam at test_runner.rs, but Fork::BPO2ToAmsterdamAtTime15k is ordered before Fork::Amsterdam in fork.rs. This PR now starts overlaying for_bpo2toamsterdamattime15k in Makefile, so those transition fixtures will still run in the stateless path even though the comment says the devnet-7 zkEVM bundle is incompatible with devnet-8 Amsterdam gas rules. That is likely to reintroduce failing stateless cases right at the fork boundary.

  2. The extra BAL parallel replay check only runs for test.network == Fork::Amsterdam at test_runner.rs. With the new for_bpo2toamsterdamattime15k subtree added in Makefile, the new transition fixtures never exercise that correctness path on their Amsterdam-side blocks. That is a coverage regression for the exact boundary cases this PR is adding.

The runtime changes themselves looked coherent on review: the pre-Amsterdam payload field rejection in engine_newPayloadV1-V4, the Amsterdam slot-number genesis support, and the 2780/8038 gas repricing all line up with the surrounding code.

I couldn’t run targeted cargo test filters here because cargo attempted a Rust toolchain sync under /home/runner/.rustup, which is read-only in this environment.


Automated review by OpenAI Codex · gpt-5.4 · custom prompt

edg-l added 6 commits August 3, 2026 15:54
Building the mainnet vectors runs the clean target, which deleted the
already-downloaded Amsterdam bundle before it could be extracted. Make the
Amsterdam download order-only on the vectors dir so it happens after the clean.

The state suite also deleted its own prerequisite tarball, so every invocation
re-triggered the clean and re-downloaded from scratch. That wiped the Amsterdam
fixtures that `download-evm-ef-tests` had just extracted, leaving the CI run with
no Amsterdam coverage. Keep the tarball and depend on `amsterdam-vectors`
explicitly.

Note the mapper is verified against tests-glamsterdam-devnet@v8.0.0.
Restate the implementation status against the devnet-8 EIP set, drop the
completed bal-devnet-7 work items, and replace them with what is actually
outstanding: EIP-8070 hive coverage, a devnet-8 zkEVM bundle, eth_simulateV1
and EIP-8189.
The Amsterdam bundle contributes two subtrees, but only `for_amsterdam` was
overlaid onto `vectors/eest`. `for_bpo2toamsterdamattime15k` is the only
fork-activation set targeting Amsterdam and exists nowhere else, so 39
blockchain and 40 engine fixtures spanning 13 EIPs never ran.

Drive both subtrees from a list and track the overlay with a stamp file, so the
target no longer claims to produce just one directory.
…versions

engine_newPayloadV1..V4 accepted an ExecutionPayload carrying `slotNumber` or
`blockAccessList`, which are defined only from V5. A pre-fork block with a slot
number was executed instead of being rejected with -32602.

V3 previously doubled as both the pre-Amsterdam shape and the base of the
Amsterdam one, so split the shared Cancun-onwards field checks out and let V5
keep requiring what the earlier versions now forbid.
The fork-based limits matched `fork_Amsterdam`, which does not appear in
`fork_BPO2ToAmsterdamAtTime15k`, so the daily Amsterdam runs saw none of the
fork-activation fixtures. Match `fork_.*Amsterdam` instead.

That limit no longer carries a literal fork name, so select the Amsterdam
bundle from an explicit matrix flag rather than a substring of the limit;
matching on the limit would silently fall back to the mainnet bundle, which
ships no Amsterdam fixtures.

Widen the EIP-list limits to the full Amsterdam set.
@edg-l
edg-l force-pushed the chore/bump-glamsterdam-devnet-8 branch from 53631af to e283567 Compare August 3, 2026 13:55
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

Benchmark Results Comparison

No significant difference was registered for any benchmark run.

Detailed Results

Benchmark Results: BubbleSort

Command Mean [s] Min [s] Max [s] Relative
main_revm_BubbleSort 3.024 ± 0.022 2.998 3.067 1.15 ± 0.01
main_levm_BubbleSort 2.641 ± 0.085 2.599 2.883 1.00 ± 0.03
pr_revm_BubbleSort 3.079 ± 0.039 3.045 3.183 1.17 ± 0.02
pr_levm_BubbleSort 2.633 ± 0.019 2.614 2.673 1.00

Benchmark Results: ERC20Approval

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_ERC20Approval 983.4 ± 7.6 975.6 996.7 1.02 ± 0.01
main_levm_ERC20Approval 974.3 ± 18.5 957.4 1015.0 1.01 ± 0.02
pr_revm_ERC20Approval 998.5 ± 8.7 985.3 1012.3 1.03 ± 0.01
pr_levm_ERC20Approval 966.0 ± 2.9 961.3 969.6 1.00

Benchmark Results: ERC20Mint

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_ERC20Mint 132.7 ± 1.1 131.6 135.6 1.00
main_levm_ERC20Mint 149.9 ± 1.7 148.6 154.5 1.13 ± 0.02
pr_revm_ERC20Mint 136.5 ± 1.8 135.0 141.0 1.03 ± 0.02
pr_levm_ERC20Mint 149.8 ± 1.5 148.3 152.9 1.13 ± 0.02

Benchmark Results: ERC20Transfer

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_ERC20Transfer 231.1 ± 0.6 230.1 231.7 1.00
main_levm_ERC20Transfer 246.2 ± 5.7 241.4 260.9 1.07 ± 0.02
pr_revm_ERC20Transfer 238.4 ± 10.6 232.7 267.9 1.03 ± 0.05
pr_levm_ERC20Transfer 245.6 ± 3.3 241.1 253.3 1.06 ± 0.01

Benchmark Results: Factorial

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_Factorial 223.1 ± 0.8 222.2 224.4 1.00
main_levm_Factorial 261.9 ± 9.3 257.4 288.1 1.17 ± 0.04
pr_revm_Factorial 224.7 ± 3.1 219.9 232.2 1.01 ± 0.01
pr_levm_Factorial 267.0 ± 12.5 259.9 298.0 1.20 ± 0.06

Benchmark Results: FactorialRecursive

Command Mean [s] Min [s] Max [s] Relative
main_revm_FactorialRecursive 1.651 ± 0.049 1.555 1.734 1.01 ± 0.04
main_levm_FactorialRecursive 9.264 ± 0.040 9.167 9.314 5.65 ± 0.16
pr_revm_FactorialRecursive 1.641 ± 0.046 1.524 1.687 1.00
pr_levm_FactorialRecursive 9.242 ± 0.035 9.192 9.290 5.63 ± 0.16

Benchmark Results: Fibonacci

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_Fibonacci 202.9 ± 3.4 200.9 212.3 1.00
main_levm_Fibonacci 226.9 ± 12.3 218.1 260.8 1.12 ± 0.06
pr_revm_Fibonacci 205.3 ± 2.9 197.1 207.0 1.01 ± 0.02
pr_levm_Fibonacci 231.8 ± 25.3 220.1 303.4 1.14 ± 0.13

Benchmark Results: FibonacciRecursive

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_FibonacciRecursive 874.5 ± 9.4 865.5 896.4 1.22 ± 0.02
main_levm_FibonacciRecursive 718.1 ± 6.2 711.8 731.2 1.00
pr_revm_FibonacciRecursive 858.6 ± 5.2 853.2 869.4 1.20 ± 0.01
pr_levm_FibonacciRecursive 723.2 ± 7.2 712.8 738.9 1.01 ± 0.01

Benchmark Results: ManyHashes

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_ManyHashes 8.5 ± 0.1 8.4 8.8 1.00
main_levm_ManyHashes 9.3 ± 0.3 9.1 10.0 1.09 ± 0.03
pr_revm_ManyHashes 8.6 ± 0.1 8.5 8.8 1.00 ± 0.02
pr_levm_ManyHashes 9.2 ± 0.1 9.1 9.3 1.08 ± 0.02

Benchmark Results: MstoreBench

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_MstoreBench 262.7 ± 6.0 258.2 275.2 1.36 ± 0.03
main_levm_MstoreBench 194.1 ± 1.8 191.7 196.6 1.00 ± 0.01
pr_revm_MstoreBench 263.3 ± 6.6 258.3 278.9 1.36 ± 0.04
pr_levm_MstoreBench 193.4 ± 2.0 190.7 196.1 1.00

Benchmark Results: Push

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_Push 287.4 ± 1.3 285.7 289.7 1.19 ± 0.01
main_levm_Push 241.0 ± 1.2 239.1 243.2 1.00 ± 0.01
pr_revm_Push 286.6 ± 1.0 285.6 288.8 1.19 ± 0.01
pr_levm_Push 240.7 ± 1.4 239.3 243.5 1.00

Benchmark Results: SstoreBench_no_opt

Command Mean [ms] Min [ms] Max [ms] Relative
main_revm_SstoreBench_no_opt 167.1 ± 2.0 163.1 170.7 1.63 ± 0.02
main_levm_SstoreBench_no_opt 105.0 ± 5.7 102.1 120.4 1.03 ± 0.06
pr_revm_SstoreBench_no_opt 166.1 ± 2.5 162.8 170.3 1.62 ± 0.02
pr_levm_SstoreBench_no_opt 102.4 ± 0.4 102.1 103.0 1.00

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

EF Tests Comparison

Test Name MAIN PR DIFF
Summary: 56628/56628 (100.00%) 72432/72432 (100.00%) ➖️ 15804
Osaka: 13739/13739 (100.00%) 13739/13739 (100.00%) ➖️
Prague: 15707/15707 (100.00%) 15707/15707 (100.00%) ➖️
Cancun: 16993/16993 (100.00%) 16993/16993 (100.00%) ➖️
Shanghai: 5271/5271 (100.00%) 5271/5271 (100.00%) ➖️
Paris: 4918/4918 (100.00%) 4918/4918 (100.00%) ➖️

@edg-l

edg-l commented Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

On the Codex point about for_bpo2toamsterdamattime15k reaching the stateless path: it does not, for two independent reasons.

The stateless harness reads a different corpus. tests/all.rs sets TEST_FOLDER = "vectors_zkevm/" under the stateless feature, while the AMSTERDAM_SUBTREES overlay this PR adds extracts into $(SPECTEST_VECTORS_DIR) = vectors/eest. Nothing this PR overlays is visible to the stateless run.

And the zkevm extraction is narrowed to one subtree: $(ZKEVM_VECTORS_DIR) untars only fixtures/blockchain_tests/for_amsterdam (Makefile:82). The v0.6.2 bundle does ship a for_bpo2toamsterdamattime15k directory, but it is never extracted, so it is not in vectors_zkevm/ either.

The ordering observation itself is correct and intentional: BPO2ToAmsterdamAtTime15k sits before Amsterdam, the same way CancunToPragueAtTime15k sits before Prague. So test.network >= Fork::Amsterdam means "fixtures whose whole chain is Amsterdam", which is the right predicate for a corpus that only contains for_amsterdam. It would become too narrow only if the zkevm extraction were widened to match AMSTERDAM_SUBTREES, which would also need the devnet-8 fill to exist first.

edg-l added 4 commits August 5, 2026 13:33
Amsterdam declares no blob params of its own, so per EIP-7892 the params in
force are those of the highest activated BPO entry. Swapping to BPO2's entry
whenever Amsterdam is active picked target 14 / max 21 on a chain that only
scheduled BPO1, which rejects a parent that spent between 10 and 14 blobs:
the EIP-7918 target check returns 0 where the network takes the reserve-price
branch.
get_blob_schedule_for_fork read the entry named after the fork, so a named
fork that declares no entry of its own reported no blob schedule at all.
Resolve through the fork's activation timestamp instead, which reuses the
inheritance rules already in get_fork_blob_schedule.
The light variant is a two-participant Amsterdam blob-schedule repro: BPO1 is
the only scheduled BPO, so Amsterdam inherits target 10 / max 15.
EIP-8038's revised gas schedule lowers COLD_STORAGE_ACCESS to 2100 and raises
ACCOUNT_WRITE to 9000, which moves CALL_VALUE, CREATE_ACCESS and the storage
clear refund with it. Derive those three from their inputs so the next
repricing is a one-line change.
}

/// Per-storage-key access-list cost. EIP-8038 raises this from 1900 to 3000 at Amsterdam.
/// Per-storage-key access-list cost. EIP-8038 raises this from 1900 to 2900 at Amsterdam.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This says 2900, but the constant it documents evaluates to 2000.

ACCESS_LIST_STORAGE_KEY_COST_AMSTERDAM = COLD_STORAGE_ACCESS_AMSTERDAM - WARM_ADDRESS_ACCESS_COST
                                       = 2100 - 100
                                       = 2000

The 2900 figure is the address case, where COLD_ACCOUNT_ACCESS_AMSTERDAM is 3000 — that line above is correct. Both comments were moved from 3000 to 2900 together, but the storage-key one also needed recomputing because this PR drops COLD_STORAGE_ACCESS_AMSTERDAM from 3000 to 2100. So the value is right and the formula is applied consistently; only the number in the prose is stale.

Worth fixing rather than leaving, because on a gas constant the comment is what a cross-client check reads. Someone diffing ethrex against the EIP or another client sees 2900, finds 2000 in the fixtures, and has to work out which of the two is lying. 1900 to 2000 keeps the sentence shape.

Same paragraph is also the one place COLD_STORAGE_ACCESS_AMSTERDAM: 3000 -> 2100 shows up — the PR description covers the EIP-2780 and access-list moves but not that one, nor ACCOUNT_WRITE 8000 -> 9000, CALL_VALUE -> 11300 or CREATE_ACCESS -> 12000. All plausibly EIP-8038 repricing, but a reader reconciling against devnet-8 would have an easier time if the description listed them.

pub const COLD_STORAGE_ACCESS_AMSTERDAM: u64 = 3000;
pub const ACCESS_LIST_ADDRESS_COST_AMSTERDAM: u64 = 3000;
pub const ACCESS_LIST_STORAGE_KEY_COST_AMSTERDAM: u64 = 3000;
pub const COLD_STORAGE_ACCESS_AMSTERDAM: u64 = 2100;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The title is test(l1): bump Amsterdam fixtures to glamsterdam-devnet-8, but this hunk changes the Amsterdam gas schedule and engine/payload.rs changes which payload versions accept slotNumber/blockAccessList. Only 2 of the 30 files are fixtures.

Flagging the type specifically because it outlives the PR: on a squash merge the title becomes the commit subject in main, so the durable record of a consensus gas change reads test(l1). Anyone later scanning history or generating release notes for behaviour changes filters it out. A stale description is ephemeral and I would not raise it; a stale type is not.

fix(l1) looks right — the body frames these as conformance corrections against devnet-8, and the engine half fixes payloads that were wrongly accepted.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

L1 Ethereum client

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

3 participants