Skip to content

fix: set Eth-Execution-Payload-Blinded header on envelope publish - #124

Merged
pk910 merged 5 commits into
mainfrom
fix/epbs-blinded-header-publish
Jul 2, 2026
Merged

fix: set Eth-Execution-Payload-Blinded header on envelope publish#124
pk910 merged 5 commits into
mainfrom
fix/epbs-blinded-header-publish

Conversation

@barnabasbusa

Copy link
Copy Markdown
Contributor

Problem

When publishing an execution payload envelope to the beacon node, Buildoor POSTs to /eth/v1/beacon/execution_payload_envelopes (pkg/rpc/beacon/api.go) with Content-Type: application/json and Eth-Consensus-Version: gloas, but omits the Eth-Execution-Payload-Blinded header.

Per beacon-APIs #580, the request body on this endpoint is selected by the Eth-Execution-Payload-Blinded header:

  • falseSignedExecutionPayloadEnvelopeContents (full envelope + blobs + KZG proofs)
  • trueSignedBlindedExecutionPayloadEnvelope (BN reconstructs from cache)

Lenient CLs (Lighthouse, Lodestar) infer the flow from the JSON body shape and accept the request. But strict CLs — notably Prysm (PublishExecutionPayloadEnvelope in prysm#16818) — hard-reject a missing header with 400 "Eth-Execution-Payload-Blinded header is required". That means Buildoor's reveals fail against any Prysm-backed node on Gloas devnets.

Fix

Buildoor always publishes full contents (it never sends a blinded/payload_root body), so the value is statically false. Set the header explicitly.

This covers both publish callers, which share the single SubmitExecutionPayloadEnvelope method:

  • pkg/builderapi/server.go (Builder API reveal)
  • pkg/epbs/reveal_handler.go (ePBS reveal)

Notes

  • No behavior change against lenient CLs; unblocks strict ones.
  • Only the REST publish path exists (no attestantio/go-eth2-client path hits this endpoint), so this one method is the complete fix.

Buildoor always publishes full execution payload envelope contents (never a
blinded/payload_root body) to POST /eth/v1/beacon/execution_payload_envelopes,
but did not send the Eth-Execution-Payload-Blinded header. Per beacon-APIs #580
the request body is selected by this header; lenient CLs (Lighthouse, Lodestar)
infer it from the JSON body, but strict ones (Prysm) reject a missing header
with 400, so our reveals fail against Prysm-backed nodes.

Set the header statically to "false" since we only ever send full contents.
@pk910
pk910 enabled auto-merge July 2, 2026 16:12
@pk910
pk910 merged commit 45eeb29 into main Jul 2, 2026
11 checks passed
@pk910
pk910 deleted the fix/epbs-blinded-header-publish branch July 2, 2026 16:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants