refactor(l1): replace proof coordinator with zkboost sidecar#6427
Conversation
Per ethereum/EIPs#11311, the EIP-7708 log event is renamed from Selfdestruct(address,uint256) to Burn(address,uint256) with a new topic hash.
Reject blocks whose block access list exceeds the gas-derived limit: bal_items * ITEM_COST <= available_gas + system_allowance
This reverts commit 4662fde.
Align DUPN, SWAPN, and EXCHANGE decoding with the updated EIP-8024 spec (ethereum/EIPs#11306). decode_single now uses (x + 145) % 256 instead of branching, and decode_pair uses XOR 0x8F instead of conditional subtraction. EXCHANGE valid range extended from 0x00-0x4F to 0x00-0x51, adding two new swappable pairs (14,15) and (14,16).
- Subtract remaining state_gas_reservoir from gas_used in finalize_execution (unused reservoir is returned, not consumed) - EIP-7702 auth refund returns to state gas reservoir for Amsterdam+ instead of regular refund counter - Skip Osaka TX_MAX_GAS_LIMIT cap for Amsterdam+ (EIP-8037 reservoir model removes the per-tx gas limit restriction)
EIP-8037 state gas for new account creation must be consumed even if CREATE fails due to insufficient balance, depth limit, or max nonce. Only initcode revert refunds the state gas via the snapshot mechanism.
…tion When an SSTORE restores a slot to zero (0→x→0), the state gas refund must go through the normal refund counter (subject to the 1/5 cap), not directly reduce state_gas_used. The state_gas_used must reflect peak consumption for block-level max(regular, state) accounting per EIP-7778/EIP-8037.
Three related fixes for state gas accounting in Amsterdam fork: 1. increase_state_gas must not mutate on OOG: Reorder to charge gas first, then decrement reservoir, then increment state_gas_used. On OOG the early return leaves all counters unmodified (matches EELS). 2. Track orphaned state gas spill in reverted children: When child frames consume spilled state gas then revert, state_gas_used is restored but the spill remains in gas_used. Track this via reverted_child_state_spill counter and exclude from regular gas derivation in refund_sender. 3. CREATE account state gas survives initcode revert: Move state_gas_used/reservoir snapshots to AFTER the account state gas charge. Per EELS, CREATE's account charge is in the parent frame and persists even when initcode reverts.
Two fixes for Amsterdam EIP-8037 state gas accounting: 1. CREATE collision gas excluded from regular dimension: On CREATE2 address collision, reserved child gas is consumed but per EELS escrow mechanism it should not count as regular gas. Add the consumed gas_limit to the exclusion counter so derived regular gas is not inflated. 2. Amsterdam intrinsic regular gas cap validation: Add missing EELS check that rejects TXs where max(intrinsic_regular, calldata_floor) exceeds TX_MAX_GAS_LIMIT. Regular gas is capped at TX_MAX_GAS_LIMIT in Amsterdam (excess becomes state gas reservoir), so intrinsic regular cost must fit within the cap.
execution-spec-tests reorganized fixtures into per-fork subdirectories (e.g., fixtures/state_tests/for_amsterdam/ instead of fixtures/state_tests/amsterdam/).
Matches EELS where charge_state_gas() is called in create()/create2() before generic_create() computes the child gas limit. Previously the state gas was charged inside generic_create() after the 63/64 reservation, leaving the parent with ~2,796 gas remaining; when the reservoir is 0 (gas_limit < TX_MAX_GAS_LIMIT) the 131,488-gas spill would OOG. Moving the charge to op_create/op_create2 ensures child gas is 63/64 of the gas remaining after state gas is accounted for. Fixes test_selfdestruct_to_self_same_tx (all 4 variants).
- Fix validate_block_access_list_size to match EELS: the check is simply `bal_items > gas_limit / GAS_BLOCK_ACCESS_LIST_ITEM` with no system allowance or per-tx base cost adjustment. - Fix SSTORE to charge state gas before regular gas per EELS ordering. At the OOG boundary, the charge order determines which gas type is consumed: state gas spills into gas_remaining first, then the regular charge may OOG with the correct state_gas_used recorded. - Remove unused constants BAL_TX_BASE_COST, MAX_WITHDRAWAL_REQUESTS_PER_BLOCK, MAX_CONSOLIDATION_REQUESTS_PER_BLOCK.
Resolve merge conflicts from BAL parallel execution PR and fix EIP-8037 gas accounting in execute_block_parallel: track regular and state gas separately, compute block_gas_used = max(regular, state) to match the sequential path.
Add comprehensive BAL validation for the parallel block execution path: - validate_bal_index_zero: verify system call (index 0) entries against actual prepare_block effects, detecting extraneous entries by comparing with pre-state from store - validate_bal_withdrawal_index: verify withdrawal/request-extraction index entries against actual post-withdrawal state in the DB - validate_tx_execution: smarter PART B check comparing absent-from-BAL accounts with pre-execution state (system_seed/store) to distinguish warm-access artifacts from genuine missing entries - validate_ordering: add storage conflict check (slot in both storage_changes and storage_reads) - validate_header_bal_indices: validate BAL indices don't exceed max valid index for the block - validate_bal_index_zero check for prospective gas limit Reduces bal@v5.2.0 test failures from 43 to 6 (remaining are read-only extraneous entries needing BAL hash comparison).
- Allow as_conversions for AMSTERDAM_INIT_CODE_MAX_SIZE const (u64→usize is safe for this small value) - Replace += with saturating_add for reverted_child_state_spill to satisfy arithmetic_side_effects lint
Add an explicit accessed_accounts tracker to GeneralizedDatabase that records all addresses loaded via load_account during parallel execution. This detects extraneous BAL "pure-access" entries (accounts with no mutations and no storage reads that were never accessed). Also fix two edge cases: - EXTCODECOPY with size=0 now loads the target account so the tracker records the access (previously early-returned before any DB read). - Storage_read validation for selfdestructed accounts now handles both Destroyed and DestroyedModified statuses.
Merge main's OpcodeHandler trait refactor with BAL/EIP-8037 state gas tracking. Resolved conflicts in 4 levm files while preserving all Amsterdam-specific changes (state gas reservoir, SSTORE costs, SELFDESTRUCT state gas, init code size limit, burn log rename).
Add EIP-specific Amsterdam hive tests (~1000 tests) to the PR workflow using bal@v5.2.0 fixtures. Also bump daily hive from bal@v5.1.0 to v5.2.0.
The function compared BAL system-call entries against local re-execution of prepare_block, which is redundant (BAL is already authenticated by its hash in the header, and the state root validates execution). It also broke on multi-block fixtures where block N+1's BAL references block N's hash but the fixture was generated with a different header layout (e.g. Prague tests running on Amsterdam fork).
There was a problem hiding this comment.
Pull request overview
This PR refactors the proving infrastructure by extracting shared prover/protocol types into a new crates/prover crate, updates L2 components to use the new generic ProofData/ProverOutput protocol, and extends the RPC/REPL tooling to support zkboost-oriented debug endpoints and authenticated Engine API calls. It also adds/updates EIP-8025-related SSZ types and documentation, plus expands EF test tooling to consume zkevm fixtures with embedded execution witnesses.
Changes:
- Introduce shared prover crate (
ethrex-prover) and migrate L2 prover/coordinator/storage flows fromBatchProoftoProverOutputand fromBatchRequest/Responseto genericInputRequest/Response. - Add new debug RPC methods (
debug_executionWitnessByBlockHash,debug_chainConfig) and enhanceethrex-replwith authrpc JWT support plus variable assignment/reference + completion. - Extend EF blockchain test runner/types + Makefile to support zkevm fixtures that embed
executionWitness.
Reviewed changes
Copilot reviewed 76 out of 83 changed files in this pull request and generated 6 comments.
Show a summary per file
| File | Description |
|---|---|
| tooling/repl/tests/e2e.rs | Updates REPL construction in e2e tests. |
| tooling/repl/src/variables.rs | Adds shared variable store for REPL assignments/completion. |
| tooling/repl/src/repl.rs | Adds authrpc client selection + variables + $var resolution + arithmetic offsets. |
| tooling/repl/src/parser.rs | Adds tokens/AST for assignment and $var.path (+/- N) parsing. |
| tooling/repl/src/main.rs | Adds CLI flags for authrpc endpoint + JWT secret. |
| tooling/repl/src/lib.rs | Wires authrpc client creation and JWT secret loading into REPL runner. |
| tooling/repl/src/completer.rs | Adds $ variable/field completion and .vars builtin completion. |
| tooling/repl/src/commands/mod.rs | Registers new engine command namespace. |
| tooling/repl/src/commands/engine.rs | Adds Engine API command definitions (incl. EIP-8025 proof methods). |
| tooling/repl/src/client.rs | Adds optional JWT bearer auth for RPC client requests. |
| tooling/repl/Cargo.toml | Adds jsonwebtoken dependency for authrpc JWT. |
| tooling/ef_tests/blockchain/types.rs | Extends fixture Block with optional zkevm fields; relaxes top-level serde strictness. |
| tooling/ef_tests/blockchain/tests/all.rs | Updates prover crate import path. |
| tooling/ef_tests/blockchain/test_runner.rs | Adds stateless-from-fixture path using executionWitness; minor execution tweaks. |
| tooling/ef_tests/blockchain/Makefile | Adds zkevm fixtures download/extract targets and includes them in test recipes. |
| tooling/ef_tests/blockchain/Cargo.toml | Switches ethrex-prover dependency to workspace. |
| tooling/ef_tests/blockchain/.fixtures_url_zkevm | Adds URL for zkevm fixture tarball. |
| tooling/Cargo.toml | Renames L2 prover dep to ethrex-l2-prover and adds shared ethrex-prover. |
| tooling/Cargo.lock | Lockfile updates for tooling workspace changes. |
| docs/eip-8025.md | Adds detailed EIP-8025 architecture/spec doc (Engine API + coordinator flow). |
| docs/eip-8025-zkboost-testnet.md | Adds Lighthouse + zkboost + ethrex local testnet guide. |
| docs/eip-8025-demo.md | Adds demo guide relying on old Engine API proof endpoints/coordinator. |
| crates/prover/src/prover.rs | Adds generic prover pull-loop GenServer over ProofData<I>. |
| crates/prover/src/protocol.rs | Re-exports ProofData protocol from ethrex-common. |
| crates/prover/src/lib.rs | Exposes shared prover APIs and re-exports core prover types. |
| crates/prover/src/backend/zisk.rs | Migrates ZisK backend to ProverOutput conversion API. |
| crates/prover/src/backend/sp1.rs | Migrates SP1 backend to ProverOutput (proof bytes + optional public values). |
| crates/prover/src/backend/risc0.rs | Migrates RISC0 backend to ProverOutput (seal bytes + optional public values). |
| crates/prover/src/backend/openvm.rs | Migrates OpenVM backend conversion API to ProverOutput. |
| crates/prover/src/backend/mod.rs | Updates ProverBackend trait to emit ProverOutput instead of BatchProof. |
| crates/prover/src/backend/exec.rs | Updates Exec backend: executes only; emits sentinel proof bytes; EIP-8025 execution path. |
| crates/prover/src/backend/error.rs | Renames error variant to ProofConversion. |
| crates/prover/Cargo.toml | Adds new shared prover crate manifest and features. |
| crates/networking/rpc/utils.rs | Adds EIP-8025-specific RPC error variants and codes. |
| crates/networking/rpc/types/payload.rs | Adjusts ExecutionPayload field visibilities (pub(crate)) for internal use. |
| crates/networking/rpc/rpc.rs | Adds debug method routing + custom Debug impl for RpcApiContext. |
| crates/networking/rpc/debug/mod.rs | Registers new debug submodules (chain config + witness by hash). |
| crates/networking/rpc/debug/execution_witness.rs | Removes local witness conversion helper; keeps witness RPC handler. |
| crates/networking/rpc/debug/execution_witness_by_hash.rs | Adds debug_executionWitnessByBlockHash handler. |
| crates/networking/rpc/debug/chain_config.rs | Adds debug_chainConfig handler. |
| crates/networking/rpc/Cargo.toml | Adds eip-8025 feature wiring; optional libssz deps. |
| crates/l2/tee/quote-gen/src/sender.rs | Updates protocol usage to generic ProofData<ProverInputData> and ProverOutput. |
| crates/l2/tee/quote-gen/src/main.rs | Updates quote proof submission to ProverOutput::Proof. |
| crates/l2/storage/src/store.rs | Updates stored proof type from BatchProof to ProverOutput. |
| crates/l2/storage/src/store_db/sql.rs | Updates SQL store proof serialization type to ProverOutput. |
| crates/l2/storage/src/store_db/in_memory.rs | Updates in-memory proof map to ProverOutput. |
| crates/l2/storage/src/api.rs | Updates rollup store trait signatures to ProverOutput. |
| crates/l2/sequencer/utils.rs | Switches verifier getter to new verifier_getter helper. |
| crates/l2/sequencer/proof_coordinator.rs | Migrates coordinator protocol/messages to generic ProofData<ProverInputData> + ProverOutput. |
| crates/l2/sequencer/l1_proof_verifier.rs | Updates verification flow for optional public values; uses ProverOutput. |
| crates/l2/sequencer/l1_proof_sender.rs | Updates on-chain/aligned submission paths for ProverOutput-based proofs. |
| crates/l2/sequencer/errors.rs | Adds explicit MissingPublicValues error for verifier. |
| crates/l2/prover/src/prover.rs | Replaces local prover loop with shared ethrex_prover::start_prover. |
| crates/l2/prover/src/lib.rs | Re-exports shared prover backend/protocol types via L2 prover crate. |
| crates/l2/prover/Cargo.toml | Renames crate to ethrex-l2-prover and depends on shared ethrex-prover. |
| crates/l2/networking/rpc/Cargo.toml | Adds eip-8025 feature passthrough to ethrex-rpc. |
| crates/l2/Makefile | Updates logging target names for renamed prover crate. |
| crates/l2/common/src/prover.rs | Re-exports prover types from ethrex-common; adds verifier_getter helper. |
| crates/guest-program/src/l2/input.rs | Adds From<ProverInputData> conversion into ProgramInput. |
| crates/guest-program/src/l1/program.rs | Adds EIP-8025 execution path: SSZ root + payload→block conversion + witness execution. |
| crates/guest-program/src/l1/output.rs | Splits program output structs by eip-8025 feature. |
| crates/guest-program/src/l1/mod.rs | Re-exports EIP-8025 encode/decode helpers under feature flag. |
| crates/guest-program/src/l1/input.rs | Adds EIP-8025 wire-format encode/decode helpers for (SSZ, rkyv) input. |
| crates/guest-program/Cargo.toml | Adds optional libssz deps and eip-8025 feature. |
| crates/guest-program/bin/zisk/src/main.rs | Adds EIP-8025 input decode path for zkVM guest. |
| crates/guest-program/bin/sp1/src/main.rs | Adds EIP-8025 input decode path for zkVM guest. |
| crates/guest-program/bin/risc0/src/main.rs | Adds EIP-8025 input decode path for zkVM guest. |
| crates/guest-program/bin/openvm/src/main.rs | Adds EIP-8025 input decode path for zkVM guest. |
| crates/common/types/prover.rs | Introduces shared ProverType, ProverOutput, and generic ProofData<I>. |
| crates/common/types/mod.rs | Exposes new prover module and gates eip8025_ssz under feature. |
| crates/common/types/eip8025_ssz.rs | Adds SSZ containers + hashing helpers and tests for EIP-8025. |
| crates/common/types/block_execution_witness.rs | Moves RPC→internal witness conversion onto RpcExecutionWitness impl. |
| crates/common/Cargo.toml | Adds optional libssz deps and eip-8025 feature. |
| crates/blockchain/Cargo.toml | Adds optional deps for EIP-8025-related functionality and feature flag. |
| cmd/ethrex/l2/options.rs | Updates imports to renamed ethrex_l2_prover crate. |
| cmd/ethrex/l2/command.rs | Switches prover subcommand to ethrex_l2_prover::init_client. |
| cmd/ethrex/cli.rs | Extends repl subcommand with authrpc endpoint + JWT secret options. |
| cmd/ethrex/Cargo.toml | Switches L2 prover dep name and adds eip-8025 feature wiring. |
| Cargo.toml | Adds shared crates/prover member; updates workspace deps for prover crates. |
| Cargo.lock | Lockfile updates for new crates/features and libssz dependencies. |
| .gitignore | Ignores additional OpenSpec-related directories/files. |
| .github/workflows/pr-main_l2.yaml | Updates L2 workflow logs to renamed prover crate target. |
| .github/workflows/main_prover.yaml | Updates prover workflow invocation/log filters to renamed prover crate. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| fn repl(&self) -> Repl { | ||
| Repl::new( | ||
| RpcClient::new(self.endpoint.clone()), | ||
| None, | ||
| "/tmp/ethrex_repl_test_history".to_string(), | ||
| 9200, | ||
| 300, | ||
| ) |
There was a problem hiding this comment.
Repl::new is being called with 5 arguments here, but the current Repl::new constructor only accepts (client, authrpc_client, history_path). This will not compile; update the test helper to match the new constructor signature (and configure any proof-callback related settings via the new API, if still needed).
| CommandDef { | ||
| namespace: "engine", | ||
| name: "requestProofsV1", | ||
| rpc_method: "engine_requestProofsV1", | ||
| params: REQUEST_PROOFS_V1, | ||
| description: "Request proof generation for an execution payload (EIP-8025)", | ||
| }, | ||
| CommandDef { | ||
| namespace: "engine", | ||
| name: "verifyExecutionProofV1", | ||
| rpc_method: "engine_verifyExecutionProofV1", | ||
| params: VERIFY_EXECUTION_PROOF_V1, | ||
| description: "Verify and store an execution proof (EIP-8025)", | ||
| }, | ||
| CommandDef { | ||
| namespace: "engine", | ||
| name: "verifyNewPayloadRequestHeaderV1", | ||
| rpc_method: "engine_verifyNewPayloadRequestHeaderV1", | ||
| params: VERIFY_NEW_PAYLOAD_REQUEST_HEADER_V1, | ||
| description: "Check if enough proofs exist for a payload header (EIP-8025)", | ||
| }, |
There was a problem hiding this comment.
This REPL command registry adds EIP-8025 proof Engine API methods (engine_requestProofsV1, engine_verifyExecutionProofV1, engine_verifyNewPayloadRequestHeaderV1), but there are no corresponding RPC handlers in the node codebase (repo-wide search only finds these names here). As-is, the REPL will suggest/attempt methods that the node cannot serve; either remove these commands or gate them behind the same feature/config that enables the server-side endpoints.
| # EIP-8025: Execution Layer Triggerable Proofs | ||
|
|
||
| ## Overview | ||
|
|
||
| EIP-8025 enables beacon nodes to verify execution payload validity without re-executing transactions, using zkEVM proofs instead. This implementation adds three new Engine API endpoints, a distributed proving coordinator, and modifications to the guest program — all behind the `eip-8025` feature flag. | ||
|
|
||
| ethrex is uniquely positioned for this: it already has a complete witness generation pipeline, guest programs for stateless re-execution inside zkVMs (SP1, RISC0, ZisK, OpenVM), and a distributed proving infrastructure for L2. This change brings those capabilities to L1. | ||
|
|
There was a problem hiding this comment.
The document claims ethrex implements Engine API proof endpoints and an internal proof coordinator, but the PR description states these components were removed in favor of a zkboost sidecar (and the codebase no longer contains handlers for engine_requestProofsV1 etc.). This doc is likely outdated/misleading; please update it to describe the zkboost flow (debug witness + chain config) or remove/move it to historical docs.
| # EIP-8025: Demo Guide | ||
|
|
||
| This guide walks through the full EIP-8025 proof generation and verification flow using a local ethrex node, the `ethrex-repl`, and the L1 prover binary. It exercises all three Engine API endpoints and the coordinator-prover TCP protocol. | ||
|
|
||
| For architecture and implementation details, see [docs/eip-8025.md](eip-8025.md). | ||
|
|
||
| --- | ||
|
|
||
| ## Prerequisites | ||
|
|
||
| Build ethrex with the `eip-8025` feature and the L1 prover binary: | ||
|
|
||
| ```bash | ||
| cargo build --release --features eip-8025,dev --bin ethrex | ||
| cargo build --release --features "eip-8025,l1-prover-bin" -p ethrex-prover --bin l1_prover | ||
| ``` |
There was a problem hiding this comment.
This demo guide depends on the removed Engine API proof endpoints (engine_requestProofsV1, engine_verifyExecutionProofV1, etc.) and the internal coordinator/L1 prover binary. Given the PR's stated migration to zkboost + debug RPC methods, this guide is now out of date and will lead readers down a non-working path; update it to the zkboost-based workflow or remove it.
| fn read_jwtsecret_file(path: &str) -> Vec<u8> { | ||
| let content = std::fs::read_to_string(path) | ||
| .unwrap_or_else(|e| panic!("Failed to read JWT secret from {path}: {e}")); | ||
| let hex_str = content.trim().strip_prefix("0x").unwrap_or(content.trim()); | ||
| hex::decode(hex_str).unwrap_or_else(|e| panic!("Invalid hex in JWT secret file: {e}")) | ||
| } |
There was a problem hiding this comment.
read_jwtsecret_file panics on I/O or hex-decoding errors, which will crash the REPL without a user-friendly message. Prefer returning a Result from run/CLI parsing and surface a readable error (including the path) so misconfiguration doesn't abort the process with a panic backtrace.
| // Attempt to add the block as the head of the chain | ||
| let chain_result = blockchain.add_block_pipeline(block, None); | ||
| let chain_result = blockchain.add_block_pipeline(block.clone(), None); | ||
|
|
There was a problem hiding this comment.
block.clone() looks unnecessary here: add_block_pipeline can likely take ownership of block directly since block is not used afterwards (the hash is already computed). Avoiding this extra clone will reduce per-test overhead, especially when running large fixture suites.
Resolve conflicts from eip-8025 merge into main: keep libssz workspace renames (theirs), keep proof coordinator/endpoint removals (ours), re-delete proof_coordinator/ and proof.rs/proof_types.rs that main re-added, clean up all proof_coordinator references from RPC context, initializers, test_utils, and CLI.
fix collapsible_if clippy lint in chain_config.rs.
There was a problem hiding this comment.
A few things I noticed that are still hanging around from the old proof coordinator:
-
tooling/repl/src/commands/engine.rs:139-156still registersengine_requestProofsV1,engine_verifyExecutionProofV1, andengine_verifyNewPayloadRequestHeaderV1. Those endpoints don't exist anymore, so the REPL will suggest commands that always fail. -
docs/eip-8025-demo.mdstill describes the old demo flow with the coordinator andl1_proverbinary. Now that we havedocs/eip-8025-zkboost-testnet.md, the old one should be deleted or at least point to the new guide. -
cmd/ethrex/cli.rs:358-386still defines--proof.callback-url,--proof.coordinator-addr, and--proof.coordinator-port(plus defaults at 470-474). Nothing reads these anymore after the coordinator removal — dead code. -
EXECUTION_PROOFSandEXECUTION_PROOF_ROOTStables incrates/storage/(store.rsandapi/tables.rs) plus all their methods (store_execution_proof,get_execution_proof,get_execution_proofs,store_root_to_block,get_block_number_by_root, cleanup logic) — no callers left anywhere in the codebase. The only consumers were the removed coordinator and engine endpoints. Should be deleted.
| } else { | ||
| formatted | ||
| } | ||
| let _ = cmd; // suppress unused warning |
There was a problem hiding this comment.
Nit: you can just ignore it in the destructure instead:
Ok((result, _)) => {| Two new tables in Store: | ||
|
|
||
| **`EXECUTION_PROOFS`** — stores proof data, following the same pattern as `EXECUTION_WITNESSES`: | ||
| New `EXECUTION_PROOFS` table in Store, following the same pattern as `EXECUTION_WITNESSES`: |
There was a problem hiding this comment.
This doc still talks about the internal proof coordinator, the three engine proof endpoints, etc. — all removed in this PR. Only the EXECUTION_PROOF_ROOTS table section got cleaned up. Should be updated to reflect the zkboost flow or marked as superseded by the new testnet guide.
- Remove 3 dead REPL engine commands (requestProofsV1, verifyExecutionProofV1, verifyNewPayloadRequestHeaderV1) and their param definitions - Delete outdated eip-8025-demo.md (replaced by eip-8025-zkboost-testnet.md) - Remove dead CLI args: --proof.callback-url, --proof.coordinator-addr, --proof.coordinator-port - Remove EXECUTION_PROOFS and EXECUTION_PROOF_ROOTS tables and all associated storage methods (store/get/cleanup) which had no callers - Fix destructure nit: use Ok((result, _)) instead of let _ = cmd
Resolve modify/delete conflicts in tooling/repl/ by keeping deletion (files now live in ethrex-tooling). Port repl changes from #6427 (proof coordinator removal) to ethrex-tooling and update Cargo.lock to pick up the new revision.
…ollups to the simplified EIP-8025 architecture from PR #6427. Main replaced the proof coordinator with a zkboost sidecar pattern, deleting the proof coordinator module, engine proof RPCs, REPL proof callback, and l1_prover binary. This merge accepts all those deletions and keeps only the native rollups changes on top. Key adaptations: - Rename feature flag from stateless-validation to eip-8025 (matches main) - Migrate SSZ imports from ssz/ssz_types/ssz_derive/ssz_merkle to libssz/libssz_types/libssz_derive/libssz_merkle (workspace deps) - Deduplicate SSZ types: stateless_ssz.rs now re-exports common types from eip8025_ssz.rs instead of duplicating them - Migrate native rollup actors (l1_watcher, block_producer, l1_advancer) from old GenServer API to new Actor/#[protocol] API - Adapt to new init_rpc_api signature, get_local_p2p_node return type, and BlockchainOptions::precompute_witnesses field - Make new_payload_request_to_block public in guest-program for stateless.rs to use - Propagate eip-8025 feature through cmd/ethrex, ethrex-l2, and ethrex-guest-program dependency chains
…ollups to the simplified EIP-8025 architecture from PR #6427. Main replaced the proof coordinator with a zkboost sidecar pattern, deleting the proof coordinator module, engine proof RPCs, REPL proof callback, and l1_prover binary. This merge accepts all those deletions and keeps only the native rollups changes on top. Key adaptations: - Rename feature flag from stateless-validation to eip-8025 (matches main) - Migrate SSZ imports from ssz/ssz_types/ssz_derive/ssz_merkle to libssz/libssz_types/libssz_derive/libssz_merkle (workspace deps) - Deduplicate SSZ types: stateless_ssz.rs now re-exports common types from eip8025_ssz.rs instead of duplicating them - Migrate native rollup actors (l1_watcher, block_producer, l1_advancer) from old GenServer API to new Actor/#[protocol] API - Adapt to new init_rpc_api signature, get_local_p2p_node return type, and BlockchainOptions::precompute_witnesses field - Make new_payload_request_to_block public in guest-program for stateless.rs to use - Propagate eip-8025 feature through cmd/ethrex, ethrex-l2, and ethrex-guest-program dependency chains
…re flag. Native rollups reuse the stateless validation infrastructure landed in main via #6427 (EIP-8025, zkboost sidecar): verify_stateless_new_payload, execution witnesses, and SSZ encoding. The feature flag is named experimental-devnet because it will also gate EIP-8142 (block-in-blobs) later — a devnet bundle rather than a commitment to any single EIP. Native rollup changes: - NativeRollup.sol rewritten with spec-aligned storage and SSZ-based advance() - L2Bridge uses BEACON_ROOTS (EIP-4788) instead of L1Anchor for L1 message Merkle roots; L1Anchor.sol removed - L2 actors: NativeBlockProducer, NativeL1Watcher, NativeL1Advancer (Actor/#[protocol] API) - EXECUTE precompile delegates to StatelessValidator trait (~110 lines, down from 587) - MPT proof verification handles inline nodes for small state tries - Withdrawal claim path nibblization fix - StatelessValidator threaded through tracing for Blockscout compatibility Shared infrastructure: - SSZ types for native rollups re-export common types (SszStatelessInput, SszChainConfig, SszExecutionWitness, SszStatelessValidationResult) - verify_stateless_new_payload in crates/blockchain/stateless.rs shared between EXECUTE precompile, EIP-8025 engine, and zkVM guests EF stateless tests: 6053/6158 passing.
…n/stateless.rs. The docstring previously listed three entry points including "EIP-8025 RPC proof generation flow" — that flow no longer exists in the execution client (proof generation moved to the zkboost sidecar in #6427), so it is replaced with the two real entry points (EXECUTE precompile and zkVM guest) and the redundant repetition of the function name is removed. On the tracing side: drop the 27-line block-header diagnostic dump that fired at error-level on every block_hash mismatch — the returned error string already carries expected vs computed hash, which is the only breadcrumb an operator needs. Also drop the per-call "validation succeeded" info log, the "deserializing N bytes" debug log, and the "decoded SSZ input" info dump that echoed six fields of every inbound stateless input — all of them fired once per block on the hot path. The remaining logs are the two genuine failure breadcrumbs (validation error, SSZ decode error).
…in. Commit 87396be added an EXECUTION_PROOFS rocksdb column family, a MAX_PROOF_BLOCKS=128 retention constant, and roughly 180 lines of proof-storage helpers (make_proof_key, store_root_to_block, get_block_for_root, store_execution_proof, get_execution_proof, get_execution_proofs, count_execution_proofs, prune_old_proofs). The doc comment attributes all of it to EIP-8025, but the EIP-8025 / zkboost sidecar that landed on main via #6427 uses a completely different architecture that never writes to this table — and a codebase-wide search for the new symbols finds zero callers outside crates/storage/store.rs itself. Creating an unused column family would force every real user to carry a dead table through the next migration for nothing. These blocks are stale work-in-progress that slipped in during the main→branch merge conflict resolution; dropping them brings both files byte-identical to main.
Motivation
The Engine API spec for EIP-8025 proof endpoints (execution-apis PR #735) was closed. The proof node REST API that zkboost implements replaced it. ethrex's internal proof coordinator, Engine API proof endpoints, and proof storage were implementing a dead spec.
zkboost handles proof orchestration, the REST API Lighthouse expects, and SSE event delivery. ethrex only needs to serve two debug RPC methods for zkboost to fetch witnesses and chain config.
Description
Remove proof coordinator, Engine API proof endpoints, proof storage, l1_prover binary, REPL proof callback, and CLI flags (-2061 lines). Add two debug RPC methods (+87 lines) and a testnet setup guide (+265 lines).
Removed:
crates/blockchain/proof_coordinator/(coordinator, config, types, GenServer TCP server)crates/networking/rpc/engine/proof.rs+proof_types.rs(three Engine API handlers)EXECUTION_PROOFSDB table and all proof storage methodscrates/prover/src/bin/l1_prover.rstooling/repl/src/proof_callback.rs--proof.callback-url,--proof.coordinator-addr,--proof.coordinator-portAdded:
debug_executionWitnessByBlockHash(hash)— zkboost calls this to fetch the execution witnessdebug_chainConfig()— zkboost calls this on startup for chain configdocs/eip-8025-zkboost-testnet.md— guide for running Lighthouse + zkboost + ethrexTested end-to-end on ethrex-office-3: Lighthouse BN/VC producing blocks, zkboost fetching witnesses from ethrex, mock proofs generated and signed.