diff --git a/.env.example b/.env.example index 3748f32b..2dc3a2d8 100644 --- a/.env.example +++ b/.env.example @@ -27,3 +27,6 @@ RELAY_TIMEOUT_MS_REGVAL=3000 # Timeout for registerValidator request # Retry settings REQUEST_MAX_RETRIES=5 # Maximum number of retries for a relay get payload request + +# Minimal Preset settings +MINIMAL_PRESET=false # Set to true to enable using minimal preset diff --git a/cli/flags.go b/cli/flags.go index ab8760bd..de8e27a8 100644 --- a/cli/flags.go +++ b/cli/flags.go @@ -26,6 +26,7 @@ var flags = []cli.Flag{ sepoliaFlag, holeskyFlag, hoodiFlag, + minimalPresetFlag, // relay relaysFlag, deprecatedRelayMonitorFlag, @@ -122,6 +123,13 @@ var ( Usage: "use Hoodi", Category: GenesisCategory, } + minimalPresetFlag = &cli.BoolFlag{ + Name: "minimal-preset", + Sources: cli.EnvVars("MINIMAL_PRESET"), + Usage: "use Minimal preset", + Value: false, + Category: GenesisCategory, + } // Relay relaysFlag = &cli.StringSliceFlag{ Name: "relay", diff --git a/cli/main.go b/cli/main.go index 9de3664b..7f811e75 100644 --- a/cli/main.go +++ b/cli/main.go @@ -68,6 +68,7 @@ func start(_ context.Context, cmd *cli.Command) error { genesisForkVersion, genesisTime = setupGenesis(cmd) relays, minBid, relayCheck = setupRelays(cmd) listenAddr = cmd.String(addrFlag.Name) + minimalPreset = cmd.Bool(minimalPresetFlag.Name) ) opts := server.BoostServiceOpts{ @@ -82,6 +83,7 @@ func start(_ context.Context, cmd *cli.Command) error { RequestTimeoutGetPayload: time.Duration(cmd.Int(timeoutGetPayloadFlag.Name)) * time.Millisecond, RequestTimeoutRegVal: time.Duration(cmd.Int(timeoutRegValFlag.Name)) * time.Millisecond, RequestMaxRetries: cmd.Int(maxRetriesFlag.Name), + MinimalPreset: minimalPreset, } service, err := server.NewBoostService(opts) if err != nil { diff --git a/go.mod b/go.mod index 93beee7f..bae10aba 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( github.com/google/uuid v1.6.0 github.com/gorilla/mux v1.8.1 github.com/holiman/uint256 v1.3.2 + github.com/pk910/dynamic-ssz v1.0.1 github.com/prysmaticlabs/go-bitfield v0.0.0-20240618144021-706c95b2dd15 github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.10.0 @@ -18,6 +19,7 @@ require ( require ( github.com/bits-and-blooms/bitset v1.22.0 // indirect + github.com/casbin/govaluate v1.8.0 // indirect github.com/consensys/bavard v0.1.30 // indirect github.com/consensys/gnark-crypto v0.17.0 // indirect github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect @@ -28,6 +30,7 @@ require ( github.com/goccy/go-yaml v1.17.1 // indirect github.com/gofrs/flock v0.12.1 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/prysmaticlabs/gohashtree v0.0.4-beta // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/supranational/blst v0.3.14 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect @@ -60,3 +63,5 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) + +replace github.com/attestantio/go-eth2-client => github.com/jacobkaufmann/go-eth2-client v0.0.0-20250529231327-5f241b4aa8a4 diff --git a/go.sum b/go.sum index f2ceecbe..78192f49 100644 --- a/go.sum +++ b/go.sum @@ -2,10 +2,10 @@ github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjC 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/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/casbin/govaluate v1.8.0 h1:1dUaV/I0LFP2tcY1uNQEb6wBCbp8GMTcC/zhwQDWvZo= +github.com/casbin/govaluate v1.8.0/go.mod h1:G/UnbIjZk/0uMNaLwZZmFQrR72tYRZWQkO70si/iR7A= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/consensys/bavard v0.1.30 h1:wwAj9lSnMLFXjEclKwyhf7Oslg8EoaFz9u1QGgt0bsk= @@ -59,6 +59,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/jacobkaufmann/go-eth2-client v0.0.0-20250529231327-5f241b4aa8a4 h1:swIjpXA+H87vwRO0Wm99BBPq2VmHNlTiYmQqsQCTA6I= +github.com/jacobkaufmann/go-eth2-client v0.0.0-20250529231327-5f241b4aa8a4/go.mod h1:fvULSL9WtNskkOB4i+Yyr6BKpNHXvmpGZj9969fCrfY= 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= @@ -81,6 +83,8 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/pk910/dynamic-ssz v1.0.1 h1:fXdon6tqkyw2ClKG8DNxRFmdDgx1Gbr0FCgw0w4WQmI= +github.com/pk910/dynamic-ssz v1.0.1/go.mod h1:rnDVX65+7pLU2oeMdGCCa31zSsa5uozRQigSODlp8jw= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/server/get_header.go b/server/get_header.go index 0149f2fa..57684fd0 100644 --- a/server/get_header.go +++ b/server/get_header.go @@ -133,7 +133,7 @@ func (m *BoostService) getHeader(log *logrus.Entry, slot phase0.Slot, pubkey, pa // Decode bid bid := new(builderSpec.VersionedSignedBuilderBid) - err = decodeBid(respBytes, respContentType, respEthConsensusVersion, bid) + err = m.decodeBid(respBytes, respContentType, respEthConsensusVersion, bid) if err != nil { log.WithError(err).Warn("error decoding bid") return @@ -175,7 +175,7 @@ func (m *BoostService) getHeader(log *logrus.Entry, slot phase0.Slot, pubkey, pa // Verify the relay signature in the relay response if !config.SkipRelaySignatureCheck { - ok, err := checkRelaySignature(bid, m.builderSigningDomain, relay.PublicKey) + ok, err := checkRelaySignature(bid, m.builderSigningDomain, relay.PublicKey, m.dynSSZ) if err != nil { log.WithError(err).Error("error verifying relay signature") return @@ -257,7 +257,7 @@ func (m *BoostService) getHeader(log *logrus.Entry, slot phase0.Slot, pubkey, pa } // decodeBid decodes a bid by SSZ or JSON, depending on the provided respContentType -func decodeBid(respBytes []byte, respContentType, ethConsensusVersion string, bid *builderSpec.VersionedSignedBuilderBid) error { +func (m *BoostService) decodeBid(respBytes []byte, respContentType, ethConsensusVersion string, bid *builderSpec.VersionedSignedBuilderBid) error { switch respContentType { case MediaTypeOctetStream: if ethConsensusVersion != "" { @@ -266,19 +266,19 @@ func decodeBid(respBytes []byte, respContentType, ethConsensusVersion string, bi case EthConsensusVersionBellatrix: bid.Version = spec.DataVersionBellatrix bid.Bellatrix = new(builderApiBellatrix.SignedBuilderBid) - return bid.Bellatrix.UnmarshalSSZ(respBytes) + return m.dynSSZ.UnmarshalSSZ(bid.Bellatrix, respBytes) case EthConsensusVersionCapella: bid.Version = spec.DataVersionCapella bid.Capella = new(builderApiCapella.SignedBuilderBid) - return bid.Capella.UnmarshalSSZ(respBytes) + return m.dynSSZ.UnmarshalSSZ(bid.Capella, respBytes) case EthConsensusVersionDeneb: bid.Version = spec.DataVersionDeneb bid.Deneb = new(builderApiDeneb.SignedBuilderBid) - return bid.Deneb.UnmarshalSSZ(respBytes) + return m.dynSSZ.UnmarshalSSZ(bid.Deneb, respBytes) case EthConsensusVersionElectra: bid.Version = spec.DataVersionElectra bid.Electra = new(builderApiElectra.SignedBuilderBid) - return bid.Electra.UnmarshalSSZ(respBytes) + return m.dynSSZ.UnmarshalSSZ(bid.Electra, respBytes) default: return errInvalidForkVersion } @@ -312,16 +312,16 @@ func (m *BoostService) respondGetHeaderSSZ(w http.ResponseWriter, result *bidRes switch result.response.Version { case spec.DataVersionBellatrix: w.Header().Set(HeaderEthConsensusVersion, EthConsensusVersionBellatrix) - sszData, err = result.response.Bellatrix.MarshalSSZ() + sszData, err = m.dynSSZ.MarshalSSZ(result.response.Bellatrix) case spec.DataVersionCapella: w.Header().Set(HeaderEthConsensusVersion, EthConsensusVersionCapella) - sszData, err = result.response.Capella.MarshalSSZ() + sszData, err = m.dynSSZ.MarshalSSZ(result.response.Capella) case spec.DataVersionDeneb: w.Header().Set(HeaderEthConsensusVersion, EthConsensusVersionDeneb) - sszData, err = result.response.Deneb.MarshalSSZ() + sszData, err = m.dynSSZ.MarshalSSZ(result.response.Deneb) case spec.DataVersionElectra: w.Header().Set(HeaderEthConsensusVersion, EthConsensusVersionElectra) - sszData, err = result.response.Electra.MarshalSSZ() + sszData, err = m.dynSSZ.MarshalSSZ(result.response.Electra) case spec.DataVersionUnknown, spec.DataVersionPhase0, spec.DataVersionAltair: err = errInvalidForkVersion } diff --git a/server/get_payload.go b/server/get_payload.go index 6dfaa4f6..e08cbe2f 100644 --- a/server/get_payload.go +++ b/server/get_payload.go @@ -27,6 +27,7 @@ import ( "github.com/flashbots/mev-boost/config" "github.com/flashbots/mev-boost/server/params" "github.com/flashbots/mev-boost/server/types" + dynssz "github.com/pk910/dynamic-ssz" "github.com/sirupsen/logrus" ) @@ -56,7 +57,7 @@ func (m *BoostService) getPayload(log *logrus.Entry, signedBlindedBeaconBlockByt // Decode the request request := new(eth2Api.VersionedSignedBlindedBeaconBlock) - err = decodeSignedBlindedBeaconBlock(signedBlindedBeaconBlockBytes, parsedProposerContentType, proposerEthConsensusVersion, request) + err = decodeSignedBlindedBeaconBlock(signedBlindedBeaconBlockBytes, parsedProposerContentType, proposerEthConsensusVersion, request, m.dynSSZ) if err != nil { log.WithError(err).Error("failed to decode signed blinded beacon block") return nil, bidResp{} @@ -156,7 +157,7 @@ func (m *BoostService) getPayload(log *logrus.Entry, signedBlindedBeaconBlockByt if parsedProposerContentType == MediaTypeOctetStream && !relaySupportsSSZ { requestContentType = MediaTypeJSON startTime := time.Now() - requestBytes, err = convertSSZToJSON(proposerEthConsensusVersion, signedBlindedBeaconBlockBytes) + requestBytes, err = convertSSZToJSON(proposerEthConsensusVersion, signedBlindedBeaconBlockBytes, m.dynSSZ) if err != nil { log.WithError(errFailedToConvert).Error("failed to convert SSZ to JSON") return nil, err @@ -226,7 +227,7 @@ func (m *BoostService) getPayload(log *logrus.Entry, signedBlindedBeaconBlockByt // Decode response response := new(builderApi.VersionedSubmitBlindedBlockResponse) - err = decodeSubmitBlindedBlockResponse(respBytes, respContentType, respEthConsensusVersion, response) + err = decodeSubmitBlindedBlockResponse(respBytes, respContentType, respEthConsensusVersion, response, m.dynSSZ) if err != nil { log.WithError(err).Warn("error decoding bid") return @@ -377,7 +378,7 @@ type canUnmarshalSSZ interface { } // convertSSZToJSON converts SSZ-encoded bytes to JSON based on the given ethConsensusVersion -func convertSSZToJSON(ethConsensusVersion string, sszBytes []byte) ([]byte, error) { +func convertSSZToJSON(ethConsensusVersion string, sszBytes []byte, dynSSZ *dynssz.DynSsz) ([]byte, error) { var block canUnmarshalSSZ switch ethConsensusVersion { case EthConsensusVersionBellatrix: @@ -391,9 +392,8 @@ func convertSSZToJSON(ethConsensusVersion string, sszBytes []byte) ([]byte, erro default: return nil, errInvalidForkVersion } - // Unmarshal the SSZ-encoded bytes into the block - if err := block.UnmarshalSSZ(sszBytes); err != nil { + if err := dynSSZ.UnmarshalSSZ(block, sszBytes); err != nil { return nil, err } @@ -403,7 +403,7 @@ func convertSSZToJSON(ethConsensusVersion string, sszBytes []byte) ([]byte, erro // decodeSignedBlindedBeaconBlock will decode the request block in either JSON or SSZ. // Note: when decoding JSON, we must attempt decoding from newest to oldest fork version. -func decodeSignedBlindedBeaconBlock(in []byte, contentType, ethConsensusVersion string, out *eth2Api.VersionedSignedBlindedBeaconBlock) error { +func decodeSignedBlindedBeaconBlock(in []byte, contentType, ethConsensusVersion string, out *eth2Api.VersionedSignedBlindedBeaconBlock, dynSSZ *dynssz.DynSsz) error { switch contentType { case MediaTypeOctetStream: if ethConsensusVersion != "" { @@ -411,19 +411,19 @@ func decodeSignedBlindedBeaconBlock(in []byte, contentType, ethConsensusVersion case EthConsensusVersionBellatrix: out.Version = spec.DataVersionBellatrix out.Bellatrix = new(eth2ApiV1Bellatrix.SignedBlindedBeaconBlock) - return out.Bellatrix.UnmarshalSSZ(in) + return dynSSZ.UnmarshalSSZ(out.Bellatrix, in) case EthConsensusVersionCapella: out.Version = spec.DataVersionCapella out.Capella = new(eth2ApiV1Capella.SignedBlindedBeaconBlock) - return out.Capella.UnmarshalSSZ(in) + return dynSSZ.UnmarshalSSZ(out.Capella, in) case EthConsensusVersionDeneb: out.Version = spec.DataVersionDeneb out.Deneb = new(eth2ApiV1Deneb.SignedBlindedBeaconBlock) - return out.Deneb.UnmarshalSSZ(in) + return dynSSZ.UnmarshalSSZ(out.Deneb, in) case EthConsensusVersionElectra: out.Version = spec.DataVersionElectra out.Electra = new(eth2ApiV1Electra.SignedBlindedBeaconBlock) - return out.Electra.UnmarshalSSZ(in) + return dynSSZ.UnmarshalSSZ(out.Electra, in) default: return errInvalidForkVersion } @@ -466,7 +466,7 @@ func decodeSignedBlindedBeaconBlock(in []byte, contentType, ethConsensusVersion } // decodeSubmitBlindedBlockResponse will decode the response contents in either JSON or SSZ -func decodeSubmitBlindedBlockResponse(in []byte, contentType, ethConsensusVersion string, out *builderApi.VersionedSubmitBlindedBlockResponse) error { +func decodeSubmitBlindedBlockResponse(in []byte, contentType, ethConsensusVersion string, out *builderApi.VersionedSubmitBlindedBlockResponse, dynSSZ *dynssz.DynSsz) error { switch contentType { case MediaTypeOctetStream: if ethConsensusVersion != "" { @@ -474,19 +474,19 @@ func decodeSubmitBlindedBlockResponse(in []byte, contentType, ethConsensusVersio case EthConsensusVersionBellatrix: out.Version = spec.DataVersionBellatrix out.Bellatrix = new(bellatrix.ExecutionPayload) - return out.Bellatrix.UnmarshalSSZ(in) + return dynSSZ.UnmarshalSSZ(out.Bellatrix, in) case EthConsensusVersionCapella: out.Version = spec.DataVersionCapella out.Capella = new(capella.ExecutionPayload) - return out.Capella.UnmarshalSSZ(in) + return dynSSZ.UnmarshalSSZ(out.Capella, in) case EthConsensusVersionDeneb: out.Version = spec.DataVersionDeneb out.Deneb = new(builderApiDeneb.ExecutionPayloadAndBlobsBundle) - return out.Deneb.UnmarshalSSZ(in) + return dynSSZ.UnmarshalSSZ(out.Deneb, in) case EthConsensusVersionElectra: out.Version = spec.DataVersionElectra out.Electra = new(builderApiDeneb.ExecutionPayloadAndBlobsBundle) - return out.Electra.UnmarshalSSZ(in) + return dynSSZ.UnmarshalSSZ(out.Electra, in) default: return errInvalidForkVersion } diff --git a/server/register_validator_test.go b/server/register_validator_test.go index 381fea04..6d354475 100644 --- a/server/register_validator_test.go +++ b/server/register_validator_test.go @@ -10,9 +10,11 @@ import ( "time" builderApiV1 "github.com/attestantio/go-builder-client/api/v1" + eth2client "github.com/attestantio/go-eth2-client" "github.com/flashbots/mev-boost/server/mock" "github.com/flashbots/mev-boost/server/params" "github.com/flashbots/mev-boost/server/types" + dynssz "github.com/pk910/dynamic-ssz" "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" ) @@ -26,6 +28,7 @@ func TestHandleRegisterValidator_EmptyList(t *testing.T) { relays: []types.RelayEntry{relay.RelayEntry}, httpClientRegVal: *http.DefaultClient, log: logrus.NewEntry(logrus.New()), + dynSSZ: dynssz.NewDynSsz(eth2client.MainnetPreset), } reqBody := bytes.NewBufferString("[]") @@ -50,6 +53,7 @@ func TestHandleRegisterValidator_NotEmptyList(t *testing.T) { relays: []types.RelayEntry{relay.RelayEntry}, httpClientRegVal: *http.DefaultClient, log: logrus.NewEntry(logrus.New()), + dynSSZ: dynssz.NewDynSsz(eth2client.MainnetPreset), } validatorRegistrations := []builderApiV1.SignedValidatorRegistration{ @@ -90,6 +94,7 @@ func TestHandleRegisterValidator_InvalidJSON(t *testing.T) { relays: []types.RelayEntry{relay.RelayEntry}, httpClientRegVal: *http.DefaultClient, log: logrus.NewEntry(logrus.New()), + dynSSZ: dynssz.NewDynSsz(eth2client.MainnetPreset), } reqBody := bytes.NewBufferString("invalid json") @@ -114,6 +119,7 @@ func TestHandleRegisterValidator_ValidSSZ(t *testing.T) { relays: []types.RelayEntry{relay.RelayEntry}, httpClientRegVal: *http.DefaultClient, log: logrus.NewEntry(logrus.New()), + dynSSZ: dynssz.NewDynSsz(eth2client.MainnetPreset), } validatorRegistrations := builderApiV1.SignedValidatorRegistrations{ @@ -156,6 +162,7 @@ func TestHandleRegisterValidator_InvalidSSZ(t *testing.T) { relays: []types.RelayEntry{relay.RelayEntry}, httpClientRegVal: *http.DefaultClient, log: logrus.NewEntry(logrus.New()), + dynSSZ: dynssz.NewDynSsz(eth2client.MainnetPreset), } reqBody := bytes.NewBufferString("invalid ssz") @@ -186,6 +193,7 @@ func TestHandleRegisterValidator_MultipleRelaysOneSuccess(t *testing.T) { relays: []types.RelayEntry{badRelay.RelayEntry, relaySuccess.RelayEntry}, httpClientRegVal: *http.DefaultClient, log: logrus.NewEntry(logrus.New()), + dynSSZ: dynssz.NewDynSsz(eth2client.MainnetPreset), } reqBody := bytes.NewBufferString("[]") @@ -221,6 +229,7 @@ func TestHandleRegisterValidator_AllFail(t *testing.T) { relays: []types.RelayEntry{badRelay1.RelayEntry, badRelay2.RelayEntry}, httpClientRegVal: *http.DefaultClient, log: logrus.NewEntry(logrus.New()), + dynSSZ: dynssz.NewDynSsz(eth2client.MainnetPreset), } reqBody := bytes.NewBufferString("[]") @@ -247,6 +256,7 @@ func TestHandleRegisterValidator_RelayNetworkError(t *testing.T) { relays: []types.RelayEntry{relay.RelayEntry}, httpClientRegVal: *http.DefaultClient, log: logrus.NewEntry(logrus.New()), + dynSSZ: dynssz.NewDynSsz(eth2client.MainnetPreset), } reqBody := bytes.NewBufferString("[]") @@ -275,6 +285,7 @@ func TestHandleRegisterValidator_HeaderPropagation(t *testing.T) { relays: []types.RelayEntry{relay.RelayEntry}, httpClientRegVal: *http.DefaultClient, log: logrus.NewEntry(logrus.New()), + dynSSZ: dynssz.NewDynSsz(eth2client.MainnetPreset), } reqBody := bytes.NewBufferString("[]") diff --git a/server/service.go b/server/service.go index 92ac1401..46ed978a 100644 --- a/server/service.go +++ b/server/service.go @@ -13,6 +13,7 @@ import ( "sync/atomic" "time" + eth2client "github.com/attestantio/go-eth2-client" "github.com/attestantio/go-eth2-client/spec/phase0" "github.com/flashbots/go-boost-utils/ssz" "github.com/flashbots/go-utils/httplogger" @@ -21,6 +22,7 @@ import ( "github.com/flashbots/mev-boost/server/types" "github.com/google/uuid" "github.com/gorilla/mux" + dynssz "github.com/pk910/dynamic-ssz" "github.com/sirupsen/logrus" goacceptheaders "github.com/timewasted/go-accept-headers" ) @@ -63,6 +65,7 @@ type BoostServiceOpts struct { RequestTimeoutGetPayload time.Duration RequestTimeoutRegVal time.Duration RequestMaxRetries int + MinimalPreset bool } // BoostService - the mev-boost service @@ -86,6 +89,8 @@ type BoostService struct { slotUID *slotUID slotUIDLock sync.Mutex + + dynSSZ *dynssz.DynSsz } // NewBoostService created a new BoostService @@ -99,6 +104,11 @@ func NewBoostService(opts BoostServiceOpts) (*BoostService, error) { return nil, err } + preset := eth2client.MainnetPreset + if opts.MinimalPreset { + preset = eth2client.MinimalPreset + } + return &BoostService{ listenAddr: opts.ListenAddr, relays: opts.Relays, @@ -108,6 +118,7 @@ func NewBoostService(opts BoostServiceOpts) (*BoostService, error) { genesisTime: opts.GenesisTime, bids: make(map[string]bidResp), slotUID: &slotUID{}, + dynSSZ: dynssz.NewDynSsz(preset), builderSigningDomain: builderSigningDomain, httpClientGetHeader: http.Client{ diff --git a/server/service_test.go b/server/service_test.go index 3c9b932a..40de5292 100644 --- a/server/service_test.go +++ b/server/service_test.go @@ -70,6 +70,7 @@ func newTestBackend(t *testing.T, numRelays int, relayTimeout time.Duration) *te RequestTimeoutGetPayload: relayTimeout, RequestTimeoutRegVal: relayTimeout, RequestMaxRetries: 5, + MinimalPreset: false, } service, err := NewBoostService(opts) require.NoError(t, err) @@ -130,6 +131,7 @@ func TestNewBoostServiceErrors(t *testing.T) { RequestTimeoutGetPayload: time.Second, RequestTimeoutRegVal: time.Second, RequestMaxRetries: 1, + MinimalPreset: false, }) require.Error(t, err) }) @@ -1299,7 +1301,7 @@ func TestGetPayloadForks(t *testing.T) { // Decode the block block := new(eth2Api.VersionedSignedBlindedBeaconBlock) - err = decodeSignedBlindedBeaconBlock(jsonBytes, MediaTypeJSON, "", block) + err = decodeSignedBlindedBeaconBlock(jsonBytes, MediaTypeJSON, "", block, backend.boost.dynSSZ) require.NoError(t, err) // Get the request slot and block hash diff --git a/server/utils.go b/server/utils.go index 1e85da3c..ad0a84e5 100644 --- a/server/utils.go +++ b/server/utils.go @@ -23,6 +23,7 @@ import ( "github.com/flashbots/mev-boost/config" "github.com/flashbots/mev-boost/server/types" "github.com/holiman/uint256" + dynssz "github.com/pk910/dynamic-ssz" ) var ( @@ -183,7 +184,7 @@ func parseBidInfo(bid *builderSpec.VersionedSignedBuilderBid) (bidInfo, error) { }, nil } -func checkRelaySignature(bid *builderSpec.VersionedSignedBuilderBid, domain phase0.Domain, pubKey phase0.BLSPubKey) (bool, error) { +func checkRelaySignature(bid *builderSpec.VersionedSignedBuilderBid, domain phase0.Domain, pubKey phase0.BLSPubKey, dynSSZ *dynssz.DynSsz) (bool, error) { root, err := bid.MessageHashTreeRoot() if err != nil { return false, err @@ -193,7 +194,7 @@ func checkRelaySignature(bid *builderSpec.VersionedSignedBuilderBid, domain phas return false, err } signingData := phase0.SigningData{ObjectRoot: root, Domain: domain} - msg, err := signingData.HashTreeRoot() + msg, err := dynSSZ.HashTreeRoot(&signingData) if err != nil { return false, err }