From da69af9b6e6953db891069251bfceb3264e6cece Mon Sep 17 00:00:00 2001 From: terencechain Date: Tue, 21 Feb 2023 16:42:51 -0800 Subject: [PATCH] Fix first bellatrix block when using mev-boost (#12019) * Update head before block proposal * Fix first bellatrix block when using mev-boost --------- Co-authored-by: Nishant Das Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> --- .../v1alpha1/validator/proposer_bellatrix.go | 8 ++++---- .../validator/proposer_bellatrix_test.go | 18 +++++++++++++++--- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix.go index 3fdc9b6f0e..f1931345f5 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix.go @@ -10,7 +10,6 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prysmaticlabs/prysm/v3/api/client/builder" - "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/blocks" "github.com/prysmaticlabs/prysm/v3/beacon-chain/core/signing" "github.com/prysmaticlabs/prysm/v3/beacon-chain/state" fieldparams "github.com/prysmaticlabs/prysm/v3/config/fieldparams" @@ -111,13 +110,14 @@ func (vs *Server) setExecutionData(ctx context.Context, blk interfaces.SignedBea // This function retrieves the payload header given the slot number and the validator index. // It's a no-op if the latest head block is not versioned bellatrix. func (vs *Server) getPayloadHeaderFromBuilder(ctx context.Context, slot primitives.Slot, idx primitives.ValidatorIndex) (interfaces.ExecutionData, error) { + if slots.ToEpoch(slot) < params.BeaconConfig().BellatrixForkEpoch { + return nil, errors.New("can't get payload header from builder before bellatrix epoch") + } + b, err := vs.HeadFetcher.HeadBlock(ctx) if err != nil { return nil, err } - if blocks.IsPreBellatrixVersion(b.Version()) { - return nil, nil - } h, err := b.Block().Body().Execution() if err != nil { diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix_test.go index 59ea57bce4..2622b099b2 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_bellatrix_test.go @@ -204,6 +204,11 @@ func TestServer_setExecutionData(t *testing.T) { } func TestServer_getPayloadHeader(t *testing.T) { + params.SetupTestConfigCleanup(t) + bc := params.BeaconConfig() + bc.BellatrixForkEpoch = 1 + params.OverrideBeaconConfig(bc) + emptyRoot, err := ssz.TransactionsRoot([][]byte{}) require.NoError(t, err) ti, err := slots.ToTime(uint64(time.Now().Unix()), 0) @@ -247,7 +252,7 @@ func TestServer_getPayloadHeader(t *testing.T) { returnedHeader *v1.ExecutionPayloadHeader }{ { - name: "head is not bellatrix ready", + name: "can't request before bellatrix epoch", mock: &builderTest.MockBuilderService{}, fetcher: &blockchainTest.ChainService{ Block: func() interfaces.ReadOnlySignedBeaconBlock { @@ -256,6 +261,7 @@ func TestServer_getPayloadHeader(t *testing.T) { return wb }(), }, + err: "can't get payload header from builder before bellatrix epoch", }, { name: "get header failed", @@ -267,6 +273,7 @@ func TestServer_getPayloadHeader(t *testing.T) { Block: func() interfaces.ReadOnlySignedBeaconBlock { wb, err := blocks.NewSignedBeaconBlock(util.NewBeaconBlockBellatrix()) require.NoError(t, err) + wb.SetSlot(primitives.Slot(params.BeaconConfig().BellatrixForkEpoch) * params.BeaconConfig().SlotsPerEpoch) return wb }(), }, @@ -287,6 +294,7 @@ func TestServer_getPayloadHeader(t *testing.T) { Block: func() interfaces.ReadOnlySignedBeaconBlock { wb, err := blocks.NewSignedBeaconBlock(util.NewBeaconBlockBellatrix()) require.NoError(t, err) + wb.SetSlot(primitives.Slot(params.BeaconConfig().BellatrixForkEpoch) * params.BeaconConfig().SlotsPerEpoch) return wb }(), }, @@ -309,6 +317,7 @@ func TestServer_getPayloadHeader(t *testing.T) { Block: func() interfaces.ReadOnlySignedBeaconBlock { wb, err := blocks.NewSignedBeaconBlock(util.NewBeaconBlockBellatrix()) require.NoError(t, err) + wb.SetSlot(primitives.Slot(params.BeaconConfig().BellatrixForkEpoch) * params.BeaconConfig().SlotsPerEpoch) return wb }(), }, @@ -323,6 +332,7 @@ func TestServer_getPayloadHeader(t *testing.T) { Block: func() interfaces.ReadOnlySignedBeaconBlock { wb, err := blocks.NewSignedBeaconBlock(util.NewBeaconBlockBellatrix()) require.NoError(t, err) + wb.SetSlot(primitives.Slot(params.BeaconConfig().BellatrixForkEpoch) * params.BeaconConfig().SlotsPerEpoch) return wb }(), }, @@ -332,9 +342,11 @@ func TestServer_getPayloadHeader(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { vs := &Server{BlockBuilder: tc.mock, HeadFetcher: tc.fetcher, TimeFetcher: &blockchainTest.ChainService{ - Genesis: time.Now(), + Genesis: time.Now().Add(-time.Duration(params.BeaconConfig().SlotsPerEpoch) * time.Duration(params.BeaconConfig().SecondsPerSlot) * time.Second), }} - h, err := vs.getPayloadHeaderFromBuilder(context.Background(), 0, 0) + hb, err := vs.HeadFetcher.HeadBlock(context.Background()) + require.NoError(t, err) + h, err := vs.getPayloadHeaderFromBuilder(context.Background(), hb.Block().Slot(), 0) if tc.err != "" { require.ErrorContains(t, tc.err, err) } else {