diff --git a/beacon-chain/blockchain/execution_engine.go b/beacon-chain/blockchain/execution_engine.go index cc58f39db..c177a0cae 100644 --- a/beacon-chain/blockchain/execution_engine.go +++ b/beacon-chain/blockchain/execution_engine.go @@ -70,7 +70,7 @@ func (s *Service) notifyForkchoiceUpdate(ctx context.Context, arg *notifyForkcho } nextSlot := s.CurrentSlot() + 1 // Cache payload ID for next slot proposer. - hasAttr, attr, proposerId := s.getPayloadAttribute(ctx, arg.headState, nextSlot) + hasAttr, attr, proposerId := s.getPayloadAttribute(ctx, arg.headState, nextSlot, arg.headRoot[:]) payloadID, lastValidHash, err := s.cfg.ExecutionEngineCaller.ForkchoiceUpdated(ctx, fcs, attr) if err != nil { @@ -251,7 +251,7 @@ func (s *Service) notifyNewPayload(ctx context.Context, postStateVersion int, // getPayloadAttributes returns the payload attributes for the given state and slot. // The attribute is required to initiate a payload build process in the context of an `engine_forkchoiceUpdated` call. -func (s *Service) getPayloadAttribute(ctx context.Context, st state.BeaconState, slot primitives.Slot) (bool, payloadattribute.Attributer, primitives.ValidatorIndex) { +func (s *Service) getPayloadAttribute(ctx context.Context, st state.BeaconState, slot primitives.Slot, headRoot []byte) (bool, payloadattribute.Attributer, primitives.ValidatorIndex) { emptyAttri := payloadattribute.EmptyWithVersion(st.Version()) // Root is `[32]byte{}` since we are retrieving proposer ID of a given slot. During insertion at assignment the root was not known. proposerID, _, ok := s.cfg.ProposerSlotIndexCache.GetProposerPayloadIDs(slot, [32]byte{} /* root */) @@ -261,10 +261,13 @@ func (s *Service) getPayloadAttribute(ctx context.Context, st state.BeaconState, // Get previous randao. st = st.Copy() - st, err := transition.ProcessSlotsIfPossible(ctx, st, slot) - if err != nil { - log.WithError(err).Error("Could not process slots to get payload attribute") - return false, emptyAttri, 0 + if slot > st.Slot() { + var err error + st, err = transition.ProcessSlotsUsingNextSlotCache(ctx, st, headRoot, slot) + if err != nil { + log.WithError(err).Error("Could not process slots to get payload attribute") + return false, emptyAttri, 0 + } } prevRando, err := helpers.RandaoMix(st, time.CurrentEpoch(st)) if err != nil { diff --git a/beacon-chain/blockchain/execution_engine_test.go b/beacon-chain/blockchain/execution_engine_test.go index 92bd88768..0462e82b9 100644 --- a/beacon-chain/blockchain/execution_engine_test.go +++ b/beacon-chain/blockchain/execution_engine_test.go @@ -800,7 +800,7 @@ func Test_GetPayloadAttribute(t *testing.T) { service, err := NewService(ctx, opts...) require.NoError(t, err) st, _ := util.DeterministicGenesisStateBellatrix(t, 1) - hasPayload, _, vId := service.getPayloadAttribute(ctx, st, 0) + hasPayload, _, vId := service.getPayloadAttribute(ctx, st, 0, []byte{}) require.Equal(t, false, hasPayload) require.Equal(t, primitives.ValidatorIndex(0), vId) @@ -809,7 +809,7 @@ func Test_GetPayloadAttribute(t *testing.T) { slot := primitives.Slot(1) service.cfg.ProposerSlotIndexCache.SetProposerAndPayloadIDs(slot, suggestedVid, [8]byte{}, [32]byte{}) hook := logTest.NewGlobal() - hasPayload, attr, vId := service.getPayloadAttribute(ctx, st, slot) + hasPayload, attr, vId := service.getPayloadAttribute(ctx, st, slot, params.BeaconConfig().ZeroHash[:]) require.Equal(t, true, hasPayload) require.Equal(t, suggestedVid, vId) require.Equal(t, params.BeaconConfig().EthBurnAddressHex, common.BytesToAddress(attr.SuggestedFeeRecipient()).String()) @@ -819,7 +819,7 @@ func Test_GetPayloadAttribute(t *testing.T) { suggestedAddr := common.HexToAddress("123") require.NoError(t, service.cfg.BeaconDB.SaveFeeRecipientsByValidatorIDs(ctx, []primitives.ValidatorIndex{suggestedVid}, []common.Address{suggestedAddr})) service.cfg.ProposerSlotIndexCache.SetProposerAndPayloadIDs(slot, suggestedVid, [8]byte{}, [32]byte{}) - hasPayload, attr, vId = service.getPayloadAttribute(ctx, st, slot) + hasPayload, attr, vId = service.getPayloadAttribute(ctx, st, slot, params.BeaconConfig().ZeroHash[:]) require.Equal(t, true, hasPayload) require.Equal(t, suggestedVid, vId) require.Equal(t, suggestedAddr, common.BytesToAddress(attr.SuggestedFeeRecipient())) @@ -843,7 +843,7 @@ func Test_GetPayloadAttribute_PrepareAllPayloads(t *testing.T) { service, err := NewService(ctx, opts...) require.NoError(t, err) st, _ := util.DeterministicGenesisStateBellatrix(t, 1) - hasPayload, attr, vId := service.getPayloadAttribute(ctx, st, 0) + hasPayload, attr, vId := service.getPayloadAttribute(ctx, st, 0, []byte{}) require.Equal(t, true, hasPayload) require.Equal(t, primitives.ValidatorIndex(0), vId) require.Equal(t, params.BeaconConfig().EthBurnAddressHex, common.BytesToAddress(attr.SuggestedFeeRecipient()).String()) @@ -863,7 +863,7 @@ func Test_GetPayloadAttributeV2(t *testing.T) { service, err := NewService(ctx, opts...) require.NoError(t, err) st, _ := util.DeterministicGenesisStateCapella(t, 1) - hasPayload, _, vId := service.getPayloadAttribute(ctx, st, 0) + hasPayload, _, vId := service.getPayloadAttribute(ctx, st, 0, []byte{}) require.Equal(t, false, hasPayload) require.Equal(t, primitives.ValidatorIndex(0), vId) @@ -872,7 +872,7 @@ func Test_GetPayloadAttributeV2(t *testing.T) { slot := primitives.Slot(1) service.cfg.ProposerSlotIndexCache.SetProposerAndPayloadIDs(slot, suggestedVid, [8]byte{}, [32]byte{}) hook := logTest.NewGlobal() - hasPayload, attr, vId := service.getPayloadAttribute(ctx, st, slot) + hasPayload, attr, vId := service.getPayloadAttribute(ctx, st, slot, params.BeaconConfig().ZeroHash[:]) require.Equal(t, true, hasPayload) require.Equal(t, suggestedVid, vId) require.Equal(t, params.BeaconConfig().EthBurnAddressHex, common.BytesToAddress(attr.SuggestedFeeRecipient()).String()) @@ -885,7 +885,7 @@ func Test_GetPayloadAttributeV2(t *testing.T) { suggestedAddr := common.HexToAddress("123") require.NoError(t, service.cfg.BeaconDB.SaveFeeRecipientsByValidatorIDs(ctx, []primitives.ValidatorIndex{suggestedVid}, []common.Address{suggestedAddr})) service.cfg.ProposerSlotIndexCache.SetProposerAndPayloadIDs(slot, suggestedVid, [8]byte{}, [32]byte{}) - hasPayload, attr, vId = service.getPayloadAttribute(ctx, st, slot) + hasPayload, attr, vId = service.getPayloadAttribute(ctx, st, slot, params.BeaconConfig().ZeroHash[:]) require.Equal(t, true, hasPayload) require.Equal(t, suggestedVid, vId) require.Equal(t, suggestedAddr, common.BytesToAddress(attr.SuggestedFeeRecipient()))