Skip to content

Instantly share code, notes, and snippets.

@nflaig
Last active November 12, 2025 15:20
Show Gist options
  • Select an option

  • Save nflaig/d697981bcebde10989ae2b118990ce31 to your computer and use it in GitHub Desktop.

Select an option

Save nflaig/d697981bcebde10989ae2b118990ce31 to your computer and use it in GitHub Desktop.
epbs validator flow

Validators may optionally act as builders to submit execution payload bids for block inclusion. This requires registering with builder-specific withdrawal credentials (BUILDER_WITHDRAWAL_PREFIX).

  • fetch execution payload bid via GET /eth/v1/validator/execution_payload_bid/{slot}/{builder_index} from beacon node
  • validator signs execution payload bid and submits via POST /eth/v1/beacon/execution_payload_bid to be gossiped
  • cache fields required to construct ExecutionPayloadEnvelope (similar to our current --blindedLocal)
  • If bid is selected by proposer in their SignedBeaconBlock
    • fetch execution payload envelope via GET /eth/v1/validator/execution_payload_envelope/{slot}/{builder_index} from beacon node
    • validator signs execution payload envelope and submits via POST /eth/v1/beacon/execution_payload_envelope
    • must be submitted and propagated on gossip before PAYLOAD_ATTESTATION_DUE_BPS (9 seconds into the slot)
    • gossiping of execution payload can be done asap for local builders but builders that include MEV must make sure SignedBeaconBlock was timely to avoid unbundling attacks

Same as status quo with a few timing and behavior changes

  • ATTESTATION_DUE_BPS_GLOAS is at 3 seconds into slot (instead of 4 seconds)
  • AGGREGATE_DUE_BPS_GLOAS is at 6 seconds into slot (instead of 8 seconds)
  • attesters act as a fallback of PTC committee if beacon block is missed
  • set data.index based on the payload status in the validator's fork-choice
    • data.index = 0 to signal that the payload is not present
    • data.index = 1 to signal that the payload is present
  • call GET /eth/v4/validator/blocks/{slot} at the start of the slot t=0
  • beacon node returns BeaconBlock with choosen SignedExecutionPayloadBid (similar to status quo, but can be received from p2p)
  • submit SignedBeaconBlock to beacon node via POST /eth/v2/beacon/blocks, publish on p2p and/or submit to builder (TBD)
  • For self/local building
    • the signature must be bls.G2_POINT_AT_INFINITY in SignedExecutionPayloadBid
    • fetch execution payload envelope via GET /eth/v1/validator/execution_payload_envelope/{slot}/{builder_index} from beacon node
    • validator signs execution payload envelope and submits via POST /eth/v1/beacon/execution_payload_envelope
    • must be submitted and propagated on gossip before PAYLOAD_ATTESTATION_DUE_BPS (9 seconds into the slot)
    • gossiping of execution payload and data columns can be done asap as there is no MEV in block
  • at start of epoch fetch duties via POST /eth/v1/validator/duties/ptc/{epoch} from beacon node
  • wait for execution payload and blobs to become available for the assigned slot (execution_payload_available EVENT)
  • or PAYLOAD_ATTESTATION_DUE_BPS (9 seconds) into assigned slot
  • fetch PayloadAttestationData via GET /eth/v1/validator/payload_attestation_data/{slot} from beacon node
  • sign PayloadAttestationData to create PayloadAttestationMessage
  • submit PayloadAttestationMessage via POST /eth/v1/beacon/pool/payload_attestations to beacon node
  • Attestation indicates whether execution payload envelope has been seen for the block and if blobs were received
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment