From b2b38c62bec769bc975aaf50cb0f103d54386dec Mon Sep 17 00:00:00 2001 From: Minh Vu <38443830+fallintoplace@users.noreply.github.com> Date: Thu, 21 May 2026 00:52:03 +0200 Subject: [PATCH] beacon/engine, eth/catalyst: preserve nil blob list JSON --- beacon/engine/bapl_encode.go | 6 ++++ beacon/engine/bapl_encode_test.go | 50 +++++++++++++++++++++++++++++++ eth/catalyst/api_test.go | 8 +++++ 3 files changed, 64 insertions(+) create mode 100644 beacon/engine/bapl_encode_test.go diff --git a/beacon/engine/bapl_encode.go b/beacon/engine/bapl_encode.go index b9f46ebf26..5a1ce47658 100644 --- a/beacon/engine/bapl_encode.go +++ b/beacon/engine/bapl_encode.go @@ -22,6 +22,9 @@ import ( // MarshalJSON implements json.Marshaler. func (list BlobAndProofListV1) MarshalJSON() ([]byte, error) { + if list == nil { + return []byte("null"), nil + } var b jsonw.Buffer b.Array(func() { for _, item := range list { @@ -46,6 +49,9 @@ func marshalBlobAndProofV1(b *jsonw.Buffer, item *BlobAndProofV1) { // MarshalJSON implements json.Marshaler. func (list BlobAndProofListV2) MarshalJSON() ([]byte, error) { + if list == nil { + return []byte("null"), nil + } var b jsonw.Buffer b.Array(func() { for _, item := range list { diff --git a/beacon/engine/bapl_encode_test.go b/beacon/engine/bapl_encode_test.go new file mode 100644 index 0000000000..3d2e060fd0 --- /dev/null +++ b/beacon/engine/bapl_encode_test.go @@ -0,0 +1,50 @@ +// Copyright 2026 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package engine + +import ( + "encoding/json" + "testing" +) + +func TestBlobAndProofListMarshalJSONNil(t *testing.T) { + tests := []struct { + name string + list any + }{ + { + name: "should encode null if BlobAndProofListV1 is nil", + list: BlobAndProofListV1(nil), + }, + { + name: "should encode null if BlobAndProofListV2 is nil", + list: BlobAndProofListV2(nil), + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + enc, err := json.Marshal(test.list) + if err != nil { + t.Fatal(err) + } + if string(enc) != "null" { + t.Fatalf("got %s, want null", enc) + } + }) + } +} diff --git a/eth/catalyst/api_test.go b/eth/catalyst/api_test.go index 65d78d84ee..05d688ed9f 100644 --- a/eth/catalyst/api_test.go +++ b/eth/catalyst/api_test.go @@ -22,6 +22,7 @@ import ( "crypto/ecdsa" crand "crypto/rand" "crypto/sha256" + "encoding/json" "errors" "fmt" "math/big" @@ -2105,6 +2106,13 @@ func runGetBlobs(t testing.TB, getBlobs getBlobsFn, start, limit int, fillRandom } else { // Nil is expected if getBlobs can not return a partial response expect = nil + enc, err := json.Marshal(result) + if err != nil { + t.Fatalf("Failed to encode result for case %s: %v", name, err) + } + if string(enc) != "null" { + t.Fatalf("Unexpected JSON result for case %s: got %s, want null", name, enc) + } } } if !reflect.DeepEqual(result, expect) {