Skip to content
Open
Show file tree
Hide file tree
Changes from 7 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
9 changes: 9 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,15 @@ There are likely to be descriptions etc outside of the list below, but new query
| [#537](https://github.com/ethereum/beacon-APIs/pull/537) `GET /eth/v1/debug/beacon/data_column_sidecars/{block_id}` added | | | | | |
| [#539](https://github.com/ethereum/beacon-APIs/pull/539) `GET /eth/v1/beacon/states/{state_id}/proposer_lookahead` added | | | | | |
| [#546](https://github.com/ethereum/beacon-APIs/pull/546) `GET /eth/v1/beacon/blobs/{block_id}` added | | | | | |
| [#552](https://github.com/ethereum/beacon-APIs/pull/552) `GET /eth/v1/validator/execution_payload_bid/{slot}/{builder_index}` added | | | | | |
| [#552](https://github.com/ethereum/beacon-APIs/pull/552) `GET /eth/v1/validator/execution_payload_envelope/{slot}/{builder_index}` added | | | | | |
| [#552](https://github.com/ethereum/beacon-APIs/pull/552) `GET /eth/v1/validator/payload_attestation_data` added | | | | | |
| [#552](https://github.com/ethereum/beacon-APIs/pull/552) `POST /eth/v1/validator/duties/ptc/{epoch}` added | | | | | |
| [#552](https://github.com/ethereum/beacon-APIs/pull/552) `POST /eth/v1/beacon/execution_payload_bid` added | | | | | |
| [#552](https://github.com/ethereum/beacon-APIs/pull/552) `POST /eth/v1/beacon/execution_payload_envelope` added | | | | | |
| [#552](https://github.com/ethereum/beacon-APIs/pull/552) `POST /eth/v1/beacon/pool/payload_attestations` added | | | | | |
| [#552](https://github.com/ethereum/beacon-APIs/pull/552) `GET /eth/v3/validator/blocks/{slot}` updated | | | | | |
| [#552](https://github.com/ethereum/beacon-APIs/pull/552) `POST /eth/v2/beacon/blocks` updated | | | | | |

The Following are no longer in the Standard API, removed since the latest version.

Expand Down
3 changes: 2 additions & 1 deletion apis/beacon/blocks/blocks.v2.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ post:
The beacon node is also expected to integrate the block into the state, but may broadcast it
before doing so, so as to aid timely delivery of the block. Should the block fail full
validation, a separate success response code (202) is used to indicate that the block was
successfully broadcast but failed integration. After Deneb, this additionally instructs
successfully broadcast but failed integration. After Deneb and before Gloas, this additionally instructs
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
successfully broadcast but failed integration. After Deneb and before Gloas, this additionally instructs
successfully broadcast but failed integration. For Deneb/Electra/Fulu, this additionally instructs

nitpick: It is a bit confusing that after is inclusive but before is exclusive

the beacon node to broadcast all given blobs. The broadcast behaviour may be adjusted via the
`broadcast_validation` query parameter.
parameters:
Expand Down Expand Up @@ -49,6 +49,7 @@ post:
application/json:
schema:
anyOf:
- $ref: "../../../beacon-node-oapi.yaml#/components/schemas/Gloas.SignedBeaconBlock"
- $ref: "../../../beacon-node-oapi.yaml#/components/schemas/Fulu.SignedBlockContents"
- $ref: "../../../beacon-node-oapi.yaml#/components/schemas/Electra.SignedBlockContents"
- $ref: "../../../beacon-node-oapi.yaml#/components/schemas/Deneb.SignedBlockContents"
Expand Down
41 changes: 41 additions & 0 deletions apis/beacon/execution_payload/bid.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
post:
operationId: publishExecutionPayloadBid
summary: Publish signed execution payload bid
description: |
Instructs the beacon node to broadcast a signed execution payload bid to the beacon network,
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
Instructs the beacon node to broadcast a signed execution payload bid to the beacon network,
Instructs the beacon node to broadcast a signed execution payload bid to the network,

to be gossiped for potential inclusion in block building. A success response indicates
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
to be gossiped for potential inclusion in block building. A success response indicates
to be gossiped for potential inclusion in block building. A success response (20x) indicates

For uniformity with publishExecutionPayloadEnvelope

that the bid passed gossip validation and was successfully broadcast onto the network.
tags:
- Beacon
requestBody:
description: "The `SignedExecutionPayloadBid` object to be broadcast."
required: true
content:
application/json:
schema:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/Gloas.SignedExecutionPayloadBid"
application/octet-stream:
schema:
description: "SSZ serialized SignedExecutionPayloadBid bytes. Use Content-Type header to specify this format"
responses:
"200":
description: "The bid was validated successfully and has been broadcast."
content:
text/plain:
schema:
type: string
"400":
description: "The SignedExecutionPayloadBid object is invalid or failed gossip validation"
content:
application/json:
schema:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/ErrorMessage"
example:
code: 400
message: "Invalid signed execution payload bid"
"406":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/NotAcceptable"
"415":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/UnsupportedMediaType"
"500":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/InternalError"
41 changes: 41 additions & 0 deletions apis/beacon/execution_payload/envelope.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
post:
operationId: publishExecutionPayloadEnvelope
summary: Publish signed execution payload envelope
description: |
Instructs the beacon node to broadcast a signed execution payload envelope to the beacon network,
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
Instructs the beacon node to broadcast a signed execution payload envelope to the beacon network,
Instructs the beacon node to broadcast a signed execution payload envelope to the network,

to be gossiped for payload validation. A success response (20x) indicates
that the envelope passed gossip validation and was successfully broadcast onto the network.
tags:
- Beacon
requestBody:
description: "The `SignedExecutionPayloadEnvelope` object to be broadcast."
required: true
content:
application/json:
schema:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/Gloas.SignedExecutionPayloadEnvelope"
application/octet-stream:
schema:
description: "SSZ serialized SignedExecutionPayloadEnvelope bytes. Use Content-Type header to specify this format"
responses:
"200":
description: "The envelope was validated successfully and has been broadcast."
content:
text/plain:
schema:
type: string
"400":
description: "The SignedExecutionPayloadEnvelope object is invalid or failed gossip validation"
content:
application/json:
schema:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/ErrorMessage"
example:
code: 400
message: "Invalid signed execution payload envelope"
"406":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/NotAcceptable"
"415":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/UnsupportedMediaType"
"500":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/InternalError"
83 changes: 83 additions & 0 deletions apis/beacon/pool/payload_attestations.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
get:
operationId: getPoolPayloadAttestations
summary: Get payload attestations from operations pool
description: Retrieves payload attestations known by the node but not necessarily incorporated into any block
parameters:
- name: slot
in: query
required: false
schema:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/Uint64"
tags:
- Beacon
responses:
"200":
description: Successful response
content:
application/json:
schema:
title: GetPoolPayloadAttestationsResponse
type: object
required: [version, data]
properties:
version:
type: string
enum: [gloas]
example: "gloas"
data:
type: array
items:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/Gloas.PayloadAttestationMessage"
"400":
description: "The slot could not be parsed"
content:
application/json:
schema:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/ErrorMessage"
example:
code: 400
message: "Invalid slot parameter"
"500":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/InternalError"

post:
operationId: submitPayloadAttestationMessage
summary: Submit payload attestation message
description: |
Submits a payload attestation message to the beacon node.

The beacon node will validate the payload attestation message according to the gossip validation rules
and, if valid, store it in the pool and broadcast it globally to the network.

A success response indicates that the payload attestation message passed validation and was
successfully stored and broadcast.
tags:
- Beacon
- ValidatorRequiredApi
requestBody:
description: "The PayloadAttestationMessage object to be submitted."
required: true
content:
application/json:
schema:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/Gloas.PayloadAttestationMessage"
application/octet-stream:
schema:
description: "SSZ serialized PayloadAttestationMessage bytes. Use Content-Type header to indicate that SSZ data is contained in the request body."
responses:
"200":
description: "The payload attestation message was stored in the pool and has been broadcast."
content:
text/plain:
schema:
type: string
"400":
description: "The PayloadAttestationMessage object is invalid or failed gossip validation"
content:
application/json:
schema:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/ErrorMessage"
"415":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/UnsupportedMediaType"
"500":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/InternalError"
4 changes: 2 additions & 2 deletions apis/validator/attestation_data.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ get:
summary: "Produce an attestation data"
description: |
Requests that the beacon node produce an AttestationData. For `slot`s in
Electra and later, this AttestationData must have a `committee_index` of 0.
Electra and Fulu, this AttestationData must have a `committee_index` of 0. In Gloas, this `committee_index` field is repurposed to signal payload status: 0 if the execution payload is not present in the canonical chain (EMPTY), or 1 if the payload is present (FULL). For current slot attestations, always use 0.
Copy link

Choose a reason for hiding this comment

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

Perhaps a more precise statement to the meaning of "current slot attestation"? I've seen people confused by this term.

At any rate it refers to the fact that the head block root is the block proposed in the same slot as the AttestationData.slot.

Copy link
Author

Choose a reason for hiding this comment

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

Def can be a bit confusing. Updated the copy to "For current slot attestations, which means the head block root is a block proposed in the same slot as the AttestationData.slot, always use 0."


A 503 error must be returned if the block identified by the response
`beacon_block_root` is optimistic (i.e. the attestation attests to a block
Expand All @@ -22,7 +22,7 @@ get:
in: query
description: |
The committee index for which an attestation data should be created. For `slot`s in
Electra and later, this parameter MAY always be set to 0.
Electra and Fulu, this parameter MAY always be set to 0. In Gloas, it signals payload status: 0 for EMPTY payload status, 1 for FULL payload status.
required: true
schema:
$ref: "../../beacon-node-oapi.yaml#/components/schemas/Uint64"
Expand Down
87 changes: 51 additions & 36 deletions apis/validator/block.v3.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ get:
operationId: "produceBlockV3"
summary: "Produce a new block, without signature."
description: |
Requests a beacon node to produce a valid block, which can then be signed by a validator. The
returned block may be blinded or unblinded, depending on the current state of the network as
decided by the execution and beacon nodes.
Requests a beacon node to produce a valid block, which can then be signed by a validator.

The beacon node must return an unblinded block if it obtains the execution payload from its
paired execution node. It must only return a blinded block if it obtains the execution payload
header from an MEV relay.
Post-gloas, proposers submit execution payload
bids rather than full execution payloads, so there is no longer a concept of blinded or unblinded blocks. Builders release the payload later. For pre-Gloas forks, the returned block may be blinded or unblinded, depending on the current
state of the network as decided by the execution and beacon nodes. The beacon node returns an
unblinded block if it obtains the execution payload from its paired execution node, or a
blinded block if it obtains the execution payload header from an MEV relay.

Metadata in the response indicates the type of block produced, and the supported types of block
will be added to as forks progress.
Expand Down Expand Up @@ -83,36 +83,51 @@ get:
content:
application/json:
schema:
title: ProduceBlockV3Response
type: object
required: [version, execution_payload_blinded, execution_payload_value, consensus_block_value, data]
properties:
version:
type: string
enum: [phase0, altair, bellatrix, capella, deneb, electra, fulu]
example: "electra"
execution_payload_blinded:
type: boolean
example: false
execution_payload_value:
type: string
example: "12345"
consensus_block_value:
type: string
example: "12345"
data:
anyOf:
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Fulu.BlockContents"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Electra.BlockContents"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Electra.BlindedBeaconBlock"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Deneb.BlockContents"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Deneb.BlindedBeaconBlock"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Capella.BeaconBlock"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Capella.BlindedBeaconBlock"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Bellatrix.BeaconBlock"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Bellatrix.BlindedBeaconBlock"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Altair.BeaconBlock"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Phase0.BeaconBlock"
oneOf:
- title: "ProduceBlockV3Response (Gloas)"
type: object
required: [version, data, consensus_block_value]
Copy link
Author

Choose a reason for hiding this comment

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

I removed the execution_payload_blinded and execution_payload_value from being required in the response post-gloas since there's no longer a concept of blinded blocks, and the block's "value" is now the bid, BeaconBlockBody::SignedExecutionPayloadBid::value

but lmk if these fields should be resurrected

not really sure if we need consensus_block_value at this point. it doesn't seem used in lighthouse, but I kept it as required since perhaps other clients use it

Copy link
Member

@nflaig nflaig Sep 9, 2025

Choose a reason for hiding this comment

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

introducing a produceBlockV4 makes much more sense imo

Copy link

@eth2353 eth2353 Sep 12, 2025

Choose a reason for hiding this comment

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

The consensus_block_value is used by multi-node validator clients like Vero/Vouch, let's please keep it unless there's a good reason to remove it.

Copy link
Author

Choose a reason for hiding this comment

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

thanks for the feedback. we agreed that produceBlockV4 makes more sense on the last epbs breakout room call, so I added the endpoint and left produceBlockV3 untouched. produceBlockV4 has consensus_block_value as required per @eth2353's description as to why it's useful

Copy link
Contributor

Choose a reason for hiding this comment

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

produceBlockV4 definitely makes more sense

properties:
version:
type: string
enum: [gloas]
example: "gloas"
consensus_block_value:
type: string
example: "12345"
description: "Consensus rewards for this block in Wei"
data:
$ref: "../../beacon-node-oapi.yaml#/components/schemas/Gloas.BeaconBlock"
- title: "ProduceBlockV3Response (Pre-Gloas)"
type: object
required: [version, data, consensus_block_value, execution_payload_blinded, execution_payload_value]
properties:
version:
type: string
enum: [phase0, altair, bellatrix, capella, deneb, electra, fulu]
example: "electra"
execution_payload_blinded:
type: boolean
example: false
execution_payload_value:
type: string
example: "12345"
consensus_block_value:
type: string
example: "12345"
data:
anyOf:
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Fulu.BlockContents"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Electra.BlockContents"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Electra.BlindedBeaconBlock"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Deneb.BlockContents"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Deneb.BlindedBeaconBlock"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Capella.BeaconBlock"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Capella.BlindedBeaconBlock"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Bellatrix.BeaconBlock"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Bellatrix.BlindedBeaconBlock"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Altair.BeaconBlock"
- $ref: "../../beacon-node-oapi.yaml#/components/schemas/Phase0.BeaconBlock"
application/octet-stream:
schema:
description: "SSZ serialized block or blinded block bytes. Use Accept header to choose this response type, version string is sent in header `Eth-Consensus-Version` and block type in `Eth-Blinded-Payload`."
Expand Down
Loading