Skip to content

EIP-8025#569

Open
frisitano wants to merge 9 commits into
ethereum:masterfrom
frisitano:feat/eip8025
Open

EIP-8025#569
frisitano wants to merge 9 commits into
ethereum:masterfrom
frisitano:feat/eip8025

Conversation

@frisitano
Copy link
Copy Markdown

@frisitano frisitano commented Jan 15, 2026

Adds the EIP-8025 beacon-node HTTP API: a GET for retrieving execution proofs by block id, and a POST for validators to submit signed execution proofs which the node verifies, stores, and gossips. Both endpoints live under /eth/v1/beacon/execution_proofs.

Aligned with the eth-act/lighthouse reference implementation. MAX_PROOF_SIZE is 400 KiB to match the consensus-specs bump in ethereum/consensus-specs#5162.

Related CL specs: ethereum/consensus-specs#5055 (refactor, merged), ethereum/consensus-specs#5162 (size bump, merged). Original CL PR: ethereum/consensus-specs#4828 (merged).

@frisitano frisitano marked this pull request as draft January 15, 2026 23:34
@frisitano frisitano marked this pull request as ready for review January 15, 2026 23:34
Comment thread apis/beacon/proofs/execution_proofs.yaml Outdated
Comment thread apis/prover/execution_proofs.yaml Outdated
Comment thread apis/prover/execution_proofs.yaml Outdated
Restructure the EIP-8025 endpoints to mirror the actual reference
implementation in `eth-act/lighthouse`:

- GET path: drop the `proofs/` segment.
  `/eth/v1/beacon/proofs/execution_proofs/{block_id}`
  -> `/eth/v1/beacon/execution_proofs/{block_id}`

- POST path: move under `beacon/`, drop the dedicated `Prover` tag.
  `/eth/v1/prover/execution_proofs`
  -> `/eth/v1/beacon/execution_proofs`

- POST body: validator-signed proofs wrapped in an object, matching
  lighthouse's `SubmitExecutionProofsRequest { proofs: Vec<...> }`.
  Drop `ProofGenId` and `GeneratedProof` (no longer used at the HTTP
  layer; proof-engine integration is internal to the EL via the
  Engine API).

- Signed-proof shape: `ProverSignedExecutionProof { prover_pubkey, .. }`
  -> `SignedExecutionProof { validator_index, .. }`. Lighthouse signs
  proofs with the validator's BLS key and identifies the signer by
  validator index, not by a separate prover pubkey.

- `proof_data` max: 300 KiB -> 400 KiB, matching `MaxProofSize` in
  lighthouse and the consensus-specs PR ethereum/consensus-specs#5162.

`redocly lint` passes; `swagger-cli bundle` resolves all refs cleanly.
The rebase onto upstream/master auto-resolved beacon-node-oapi.yaml
in favor of upstream, dropping the EIP-8025 path and component
entries. Restore them so the spec resolves to the new
apis/beacon/execution_proofs/*.yaml endpoints and types/eip8025/*.yaml
components.

Also add `KiB` to wordlist.txt to fix the spellcheck failure on
types/eip8025/execution_proof.yaml ("max 400 KiB ...").
- Attribute proof verification to the proof engine (not the EE).
- Replace "silently dropped" with "ignored" for SYNCING/NOT_SUPPORTED.
- Clarify that get_execution_proofs returns SignedExecutionProof objects.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@frisitano frisitano requested review from jsign and kevaundray April 29, 2026 10:24
Distinguish "client sent something wrong" (400) from "this BN instance
hasn't enabled the EIP-8025 feature" (501 Not Implemented).

- Add 501 response refs to both endpoints, pointing at the existing
  NotImplementedError component.
- Document the contract in each endpoint's description: "Beacon nodes
  running without an attached proof engine MUST return 501 Not Implemented."
- Revert the 400 descriptions and example back to client-side-only
  semantics, matching the precedent set by validator/*_selections.yaml.

Lighthouse code change to follow as a separate PR.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown

@jsign jsign left a comment

Choose a reason for hiding this comment

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

LGTM, just left some nits for your consideration.

Comment thread apis/beacon/execution_proofs/execution_proofs.yaml Outdated
Retrieves signed execution proofs for a given block id.
Depending on `Accept` header it can be returned either as JSON or as bytes serialized by SSZ.

Proofs are returned as an ordered list of `SignedExecutionProof` objects signed by validators.
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Nit: worth saying ordered by which field?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Good catch. I decided to remove the ordered term, as it surfaces an implementation detail from the lighthouse proof engine, but the proof engine is specifically specified as implementation-dependent in the consensus specs. I have now added terminology to explicitly state that clients MUST NOT depend on the order.

Comment on lines +59 to +60
"406":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/NotAcceptable"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Worth explaining more here or in description when this happens?
I suspect it is related to the Accept field in the request?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

You are correct its related to the Accept field. The convention in these specs across all methods is to just have a bare $ref, so I think we should maintain that standard here.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants