Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 46 additions & 3 deletions apis/validator/block.v4.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,14 @@ get:
so there is no longer a concept of blinded or unblinded blocks. Builders release the
payload later. This endpoint is specific to the post-Gloas forks and is not backwards compatible
with previous forks.

When self-building (local execution payload), the response will include the full block contents
Copy link

@nflaig nflaig Jan 26, 2026

Choose a reason for hiding this comment

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

in ethereum#519 the conclusion was to leave it up to clients to support blinding the response, eg. in Lodestar we have a flag --blindedLocal and corresponding query param to tell the bn to not return full block contents but rather cache them which makes the block production stateful but there is no drawback in a 1:1 setup

I think it would be good to standardize this kind of query parameter in produceBlockV4 and leave it up to clients whether the wanna implement it or not, ie. if a client doesn't wanna implement it they can always set the query param to false

including the beacon block, execution payload envelope, blobs, and KZG proofs.
When using an external builder bid, only the `BeaconBlock` is returned as the beacon node
does not have access to the builder's execution payload.

The `Eth-Execution-Payload-Included` header and `execution_payload_included` response field
indicate which response type was returned.
parameters:
- name: slot
in: path
Expand All @@ -32,6 +40,29 @@ get:
$ref: '../../beacon-node-oapi.yaml#/components/schemas/Graffiti'
- name: skip_randao_verification
$ref: '../../beacon-node-oapi.yaml#/components/parameters/SkipRandaoVerification'
- name: include_payload
in: query
required: false
description: |
Controls whether the execution payload envelope and blobs are included in the response
when self-building (using local execution payload).

When `true` (default), the response includes the full block contents: beacon block,
execution payload envelope, blobs, and KZG proofs. This enables stateless operation
where the validator client can use multiple beacon nodes (multi-BN setups, DVs, failover).

When `false`, only the beacon block is returned and the beacon node caches the execution
payload envelope and blobs internally. The validator client must then fetch them separately
via `GET /eth/v1/validator/execution_payload_envelope/{slot}/{builder_index}`. This saves
bandwidth but requires the validator client to publish via the same beacon node that
produced the block (stateful operation).

This parameter only affects self-building scenarios. When using an external builder's bid,
only the beacon block is returned regardless of this parameter (the beacon node does not
have access to the builder's execution payload).
schema:
type: boolean
default: true
- name: builder_boost_factor
in: query
required: false
Expand Down Expand Up @@ -72,12 +103,14 @@ get:
$ref: '../../beacon-node-oapi.yaml#/components/headers/Eth-Consensus-Version'
Eth-Consensus-Block-Value:
$ref: '../../beacon-node-oapi.yaml#/components/headers/Eth-Consensus-Block-Value'
Eth-Execution-Payload-Included:
$ref: '../../beacon-node-oapi.yaml#/components/headers/Eth-Execution-Payload-Included'
content:
application/json:
schema:
title: "ProduceBlockV4Response"
type: object
required: [version, consensus_block_value, data]
required: [version, consensus_block_value, execution_payload_included, data]
properties:
version:
type: string
Expand All @@ -87,11 +120,21 @@ get:
type: string
example: "12345"
description: "Consensus rewards for this block in Wei"
execution_payload_included:
type: boolean
description: |
Indicates whether the execution payload envelope is included in the response.
When `true`, the `data` field contains the full
execution payload envelope, blobs, and KZG proofs. When `false`, the `data`
field contains only a `BeaconBlock`.
example: false
data:
$ref: "../../beacon-node-oapi.yaml#/components/schemas/Gloas.BeaconBlock"
anyOf:
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Gloas.BeaconBlock"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Gloas.BlockContents"
application/octet-stream:
schema:
description: "SSZ serialized `BeaconBlock` bytes. Use Accept header to choose this response type, version string is sent in header `Eth-Consensus-Version`."
description: "SSZ serialized `BeaconBlock` or `BlockContents` bytes. Use Accept header to choose this response type, version string is sent in header `Eth-Consensus-Version` and payload inclusion indicated by `Eth-Execution-Payload-Included` header."
"400":
description: "Invalid block production request"
content:
Expand Down
8 changes: 8 additions & 0 deletions beacon-node-oapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -451,6 +451,8 @@ components:
$ref: "./types/gloas/block.yaml#/Gloas/BeaconBlock"
Gloas.SignedBeaconBlock:
$ref: "./types/gloas/block.yaml#/Gloas/SignedBeaconBlock"
Gloas.BlockContents:
$ref: "./types/gloas/block_contents.yaml#/Gloas/BlockContents"
Gloas.ExecutionPayloadBid:
$ref: "./types/gloas/execution_payload_bid.yaml#/Gloas/ExecutionPayloadBid"
Gloas.SignedExecutionPayloadBid:
Expand Down Expand Up @@ -538,3 +540,9 @@ components:
required: true
schema:
$ref: './types/primitive.yaml#/Wei'
Eth-Execution-Payload-Included:
description: |
Indicates whether the execution payload envelope, blobs, and KZG proofs are included in the response. Required in response so client can deserialize returned data.
required: true
schema:
type: boolean
17 changes: 17 additions & 0 deletions types/gloas/block_contents.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
Gloas:
BlockContents:
type: object
description: |
Block contents for self-building, including the execution payload envelope
and blobs. This enables stateless failover to another beacon node for publishing,
as all required data is returned in a single response.
required: [block, execution_payload_envelope, kzg_proofs, blobs]
properties:
block:
$ref: "./block.yaml#/Gloas/BeaconBlock"
execution_payload_envelope:
$ref: "./execution_payload_envelope.yaml#/Gloas/ExecutionPayloadEnvelope"
kzg_proofs:
$ref: "../fulu/block_contents.yaml#/Fulu/KZGProofs"
blobs:
$ref: "../deneb/block_contents.yaml#/Deneb/Blobs"