From 0dcfc98f58c3a835325aeadd72d3a591987435a5 Mon Sep 17 00:00:00 2001 From: pk910 Date: Fri, 31 Jul 2026 03:47:19 +0200 Subject: [PATCH] send Eth-Blob-Data-Included on envelope submission beacon-APIs#624 removed the blinded envelope flow and renamed the body discriminator on publishExecutionPayloadEnvelope from Eth-Execution-Payload-Blinded to Eth-Blob-Data-Included (true = stateless SignedExecutionPayloadEnvelopeContents body). Beacon nodes on the new spec (e.g. Lodestar) require the header and 400 without it. The old header is kept alongside for beacon nodes that predate the rename. --- http/submitexecutionpayloadenvelope.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/http/submitexecutionpayloadenvelope.go b/http/submitexecutionpayloadenvelope.go index 71c8cc8c..ca4870d3 100644 --- a/http/submitexecutionpayloadenvelope.go +++ b/http/submitexecutionpayloadenvelope.go @@ -33,10 +33,10 @@ import ( // SubmitExecutionPayloadEnvelope submits a signed execution payload envelope // using the stateless request form: a SignedExecutionPayloadEnvelopeContents // body (signed envelope plus blobs and KZG proofs) with the -// Eth-Execution-Payload-Blinded header set to false. The stateful/blinded -// form only works when the beacon node cached the full envelope from its own -// block production, so builders publishing externally-built payloads must use -// the stateless form. +// Eth-Blob-Data-Included header set to true. The stateful form (bare +// envelope, header false) only works when the beacon node cached the blobs +// and KZG proofs from its own block production, so builders publishing +// externally-built payloads must use the stateless form. func (s *Service) SubmitExecutionPayloadEnvelope(ctx context.Context, opts *api.SubmitExecutionPayloadEnvelopeOpts, ) error { @@ -136,9 +136,12 @@ func (s *Service) postExecutionPayloadEnvelope(ctx context.Context, headers := make(map[string]string) headers["Eth-Consensus-Version"] = strings.ToLower(consensusVersion.String()) - // Always the stateless form: header "false" selects the Contents body - // schema. Strict consensus clients reject the request when the header is - // missing. + // Always the stateless form: Eth-Blob-Data-Included "true" selects the + // Contents body schema (beacon-APIs#624); strict consensus clients reject + // the request when the header is missing. The pre-#624 discriminator + // (Eth-Execution-Payload-Blinded "false" = Contents) is still sent for + // beacon nodes that have not adopted the rename yet. + headers["Eth-Blob-Data-Included"] = "true" headers["Eth-Execution-Payload-Blinded"] = "false" if _, err := s.post(ctx, endpoint, query, common, bytes.NewBuffer(body), contentType, headers); err != nil {