Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
683a1e7
modified block production end points
shane-moore Sep 3, 2025
757f072
epbs execution_payload_bid get and post
shane-moore Sep 4, 2025
fecb841
epbs execution_payload_envelope get and post
shane-moore Sep 5, 2025
740bf10
new epbs ptc assignment POST
shane-moore Sep 5, 2025
e605625
new epbs payload_attestations get and post
shane-moore Sep 5, 2025
3ad50a6
small fixes
shane-moore Sep 5, 2025
f5dca29
epbs documentation updates
shane-moore Sep 5, 2025
d1c62fb
updates per pr review
shane-moore Sep 11, 2025
cd77f62
add produceBlockV4 endpoint
shane-moore Sep 12, 2025
7a3d0e1
epbs related copy changes
shane-moore Sep 12, 2025
be01b6a
add consensus version to bid and envelope post
shane-moore Sep 13, 2025
8730379
gloas container links updated to use specific commit
shane-moore Sep 13, 2025
813c46e
add get bid error message for invalid builder index
shane-moore Sep 15, 2025
1940d3f
add slot voting time parameters to validator-flow
shane-moore Sep 17, 2025
994c2b7
add eth-consensus-version for payload attestations
shane-moore Sep 17, 2025
6def5f7
update payload attestation get to have slot in path
shane-moore Sep 18, 2025
17869db
payload attestation post should support an array in the request
shane-moore Sep 20, 2025
5b395c3
updates per nico review
shane-moore Nov 4, 2025
6dea1bb
get execution payload envelope by block id
shane-moore Nov 4, 2025
1e11453
updates per nico review
shane-moore Nov 5, 2025
37eaf5c
add payload attestation and execution payload bid events
shane-moore Nov 6, 2025
7bcc791
add execution_payment to execution_payload_bid
bharath-123 Nov 28, 2025
fe36269
add payload attestation and bid fields for eventstream
shane-moore Dec 30, 2025
de0d740
Add prev_randao to execution payload bid
nflaig Jan 26, 2026
e12bf98
Make builders non-validating staked actors
nflaig Jan 26, 2026
97f582f
Apply suggestion from @nflaig
nflaig Jan 27, 2026
eeeb4a1
Merge pull request #3 from ethereum/nflaig/prev-randao
shane-moore Feb 3, 2026
8da01b0
Merge pull request #4 from ethereum/nflaig/separate-builders
shane-moore Feb 3, 2026
e697311
Review PR
nflaig Feb 9, 2026
347dabc
Merge pull request #7 from ethereum/nflaig/review-epbs-standardized
shane-moore Feb 10, 2026
9c2acde
chore: remove produceBlockV4
shane-moore Feb 5, 2026
bd9a3c8
remove envelope endpoints
shane-moore Feb 10, 2026
1aafd35
chore: updates per pr review
shane-moore Feb 10, 2026
1e02d0a
chore: revert attestation_data changes to reflect master
shane-moore Feb 10, 2026
62aee32
remove payload endpoints from changelog
shane-moore Feb 10, 2026
38694b5
Merge pull request #6 from shane-moore/remove-produceblockv4
shane-moore Feb 10, 2026
91d634a
Merge branch 'master' into epbs-standardized
nflaig Feb 11, 2026
317e9d9
Update apis/beacon/execution_payload/bid.yaml
nflaig Feb 11, 2026
a0e5d77
Update apis/beacon/execution_payload/envelope_get.yaml
nflaig Feb 11, 2026
9bedb00
Update apis/validator/payload_attestation_data.yaml
nflaig Feb 11, 2026
fcf0d91
Add ssz support to getPoolPayloadAttestations response
nflaig Feb 11, 2026
2196102
Update spec references to v1.7.0-alpha.2
nflaig Feb 11, 2026
1679d4a
Add missing changelog entries
nflaig Feb 11, 2026
841f603
Keep phase0 spec references as before
nflaig Feb 11, 2026
cbc7a43
Fix spellcheck
nflaig Feb 11, 2026
7c50bdc
Final touch
nflaig Feb 11, 2026
d5036b8
Apply suggestion from hangleang
nflaig Feb 12, 2026
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
12 changes: 12 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,18 @@ There are likely to be descriptions etc outside of the list below, but new query

