Skip to content

Commit

Permalink
Allow next slot, and broadcast based on proposer index
Browse files Browse the repository at this point in the history
  • Loading branch information
terencechain committed Sep 18, 2024
1 parent 85c833b commit c4b17ef
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 4 deletions.
19 changes: 17 additions & 2 deletions beacon-chain/rpc/prysm/v1alpha1/validator/proposer_epbs.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

"github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/epbs"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers"
"github.com/prysmaticlabs/prysm/v5/consensus-types/blocks"
"github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces"
enginev1 "github.com/prysmaticlabs/prysm/v5/proto/engine/v1"
Expand Down Expand Up @@ -34,12 +35,26 @@ func (vs *Server) SubmitSignedExecutionPayloadEnvelope(ctx context.Context, env

// SubmitSignedExecutionPayloadHeader submits a signed execution payload header to the beacon node.
func (vs *Server) SubmitSignedExecutionPayloadHeader(ctx context.Context, h *enginev1.SignedExecutionPayloadHeader) (*emptypb.Empty, error) {
if vs.TimeFetcher.CurrentSlot() != h.Message.Slot {
return nil, status.Errorf(codes.InvalidArgument, "current slot mismatch: expected %d, got %d", vs.TimeFetcher.CurrentSlot(), h.Message.Slot)
if vs.TimeFetcher.CurrentSlot() != h.Message.Slot && vs.TimeFetcher.CurrentSlot() != h.Message.Slot-1 {
return nil, status.Errorf(codes.InvalidArgument, "invalid slot: current slot %d, got %d", vs.TimeFetcher.CurrentSlot(), h.Message.Slot)
}

vs.signedExecutionPayloadHeader = h

headState, err := vs.HeadFetcher.HeadStateReadOnly(ctx)
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to retrieve head state: %v", err)
}
proposerIndex, err := helpers.BeaconProposerIndexAtSlot(ctx, headState, h.Message.Slot)
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to retrieve proposer index: %v", err)
}
if proposerIndex != h.Message.BuilderIndex {
if err := vs.P2P.Broadcast(ctx, h); err != nil {
return nil, status.Errorf(codes.Internal, "failed to broadcast signed execution payload header: %v", err)
}
}

return nil, nil
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ func TestServer_SubmitSignedExecutionPayloadEnvelope(t *testing.T) {
}

func TestServer_SubmitSignedExecutionPayloadHeader(t *testing.T) {
st, _ := util.DeterministicGenesisStateEpbs(t, 1)
h := &enginev1.SignedExecutionPayloadHeader{
Message: &enginev1.ExecutionPayloadHeaderEPBS{
Slot: 1,
Expand All @@ -57,18 +58,21 @@ func TestServer_SubmitSignedExecutionPayloadHeader(t *testing.T) {
slot := primitives.Slot(1)
server := &Server{
TimeFetcher: &mockChain.ChainService{Slot: &slot},
HeadFetcher: &mockChain.ChainService{State: st},
P2P: p2ptest.NewTestP2P(t),
}

t.Run("Happy case", func(t *testing.T) {
h.Message.BuilderIndex = 1
_, err := server.SubmitSignedExecutionPayloadHeader(context.Background(), h)
require.NoError(t, err)
require.DeepEqual(t, server.signedExecutionPayloadHeader, h)
})

t.Run("Incorrect slot", func(t *testing.T) {
h.Message.Slot = 2
h.Message.Slot = 3
_, err := server.SubmitSignedExecutionPayloadHeader(context.Background(), h)
require.ErrorContains(t, "current slot mismatch: expected 1, got 2", err)
require.ErrorContains(t, "invalid slot: current slot 1, got 3", err)
})
}

Expand Down

0 comments on commit c4b17ef

Please sign in to comment.