Skip to content

refactor(l1): replace proof coordinator with zkboost sidecar#6427

Merged
ilitteri merged 146 commits into
mainfrom
eip-8025-zkboost
Apr 15, 2026
Merged

refactor(l1): replace proof coordinator with zkboost sidecar#6427
ilitteri merged 146 commits into
mainfrom
eip-8025-zkboost

Conversation

@ilitteri

Copy link
Copy Markdown
Collaborator

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_PROOFS DB table and all proof storage methods
  • crates/prover/src/bin/l1_prover.rs
  • tooling/repl/src/proof_callback.rs
  • CLI: --proof.callback-url, --proof.coordinator-addr, --proof.coordinator-port

Added:

  • debug_executionWitnessByBlockHash(hash) — zkboost calls this to fetch the execution witness
  • debug_chainConfig() — zkboost calls this on startup for chain config
  • docs/eip-8025-zkboost-testnet.md — guide for running Lighthouse + zkboost + ethrex

Tested end-to-end on ethrex-office-3: Lighthouse BN/VC producing blocks, zkboost fetching witnesses from ethrex, mock proofs generated and signed.

edg-l added 30 commits March 3, 2026 09:44
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
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).
Copilot AI review requested due to automatic review settings April 7, 2026 20:20
@ilitteri

ilitteri commented Apr 7, 2026

Copy link
Copy Markdown
Collaborator Author

5badb5b

Copilot AI left a comment

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.

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 from BatchProof to ProverOutput and from BatchRequest/Response to generic InputRequest/Response.
  • Add new debug RPC methods (debug_executionWitnessByBlockHash, debug_chainConfig) and enhance ethrex-repl with 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.

Comment thread tooling/repl/tests/e2e.rs
Comment on lines 48 to 55
fn repl(&self) -> Repl {
Repl::new(
RpcClient::new(self.endpoint.clone()),
None,
"/tmp/ethrex_repl_test_history".to_string(),
9200,
300,
)

Copilot AI Apr 7, 2026

Copy link

Choose a reason for hiding this comment

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

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).

Copilot uses AI. Check for mistakes.
Comment thread tooling/repl/src/commands/engine.rs Outdated
Comment on lines +136 to +156
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)",
},

Copilot AI Apr 7, 2026

Copy link

Choose a reason for hiding this comment

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

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.

Copilot uses AI. Check for mistakes.
Comment thread docs/eip-8025.md
Comment on lines +1 to +8
# 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.

Copilot AI Apr 7, 2026

Copy link

Choose a reason for hiding this comment

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

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.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Comment thread docs/eip-8025-demo.md Outdated
Comment on lines +1 to +16
# 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
```

Copilot AI Apr 7, 2026

Copy link

Choose a reason for hiding this comment

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

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.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Comment thread tooling/repl/src/lib.rs
Comment on lines +45 to +50
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}"))
}

Copilot AI Apr 7, 2026

Copy link

Choose a reason for hiding this comment

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

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.

Copilot uses AI. Check for mistakes.
Comment on lines 145 to 147
// 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);

Copilot AI Apr 7, 2026

Copy link

Choose a reason for hiding this comment

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

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.

Copilot uses AI. Check for mistakes.
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.
@ilitteri ilitteri requested a review from ElFantasma April 8, 2026 15:31

@avilagaston9 avilagaston9 left a comment

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.

A few things I noticed that are still hanging around from the old proof coordinator:

  • tooling/repl/src/commands/engine.rs:139-156 still registers engine_requestProofsV1, engine_verifyExecutionProofV1, and engine_verifyNewPayloadRequestHeaderV1. Those endpoints don't exist anymore, so the REPL will suggest commands that always fail.

  • docs/eip-8025-demo.md still describes the old demo flow with the coordinator and l1_prover binary. Now that we have docs/eip-8025-zkboost-testnet.md, the old one should be deleted or at least point to the new guide.

  • cmd/ethrex/cli.rs:358-386 still 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_PROOFS and EXECUTION_PROOF_ROOTS tables in crates/storage/ (store.rs and api/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.

Comment thread tooling/repl/src/repl.rs Outdated
} else {
formatted
}
let _ = cmd; // suppress unused warning

@avilagaston9 avilagaston9 Apr 9, 2026

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.

Nit: you can just ignore it in the destructure instead:

Ok((result, _)) => {

Comment thread docs/eip-8025.md
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`:

@avilagaston9 avilagaston9 Apr 9, 2026

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 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.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

@ilitteri ilitteri requested a review from avilagaston9 April 14, 2026 16:35
- 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
@github-project-automation github-project-automation Bot moved this from In Progress to In Review in ethrex_l1 Apr 15, 2026
@ilitteri ilitteri added this pull request to the merge queue Apr 15, 2026
Merged via the queue into main with commit 68caad6 Apr 15, 2026
61 of 63 checks passed
@ilitteri ilitteri deleted the eip-8025-zkboost branch April 15, 2026 21:59
@github-project-automation github-project-automation Bot moved this from In Review to Done in ethrex_l1 Apr 15, 2026
ilitteri added a commit that referenced this pull request Apr 16, 2026
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.
avilagaston9 pushed a commit that referenced this pull request Apr 20, 2026
…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
avilagaston9 pushed a commit that referenced this pull request Apr 20, 2026
…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
avilagaston9 pushed a commit that referenced this pull request Apr 22, 2026
…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.
avilagaston9 pushed a commit that referenced this pull request Apr 23, 2026
…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).
avilagaston9 pushed a commit that referenced this pull request Apr 24, 2026
…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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

L1 Ethereum client

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

6 participants