diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer.go index bcac5fd577..aee68deb54 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer.go @@ -189,6 +189,15 @@ func (vs *Server) computeStateRoot(ctx context.Context, block interfaces.SignedB } // SubmitValidatorRegistration submits validator registrations. -func (vs *Server) SubmitValidatorRegistration(context.Context, *ethpb.SignedValidatorRegistrationsV1) (*emptypb.Empty, error) { +func (vs *Server) SubmitValidatorRegistration(ctx context.Context, reg *ethpb.SignedValidatorRegistrationsV1) (*emptypb.Empty, error) { + // No-op is the builder is nil / not configured. The node should still function without a builder. + if vs.BlockBuilder == nil || !vs.BlockBuilder.Configured() { + return &emptypb.Empty{}, nil + } + + if err := vs.BlockBuilder.RegisterValidator(ctx, reg.Messages); err != nil { + return nil, status.Errorf(codes.InvalidArgument, "Could not register block builder: %v", err) + } + return &emptypb.Empty{}, nil } diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go index f68a3450cd..4821095e62 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/proposer_test.go @@ -7,8 +7,10 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/pkg/errors" "github.com/prysmaticlabs/go-bitfield" mock "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/testing" + builderTest "github.com/prysmaticlabs/prysm/beacon-chain/builder/testing" "github.com/prysmaticlabs/prysm/beacon-chain/cache" "github.com/prysmaticlabs/prysm/beacon-chain/cache/depositcache" b "github.com/prysmaticlabs/prysm/beacon-chain/core/blocks" @@ -2504,6 +2506,23 @@ func TestProposer_PrepareBeaconProposer(t *testing.T) { } } +func TestProposer_SubmitValidatorRegistration(t *testing.T) { + ctx := context.Background() + proposerServer := &Server{} + reg := ðpb.SignedValidatorRegistrationsV1{} + _, err := proposerServer.SubmitValidatorRegistration(ctx, reg) + require.NoError(t, err) + proposerServer = &Server{BlockBuilder: &builderTest.MockBuilderService{}} + _, err = proposerServer.SubmitValidatorRegistration(ctx, reg) + require.NoError(t, err) + proposerServer = &Server{BlockBuilder: &builderTest.MockBuilderService{HasConfigured: true}} + _, err = proposerServer.SubmitValidatorRegistration(ctx, reg) + require.NoError(t, err) + proposerServer = &Server{BlockBuilder: &builderTest.MockBuilderService{HasConfigured: true, ErrRegisterValidator: errors.New("bad")}} + _, err = proposerServer.SubmitValidatorRegistration(ctx, reg) + require.ErrorContains(t, "bad", err) +} + func majorityVoteBoundaryTime(slot types.Slot) (uint64, uint64) { s := params.BeaconConfig().SlotsPerEpoch.Mul(uint64(params.BeaconConfig().EpochsPerEth1VotingPeriod)) slotStartTime := uint64(mockPOW.GenesisTime) + uint64((slot - (slot % (s))).Mul(params.BeaconConfig().SecondsPerSlot))