| Endpoint | [Lighthouse](https://github.com/sigp/lighthouse) | [Lodestar](https://github.com/ChainSafe/lodestar) | [Nimbus](https://github.com/status-im/nimbus-eth2) | [Prysm](https://github.com/prysmaticlabs/prysm) | [Teku](https://github.com/ConsenSys/teku) |
|---------------------------------------------------------------------------------------------------------------------|--------------------------------------------------|---------------------------------------------------|----------------------------------------------------|-------------------------------------------------|-------------------------------------------|
| [#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/payload_attestation_data/{slot}` 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) `GET /eth/v1/beacon/execution_payload_envelope/{block_id}` added | | | | | |
| [#552](https://github.com/ethereum/beacon-APIs/pull/552) `GET /eth/v1/beacon/pool/payload_attestations` 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/v2/beacon/blocks/{block_id}` updated | | | | | |
| [#552](https://github.com/ethereum/beacon-APIs/pull/552) `POST /eth/v2/beacon/blocks` updated | | | | | |
| [#552](https://github.com/ethereum/beacon-APIs/pull/552) `execution_payload_available EVENT` added | | | | | |
| [#552](https://github.com/ethereum/beacon-APIs/pull/552) `execution_payload_bid EVENT` added | | | | | |
| [#552](https://github.com/ethereum/beacon-APIs/pull/552) `payload_attestation_message EVENT` added | | | | | |
| [#563](https://github.com/ethereum/beacon-APIs/pull/563) `GET /eth/v2/validator/duties/proposer/{epoch}` added | | | | | |
| [#563](https://github.com/ethereum/beacon-APIs/pull/563) `GET /eth/v1/validator/duties/proposer/{epoch}` deprecated | | | | | |
| [#568](https://github.com/ethereum/beacon-APIs/pull/568) `GET /eth/v2/node/version` added | | | | | |
Expand Down
5 changes: 3 additions & 2 deletions apis/beacon/blocks/block.v2.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,15 @@ get:
properties:
version:
type: string
enum: [phase0, altair, bellatrix, capella, deneb, electra, fulu]
example: "fulu"
enum: [phase0, altair, bellatrix, capella, deneb, electra, fulu, gloas]
example: "gloas"
execution_optimistic:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/ExecutionOptimistic"
finalized:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/Finalized"
data:
anyOf:
- $ref: "../../../beacon-node-oapi.yaml#/components/schemas/Gloas.SignedBeaconBlock"
- $ref: "../../../beacon-node-oapi.yaml#/components/schemas/Electra.SignedBeaconBlock"
- $ref: "../../../beacon-node-oapi.yaml#/components/schemas/Deneb.SignedBeaconBlock"
- $ref: "../../../beacon-node-oapi.yaml#/components/schemas/Capella.SignedBeaconBlock"
Expand Down
8 changes: 5 additions & 3 deletions apis/beacon/blocks/blocks.v2.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ 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
the beacon node to broadcast all given blobs. The broadcast behaviour may be adjusted via the
`broadcast_validation` query parameter.
successfully broadcast but failed integration. For Deneb/Electra/Fulu, this additionally instructs
the beacon node to broadcast all given blobs. For Gloas and later, blobs are broadcast as part
of the `ExecutionPayloadEnvelope` and are not submitted with the block. The broadcast behaviour
may be adjusted via the `broadcast_validation` query parameter.
parameters:
- name: broadcast_validation
in: query
Expand Down Expand Up @@ -49,6 +50,7 @@ post:
application/json:
schema:
anyOf:
- $ref: "../../../beacon-node-oapi.yaml#/components/schemas/Gloas.SignedBeaconBlock"
Copy link
Contributor

Choose a reason for hiding this comment

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

should we deprecate blinded_blocks v2 in this pr?

Copy link
Member

Choose a reason for hiding this comment

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

we can but it will be needed for pre-gloas, same as produceBlockV3, I think it's reasonable to get rid of them at some point (like many clients dropped pre-electra block production) but there are networks that are behind mainnet in terms of fork schedule and we don't wanna accidentally break those

maybe deprecate them in h* release, and finally remove them in i* release

- $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
42 changes: 42 additions & 0 deletions apis/beacon/execution_payload/bid.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
post:
operationId: publishExecutionPayloadBid
summary: Publish signed execution payload bid
description: |
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 (20x) indicates
that the bid passed gossip validation and was successfully broadcast onto the network.
tags:
- Beacon
parameters:
- in: header
schema:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/ConsensusVersion"
required: true
name: Eth-Consensus-Version
description: "The active consensus version to which the execution payload bid being submitted belongs."
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."
"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"
"415":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/UnsupportedMediaType"
"500":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/InternalError"
61 changes: 61 additions & 0 deletions apis/beacon/execution_payload/envelope_get.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
get:
Copy link
Contributor

Choose a reason for hiding this comment

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

I think this API assumes that the execution payload and blobs are built locally. This might not be the case for a builder who builds the block using custom block building software. The builder will have the execution payload, blobs bundle and execution requests ready with them, they will require a beacon-api which will construct the ExecutionPayloadEnvelope for them to sign.

It would be desirable to also be able to pass in the bid, beacon block, execution payload, blobs bundle, execution requests to get the ExecutionPayloadEnvelope corresponding to the bid sent by the builder.

Copy link
Contributor

Choose a reason for hiding this comment

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

Do we have to send the blobs bundle? The KZG commitments are anyways included in the bid and we don't have to add it in the envelope, maybe we can skip it.

Copy link
Member

Choose a reason for hiding this comment

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

I've created an issue for this #575, we definitely need a new api for that. The current api as defined in this PR was primarily introduced for local block building but from discussions it became clear that we wanna keep the local block production stateless which does not work if you have 2 separate api calls. But there is still a use case for the api as specified here which is for builders that wanna build an execution payload with their local EL, these are likely not gonna be the sophisticated builders but useful if CL clients want to implement "act as a builder".

Do we have to send the blobs bundle?

might be needed if builders want this to be stateless? not sure if that's a concern for them

operationId: getSignedExecutionPayloadEnvelope
summary: Get signed execution payload envelope
description: |
Retrieves signed execution payload envelope for a given block id.
Depending on `Accept` header it can be returned either as json or as bytes serialized by SSZ.
tags:
- Beacon
parameters:
- name: block_id
in: path
required: true
$ref: '../../../beacon-node-oapi.yaml#/components/parameters/BlockId'
responses:
"200":
description: "Successful response"
headers:
Eth-Consensus-Version:
$ref: '../../../beacon-node-oapi.yaml#/components/headers/Eth-Consensus-Version'
content:
application/json:
schema:
title: GetExecutionPayloadEnvelopeResponse
type: object
required: [version, execution_optimistic, finalized, data]
properties:
version:
type: string
enum: [gloas]
example: "gloas"
execution_optimistic:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/ExecutionOptimistic"
finalized:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/Finalized"
data:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/Gloas.SignedExecutionPayloadEnvelope"
application/octet-stream:
schema:
description: "SSZ serialized `SignedExecutionPayloadEnvelope` bytes. Use Accept header to choose this response type"
"400":
description: "The block ID supplied could not be parsed"
content:
application/json:
schema:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/ErrorMessage"
example:
code: 400
message: "Invalid block ID: current"
"404":
description: "Execution payload envelope not found"
content:
application/json:
schema:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/ErrorMessage"
example:
code: 404
message: "Execution payload envelope not found"
"406":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/NotAcceptable"
"500":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/InternalError"
96 changes: 96 additions & 0 deletions apis/beacon/pool/payload_attestations.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
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
headers:
Eth-Consensus-Version:
$ref: '../../../beacon-node-oapi.yaml#/components/headers/Eth-Consensus-Version'
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.PayloadAttestation"
application/octet-stream:
schema:
description: "SSZ serialized `List[PayloadAttestation, MAX_PAYLOAD_ATTESTATIONS]` bytes. Use Accept header to choose this response type"
"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: submitPayloadAttestationMessages
summary: Submit payload attestation messages
description: |
Submits payload attestation messages to the beacon node.

The beacon node will validate each 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.

If one or more payload attestation messages fail validation, the node MUST return a 400 error with details of which messages have failed, and why.
parameters:
- in: header
schema:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/ConsensusVersion"
required: true
name: Eth-Consensus-Version
description: "The active consensus version to which the payload attestation message being submitted belongs."
tags:
- Beacon
- ValidatorRequiredApi
requestBody:
description: "Array of `PayloadAttestationMessage` objects to be submitted."
required: true
content:
application/json:
schema:
type: array
items:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/Gloas.PayloadAttestationMessage"
application/octet-stream:
schema:
description: "SSZ serialized `List[PayloadAttestationMessage, PTC_SIZE]` bytes. Use Content-Type header to indicate that SSZ data is contained in the request body."
responses:
"200":
description: "Payload attestation messages are stored in pool and broadcasted to the network"
"400":
description: "Errors with one or more payload attestation messages"
content:
application/json:
schema:
$ref: "../../../beacon-node-oapi.yaml#/components/schemas/IndexedErrorMessage"
"415":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/UnsupportedMediaType"
"500":
$ref: "../../../beacon-node-oapi.yaml#/components/responses/InternalError"
18 changes: 18 additions & 0 deletions apis/eventstream/index.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ get:
- payload_attributes
- blob_sidecar
- data_column_sidecar
- execution_payload_available
- execution_payload_bid
- payload_attestation_message
responses:
"200":
description: Opened SSE stream.
Expand Down Expand Up @@ -158,6 +161,21 @@ get:
value: |
event: data_column_sidecar
data: {"block_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", "index": "1", "slot": "1", "kzg_commitments": ["0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505"]}
execution_payload_available:
description: The node has verified that the execution payload and blobs for a block are available and ready for payload attestation
value: |
event: execution_payload_available
data: {"slot": "10", "block_root": "0x9a2fefd2fdb57f74993c7780ea5b9030d2897b615b89f808011ca5aebed54eaf"}
execution_payload_bid:
description: The node has received a `SignedExecutionPayloadBid` (from P2P or API) that passes gossip validation on the `execution_payload_bid` topic
value: |
event: execution_payload_bid
data: {"message": {"parent_block_hash": "0x9a2fefd2fdb57f74993c7780ea5b9030d2897b615b89f808011ca5aebed54eaf", "parent_block_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", "block_hash": "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "prev_randao": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", "fee_recipient": "0x0000000000000000000000000000000000000000", "gas_limit": "30000000", "builder_index": "42", "slot": "10", "value": "1000000000", "execution_payment": "0", "blob_kzg_commitments": ["0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2"]}, "signature": "0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505"}
payload_attestation_message:
description: The node has received a `PayloadAttestationMessage` that passes validation rules of the `payload_attestation_message` topic
value: |
event: payload_attestation_message
data: {"validator_index": "123", "data": {"beacon_block_root": "0x9a2fefd2fdb57f74993c7780ea5b9030d2897b615b89f808011ca5aebed54eaf", "slot": "10", "payload_present": true, "blob_data_available": true}, "signature": "0x1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505cc411d61252fb6cb3fa0017b679f8bb2305b26a285fa2737f175668d0dff91cc1b66ac1fb663c9bc59509846d6ec05345bd908eda73e670af888da41af171505"}
"400":
description: "The topics supplied could not be parsed"
content:
Expand Down
Loading