Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
9726e44
Initial fulu support
jtraglia Apr 22, 2025
39b6701
Fix lint and some nits
jtraglia Apr 10, 2025
0fc7320
Update go-eth2-client
jtraglia Apr 10, 2025
d024021
Add fulu test & fix tests
jtraglia Apr 10, 2025
89c1d4a
Merge branch 'fulu' of https://github.com/jtraglia/mev-boost into bha…
bharath-123 Jun 26, 2025
08e9d5c
update go-eth2-client
bharath-123 Jun 26, 2025
eef602e
Merge pull request #1 from bharath-123/bharath/fulu
jtraglia Jun 26, 2025
481f298
ensure that number of commitments equals extended blob cell proofs
bharath-123 Jul 1, 2025
b8753f7
fmt
bharath-123 Jul 1, 2025
866b905
minor typos
bharath-123 Jul 14, 2025
eb43547
address some review comments
bharath-123 Jul 15, 2025
acb775d
add blobs, commitments and cell proofs to fulu payload tests
bharath-123 Jul 15, 2025
5e00dcc
add support for v2 blinded blocks
faheelsattar Jul 21, 2025
0fcdc83
resolve comments
faheelsattar Jul 22, 2025
746cd0d
update name
faheelsattar Jul 23, 2025
c8eb8ae
add common function
faheelsattar Jul 23, 2025
50ae7b4
add tests
faheelsattar Jul 23, 2025
f76a9ac
address comments
faheelsattar Jul 23, 2025
b7b6d90
clean logs
faheelsattar Jul 24, 2025
45c82c3
Merge pull request #2 from faheelsattar/faheelsattar/v2-get-payload
bharath-123 Jul 24, 2025
a07eaf1
minor refactoring
bharath-123 Aug 6, 2025
28b0582
remove unecessary consts
bharath-123 Aug 6, 2025
58b4935
fix lint issues
bharath-123 Aug 11, 2025
4aaea35
fix CI issues
bharath-123 Aug 13, 2025
8a07d50
fix CI issues
bharath-123 Aug 13, 2025
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
10 changes: 10 additions & 0 deletions common/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,16 @@ import (

const (
SlotTimeSecMainnet = 12
// FieldElementsPerBlob is the number of field elements needed to represent a blob.
FieldElementsPerBlob = 4096
// BlobExpansionFactor is the factor by which we extend a blob for PeerDAS.
BlobExpansionFactor = 2
// FieldElementsPerCell is the number of field elements in a cell.
FieldElementsPerCell = 64
// FieldElementsPerExtBlob is the number of field elements needed to represent an extended blob.
FieldElementsPerExtBlob = FieldElementsPerBlob * BlobExpansionFactor
// CellsPerExtBlob is the number of cells in an extended blob.
CellsPerExtBlob = FieldElementsPerExtBlob / FieldElementsPerCell
)

func GetEnv(key, defaultValue string) string {
Expand Down
4 changes: 3 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ require (

require (
github.com/attestantio/go-builder-client v0.6.1
github.com/attestantio/go-eth2-client v0.25.0
github.com/attestantio/go-eth2-client v0.25.1-0.20250603135601-6ac0bfda7fda
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
github.com/ferranbt/fastssz v0.1.4 // indirect
Expand All @@ -60,3 +60,5 @@ require (
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

replace github.com/attestantio/go-builder-client => github.com/jtraglia/go-builder-client v0.4.6-0.20250410195459-42a3ff7f1546
Copy link
Collaborator

Choose a reason for hiding this comment

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

Do you want to maintain this for the long term @jtraglia ?

Copy link
Collaborator

Choose a reason for hiding this comment

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

No. We will remove this when attestant adds support. I don't think we have to block merging this PR on that though.

8 changes: 4 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI=
github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI=
github.com/attestantio/go-builder-client v0.6.1 h1:fn6PC8aDWx2YbptstR1JKP8NyakiNJJTiOE5f9N0z5Q=
github.com/attestantio/go-builder-client v0.6.1/go.mod h1:f8wi3HzuPxfJoi2PirpJK3yZhte4SavDgKJbRrKoB1Q=
github.com/attestantio/go-eth2-client v0.25.0 h1:wLQxoteGCbTE/vKCMASx1ze+Zm9rcqtltRnblaLJup4=
github.com/attestantio/go-eth2-client v0.25.0/go.mod h1:fvULSL9WtNskkOB4i+Yyr6BKpNHXvmpGZj9969fCrfY=
github.com/attestantio/go-eth2-client v0.25.1-0.20250603135601-6ac0bfda7fda h1:Wc7YGICtTWKNZvMjpIN/l6HKTj9POEU9N67NIWWWOk0=
github.com/attestantio/go-eth2-client v0.25.1-0.20250603135601-6ac0bfda7fda/go.mod h1:fvULSL9WtNskkOB4i+Yyr6BKpNHXvmpGZj9969fCrfY=
github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4=
github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
Expand Down Expand Up @@ -59,6 +57,8 @@ github.com/huandu/go-clone v1.7.2 h1:3+Aq0Ed8XK+zKkLjE2dfHg0XrpIfcohBE1K+c8Usxoo
github.com/huandu/go-clone v1.7.2/go.mod h1:ReGivhG6op3GYr+UY3lS6mxjKp7MIGTknuU5TbTVaXE=
github.com/huandu/go-clone/generic v1.6.0 h1:Wgmt/fUZ28r16F2Y3APotFD59sHk1p78K0XLdbUYN5U=
github.com/huandu/go-clone/generic v1.6.0/go.mod h1:xgd9ZebcMsBWWcBx5mVMCoqMX24gLWr5lQicr+nVXNs=
github.com/jtraglia/go-builder-client v0.4.6-0.20250410195459-42a3ff7f1546 h1:UnMUnbUz6fiJ1Ox7hNMkAS6T+Vcdy2qjo9q2D3q8zqg=
github.com/jtraglia/go-builder-client v0.4.6-0.20250410195459-42a3ff7f1546/go.mod h1:3Z2KfjbuX2EmJajEmDb3I/JdDqzlm4WsojnCugO0oM0=
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
Expand Down
1 change: 1 addition & 0 deletions server/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@ const (
EthConsensusVersionCapella = "capella"
EthConsensusVersionDeneb = "deneb"
EthConsensusVersionElectra = "electra"
EthConsensusVersionFulu = "fulu"
)
7 changes: 7 additions & 0 deletions server/get_header.go
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,10 @@ func decodeBid(respBytes []byte, respContentType, ethConsensusVersion string, bi
bid.Version = spec.DataVersionElectra
bid.Electra = new(builderApiElectra.SignedBuilderBid)
return bid.Electra.UnmarshalSSZ(respBytes)
case EthConsensusVersionFulu:
bid.Version = spec.DataVersionFulu
bid.Fulu = new(builderApiElectra.SignedBuilderBid)
return bid.Fulu.UnmarshalSSZ(respBytes)
default:
return errInvalidForkVersion
}
Expand Down Expand Up @@ -322,6 +326,9 @@ func (m *BoostService) respondGetHeaderSSZ(w http.ResponseWriter, result *bidRes
case spec.DataVersionElectra:
w.Header().Set(HeaderEthConsensusVersion, EthConsensusVersionElectra)
sszData, err = result.response.Electra.MarshalSSZ()
case spec.DataVersionFulu:
w.Header().Set(HeaderEthConsensusVersion, EthConsensusVersionFulu)
sszData, err = result.response.Fulu.MarshalSSZ()
case spec.DataVersionUnknown, spec.DataVersionPhase0, spec.DataVersionAltair:
err = errInvalidForkVersion
}
Expand Down
233 changes: 149 additions & 84 deletions server/get_payload.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (

builderApi "github.com/attestantio/go-builder-client/api"
builderApiDeneb "github.com/attestantio/go-builder-client/api/deneb"
builderApiFulu "github.com/attestantio/go-builder-client/api/fulu"
eth2Api "github.com/attestantio/go-eth2-client/api"
eth2ApiV1Bellatrix "github.com/attestantio/go-eth2-client/api/v1/bellatrix"
eth2ApiV1Capella "github.com/attestantio/go-eth2-client/api/v1/capella"
Expand All @@ -24,6 +25,7 @@ import (
"github.com/attestantio/go-eth2-client/spec/bellatrix"
"github.com/attestantio/go-eth2-client/spec/capella"
"github.com/attestantio/go-eth2-client/spec/phase0"
"github.com/flashbots/mev-boost/common"
"github.com/flashbots/mev-boost/config"
"github.com/flashbots/mev-boost/server/params"
"github.com/flashbots/mev-boost/server/types"
Expand All @@ -36,7 +38,6 @@ var (
errInvalidBlockhash = errors.New("invalid blockhash")
errInvalidKZGLength = errors.New("invalid KZG commitments length")
errInvalidKZG = errors.New("invalid KZG commitment")
errFailedToDecode = errors.New("failed to decode payload")
errFailedToConvert = errors.New("failed to convert block from SSZ to JSON")
)

Expand Down Expand Up @@ -339,31 +340,70 @@ func verifyBlobsBundle(log *logrus.Entry, request *eth2Api.VersionedSignedBlinde
return err
}

// Ensure the blobs bundle field counts are correct
if len(requestCommitments) != len(responseBlobsBundle.Blobs) ||
len(requestCommitments) != len(responseBlobsBundle.Commitments) ||
len(requestCommitments) != len(responseBlobsBundle.Proofs) {
// Check commitments
responseCommitments, err := responseBlobsBundle.Commitments()
Copy link
Collaborator

Choose a reason for hiding this comment

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

you could still verify blobs here, would save a bit of duplicated code

if err != nil {
log.WithError(err).Error("failed to get response commitments")
return err
}
if len(requestCommitments) != len(responseCommitments) {
log.WithFields(logrus.Fields{
"requestBlobCommitments": len(requestCommitments),
"responseBlobs": len(responseBlobsBundle.Blobs),
"responseBlobCommitments": len(responseBlobsBundle.Commitments),
"responseBlobProofs": len(responseBlobsBundle.Proofs),
}).Error("different lengths for blobs/commitments/proofs")
"requestBlobCommitments": len(requestCommitments),
"responseCommitments": len(responseCommitments),
}).Error("different lengths for commitments")
return errInvalidKZGLength
}

// Ensure the request and response KZG commitments are the same
for i, commitment := range requestCommitments {
if commitment != responseBlobsBundle.Commitments[i] {
if commitment != responseCommitments[i] {
log.WithFields(logrus.Fields{
"index": i,
"requestBlobCommitment": commitment.String(),
"responseBlobCommitment": responseBlobsBundle.Commitments[i].String(),
"responseBlobCommitment": responseCommitments[i].String(),
}).Error("requestBlobCommitment does not equal responseBlobCommitment")
return errInvalidKZG
}
}

// Check proofs
responseProofs, err := responseBlobsBundle.Proofs()
if err != nil {
log.WithError(err).Error("failed to get response proofs")
return err
}

if request.Version >= spec.DataVersionFulu {
Comment on lines +428 to +430
Copy link
Collaborator

Choose a reason for hiding this comment

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

Just a nit, I'd remove this blank line. This would be consistent with the commitments & blobs checks.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

do you mean the blank line in like 373?

Copy link
Collaborator

Choose a reason for hiding this comment

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

Yes, that's right.

if len(requestCommitments)*common.CellsPerExtBlob != len(responseProofs) {
log.WithFields(logrus.Fields{
"requestBlobCommitments": len(requestCommitments),
"responseProofs": len(responseProofs),
"cellsPerExtBlob": common.CellsPerExtBlob,
}).Error("different lengths for proofs")
return errInvalidKZGLength
}
} else {
if len(requestCommitments) != len(responseProofs) {
log.WithFields(logrus.Fields{
"requestBlobCommitments": len(requestCommitments),
"responseProofs": len(responseProofs),
}).Error("different lengths for proofs")
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
}).Error("different lengths for proofs")
}).Error("wrong lengths for proofs")

Copy link
Collaborator

Choose a reason for hiding this comment

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

Nitpicky, but I would change all "different" to "wrong"

return errInvalidKZGLength
}
}

// Check blobs
responseBlobs, err := responseBlobsBundle.Blobs()
if err != nil {
log.WithError(err).Error("failed to get response blobs")
return err
}
if len(requestCommitments) != len(responseBlobs) {
log.WithFields(logrus.Fields{
"requestBlobCommitments": len(requestCommitments),
"responseBlobs": len(responseBlobs),
}).Error("different lengths for blobs")
return errInvalidKZGLength
}

return nil
}

Expand All @@ -388,6 +428,8 @@ func convertSSZToJSON(ethConsensusVersion string, sszBytes []byte) ([]byte, erro
block = new(eth2ApiV1Deneb.SignedBlindedBeaconBlock)
case EthConsensusVersionElectra:
block = new(eth2ApiV1Electra.SignedBlindedBeaconBlock)
case EthConsensusVersionFulu:
block = new(eth2ApiV1Electra.SignedBlindedBeaconBlock)
default:
return nil, errInvalidForkVersion
}
Expand All @@ -406,61 +448,78 @@ func convertSSZToJSON(ethConsensusVersion string, sszBytes []byte) ([]byte, erro
func decodeSignedBlindedBeaconBlock(in []byte, contentType, ethConsensusVersion string, out *eth2Api.VersionedSignedBlindedBeaconBlock) error {
switch contentType {
case MediaTypeOctetStream:
if ethConsensusVersion != "" {
switch ethConsensusVersion {
case EthConsensusVersionBellatrix:
out.Version = spec.DataVersionBellatrix
out.Bellatrix = new(eth2ApiV1Bellatrix.SignedBlindedBeaconBlock)
return out.Bellatrix.UnmarshalSSZ(in)
case EthConsensusVersionCapella:
out.Version = spec.DataVersionCapella
out.Capella = new(eth2ApiV1Capella.SignedBlindedBeaconBlock)
return out.Capella.UnmarshalSSZ(in)
case EthConsensusVersionDeneb:
out.Version = spec.DataVersionDeneb
out.Deneb = new(eth2ApiV1Deneb.SignedBlindedBeaconBlock)
return out.Deneb.UnmarshalSSZ(in)
case EthConsensusVersionElectra:
out.Version = spec.DataVersionElectra
out.Electra = new(eth2ApiV1Electra.SignedBlindedBeaconBlock)
return out.Electra.UnmarshalSSZ(in)
default:
return errInvalidForkVersion
}
} else {
if ethConsensusVersion == "" {
return types.ErrMissingEthConsensusVersion
}
case MediaTypeJSON:
var err error
electraBlock := new(eth2ApiV1Electra.SignedBlindedBeaconBlock)
err = json.Unmarshal(in, electraBlock)
if err == nil {
out.Version = spec.DataVersionElectra
out.Electra = electraBlock
return nil
}
denebBlock := new(eth2ApiV1Deneb.SignedBlindedBeaconBlock)
err = json.Unmarshal(in, denebBlock)
if err == nil {
switch ethConsensusVersion {
case EthConsensusVersionBellatrix:
out.Version = spec.DataVersionBellatrix
out.Bellatrix = new(eth2ApiV1Bellatrix.SignedBlindedBeaconBlock)
return out.Bellatrix.UnmarshalSSZ(in)
case EthConsensusVersionCapella:
out.Version = spec.DataVersionCapella
out.Capella = new(eth2ApiV1Capella.SignedBlindedBeaconBlock)
return out.Capella.UnmarshalSSZ(in)
case EthConsensusVersionDeneb:
out.Version = spec.DataVersionDeneb
out.Deneb = denebBlock
return nil
out.Deneb = new(eth2ApiV1Deneb.SignedBlindedBeaconBlock)
return out.Deneb.UnmarshalSSZ(in)
case EthConsensusVersionElectra:
out.Version = spec.DataVersionElectra
out.Electra = new(eth2ApiV1Electra.SignedBlindedBeaconBlock)
return out.Electra.UnmarshalSSZ(in)
case EthConsensusVersionFulu:
out.Version = spec.DataVersionFulu
out.Fulu = new(eth2ApiV1Electra.SignedBlindedBeaconBlock)
return out.Fulu.UnmarshalSSZ(in)
default:
return errInvalidForkVersion
}
capellaBlock := new(eth2ApiV1Capella.SignedBlindedBeaconBlock)
err = json.Unmarshal(in, capellaBlock)
if err == nil {
out.Version = spec.DataVersionCapella
out.Capella = capellaBlock
return nil
case MediaTypeJSON:
if ethConsensusVersion == "" {
return types.ErrMissingEthConsensusVersion
}
bellatrixBlock := new(eth2ApiV1Bellatrix.SignedBlindedBeaconBlock)
err = json.Unmarshal(in, bellatrixBlock)
if err == nil {
var err error
switch ethConsensusVersion {
case EthConsensusVersionBellatrix:
block := new(eth2ApiV1Bellatrix.SignedBlindedBeaconBlock)
if err = json.Unmarshal(in, block); err != nil {
return err
}
out.Version = spec.DataVersionBellatrix
out.Bellatrix = bellatrixBlock
return nil
out.Bellatrix = block
case EthConsensusVersionCapella:
block := new(eth2ApiV1Capella.SignedBlindedBeaconBlock)
if err = json.Unmarshal(in, block); err != nil {
return err
}
out.Version = spec.DataVersionCapella
out.Capella = block
case EthConsensusVersionDeneb:
block := new(eth2ApiV1Deneb.SignedBlindedBeaconBlock)
if err = json.Unmarshal(in, block); err != nil {
return err
}
out.Version = spec.DataVersionDeneb
out.Deneb = block
Comment on lines +541 to +546
Copy link
Collaborator

Choose a reason for hiding this comment

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

This whole api is so cursed. out should just have a type block any

Copy link
Collaborator

Choose a reason for hiding this comment

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

Lol. I don't think making it any would be a wise change. It's okay to be explicit.

Copy link
Collaborator

@MariusVanDerWijden MariusVanDerWijden Jul 14, 2025

Choose a reason for hiding this comment

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

I know, the correct way would be an interface that all the different types implement.
Making it explicit is just super ugly.

edit: just how we implement transactions in geth

Copy link
Collaborator

Choose a reason for hiding this comment

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

agree, that'd be nice! perhaps open an issue to remind us of it later and we do a follow-up PR for this?

case EthConsensusVersionElectra:
block := new(eth2ApiV1Electra.SignedBlindedBeaconBlock)
if err = json.Unmarshal(in, block); err != nil {
return err
}
out.Version = spec.DataVersionElectra
out.Electra = block
case EthConsensusVersionFulu:
block := new(eth2ApiV1Electra.SignedBlindedBeaconBlock)
if err = json.Unmarshal(in, block); err != nil {
return err
}
out.Version = spec.DataVersionFulu
out.Fulu = block
default:
return errInvalidForkVersion
}
return errFailedToDecode
return nil
}
return types.ErrInvalidContentType
}
Expand All @@ -469,30 +528,33 @@ func decodeSignedBlindedBeaconBlock(in []byte, contentType, ethConsensusVersion
func decodeSubmitBlindedBlockResponse(in []byte, contentType, ethConsensusVersion string, out *builderApi.VersionedSubmitBlindedBlockResponse) error {
switch contentType {
case MediaTypeOctetStream:
if ethConsensusVersion != "" {
switch ethConsensusVersion {
case EthConsensusVersionBellatrix:
out.Version = spec.DataVersionBellatrix
out.Bellatrix = new(bellatrix.ExecutionPayload)
return out.Bellatrix.UnmarshalSSZ(in)
case EthConsensusVersionCapella:
out.Version = spec.DataVersionCapella
out.Capella = new(capella.ExecutionPayload)
return out.Capella.UnmarshalSSZ(in)
case EthConsensusVersionDeneb:
out.Version = spec.DataVersionDeneb
out.Deneb = new(builderApiDeneb.ExecutionPayloadAndBlobsBundle)
return out.Deneb.UnmarshalSSZ(in)
case EthConsensusVersionElectra:
out.Version = spec.DataVersionElectra
out.Electra = new(builderApiDeneb.ExecutionPayloadAndBlobsBundle)
return out.Electra.UnmarshalSSZ(in)
default:
return errInvalidForkVersion
}
} else {
if ethConsensusVersion == "" {
return types.ErrMissingEthConsensusVersion
}
switch ethConsensusVersion {
case EthConsensusVersionBellatrix:
out.Version = spec.DataVersionBellatrix
out.Bellatrix = new(bellatrix.ExecutionPayload)
return out.Bellatrix.UnmarshalSSZ(in)
case EthConsensusVersionCapella:
out.Version = spec.DataVersionCapella
out.Capella = new(capella.ExecutionPayload)
return out.Capella.UnmarshalSSZ(in)
case EthConsensusVersionDeneb:
out.Version = spec.DataVersionDeneb
out.Deneb = new(builderApiDeneb.ExecutionPayloadAndBlobsBundle)
return out.Deneb.UnmarshalSSZ(in)
case EthConsensusVersionElectra:
out.Version = spec.DataVersionElectra
out.Electra = new(builderApiDeneb.ExecutionPayloadAndBlobsBundle)
return out.Electra.UnmarshalSSZ(in)
case EthConsensusVersionFulu:
out.Version = spec.DataVersionFulu
out.Fulu = new(builderApiFulu.ExecutionPayloadAndBlobsBundle)
return out.Fulu.UnmarshalSSZ(in)
default:
return errInvalidForkVersion
}
case MediaTypeJSON:
return json.Unmarshal(in, out)
}
Expand Down Expand Up @@ -533,6 +595,9 @@ func (m *BoostService) respondGetPayloadSSZ(w http.ResponseWriter, result *build
case spec.DataVersionElectra:
w.Header().Set(HeaderEthConsensusVersion, EthConsensusVersionElectra)
sszData, err = result.Electra.MarshalSSZ()
case spec.DataVersionFulu:
w.Header().Set(HeaderEthConsensusVersion, EthConsensusVersionFulu)
sszData, err = result.Fulu.MarshalSSZ()
case spec.DataVersionUnknown, spec.DataVersionPhase0, spec.DataVersionAltair:
err = errInvalidForkVersion
}
Expand Down
Loading
Loading