Skip to content

EIP-8025#735

Closed
frisitano wants to merge 4 commits into
ethereum:mainfrom
frisitano:feat/eip8025
Closed

EIP-8025#735
frisitano wants to merge 4 commits into
ethereum:mainfrom
frisitano:feat/eip8025

Conversation

@frisitano

@frisitano frisitano commented Jan 15, 2026

Copy link
Copy Markdown

Introduces the API for the proof engine.

CL PR: ethereum/consensus-specs#4828

@frisitano frisitano marked this pull request as ready for review January 15, 2026 23:35
Comment on lines +80 to +81
- name: engine_requestProofsV1
summary: Requests proof generation for a new payload request

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Checking, do we still need this if the proofs are pushed to the CL versus the CL requesting proofs from the proof engine?

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.

I think it makes sense to keep it. The CL should instruct the proof engine what blocks to generate proofs for. It requires consensus layer context to determine when a proof is required by that nodes builder. I think the flow is pretty clean if you look at the first diagram in this PR (prover replaced by builder in the future) ethereum/consensus-specs#4828. What do you think?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Ah I see, I think I merged some of the prover related responsibilities into zkboost -- but perhaps it doesn't matter

Comment thread src/engine/eip8025.md Outdated

The fields are encoded as follows:

- `newPayloadRequestRoot`: `DATA`, 32 Bytes - Root of the `NewPayloadRequest` being proven.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Do we need to be more explicit what root means in this context?
I think might be okay as it is if usually "root" means CL and "hash" means EL as Jihoon mentioned some days ago.

@frisitano frisitano Jan 23, 2026

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.

Yes, I think it is ok because a similar pattern and explanation is used for other constructs in the repo, e.g.:

  3. `parentBeaconBlockRoot`: `DATA`, 32 Bytes - Root of the parent beacon block.

Comment thread src/engine/eip8025.md Outdated
Comment on lines +51 to +69
This structure contains the header fields of an execution payload (without transactions):

- `parentHash`: `DATA`, 32 Bytes
- `feeRecipient`: `DATA`, 20 Bytes
- `stateRoot`: `DATA`, 32 Bytes
- `receiptsRoot`: `DATA`, 32 Bytes
- `logsBloom`: `DATA`, 256 Bytes
- `prevRandao`: `DATA`, 32 Bytes
- `blockNumber`: `QUANTITY`, 64 Bits
- `gasLimit`: `QUANTITY`, 64 Bits
- `gasUsed`: `QUANTITY`, 64 Bits
- `timestamp`: `QUANTITY`, 64 Bits
- `extraData`: `DATA`, 0 to 32 Bytes
- `baseFeePerGas`: `QUANTITY`, 256 Bits
- `blockHash`: `DATA`, 32 Bytes
- `transactionsRoot`: `DATA`, 32 Bytes
- `withdrawalsRoot`: `DATA`, 32 Bytes
- `blobGasUsed`: `QUANTITY`, 64 Bits
- `excessBlobGas`: `QUANTITY`, 64 Bits

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Does this definition has to be aware of forks, thus some fields being optional?

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.

I think the standard in this repo is that the types should be versioned, and each version contains the appropriate fields for the fork. This means the current V1 struct is aligned with Osaka.

Comment thread src/engine/eip8025.md Outdated
Comment thread src/engine/eip8025.md

#### Response

* result: [`ProofStatusV1`](#proofstatusv1) - The verification result.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Maybe a nit, but for this engine_verifyNewPayloadRequestHeaderV1 we should technically name the return type ProofsStatusV1 instead of ProofStatusV1?

Since technically we are checking a proofs policy, no?

Not sure it is worth changing tbh -- just surfacing thought.

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.

I think it is fine to use the same return type ProofStatusV1 for both engine_verifyNewPayloadRequestHeaderV1 and engine_verifyExecutionProofV1 and have slightly different interpretations. This is analogous to how PayloadStatusV* is used as the return type for both engine_newPayload* and engine_forkchoiceUpdated*.

Comment thread src/engine/eip8025.md
2. `versionedHashes`: `Array of DATA`, 32 Bytes each - Array of blob versioned hashes.
3. `parentBeaconBlockRoot`: `DATA`, 32 Bytes - Root of the parent beacon block.
4. `proofAttributes`: [`ProofAttributesV1`](#proofAttributesv1) - Attributes specifying which proofs to generate.
* timeout: 1s

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Is this TBD?

@frisitano frisitano Jan 23, 2026

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 added a note - *Note*: The timeouts are not definitive.

Comment thread src/engine/eip8025.md Outdated
1. `executionPayload`: [`ExecutionPayloadV3`](./cancun.md#executionpayloadv3) - The execution payload to generate proofs for.
2. `versionedHashes`: `Array of DATA`, 32 Bytes each - Array of blob versioned hashes.
3. `parentBeaconBlockRoot`: `DATA`, 32 Bytes - Root of the parent beacon block.
4. `proofAttributes`: [`ProofAttributesV1`](#proofAttributesv1) - Attributes specifying which proofs to generate.

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.

Do we need to add execution requests here?

@jsign jsign Jan 22, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Yep, could be named request_bytes or similar (use same name as CL specs).

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.

I propose we remain internally consistent in the execution APi specs? For example, executionRequests is used here:

#### Response
* result: `object`
- `executionPayload`: [`ExecutionPayloadV3`](./cancun.md#executionpayloadv3)
- `blockValue` : `QUANTITY`, 256 Bits - The expected value to be received by the `feeRecipient` in wei
- `blobsBundle`: [`BlobsBundleV1`](#BlobsBundleV1) - Bundle with data corresponding to blob transactions included into `executionPayload`
- `shouldOverrideBuilder` : `BOOLEAN` - Suggestion from the execution layer to use this `executionPayload` instead of an externally provided one
- `executionRequests`: `Array of DATA` - Execution layer triggered requests obtained from the `executionPayload` transaction execution.
* error: code and message set in case an exception happens while getting the payload.

@frisitano

Copy link
Copy Markdown
Author

Closing this as the proof node api has changed.

@frisitano frisitano closed this Mar 20, 2026
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