From 3f9bddbf9a5a8fb4280b2344e075f20c22d4c036 Mon Sep 17 00:00:00 2001 From: terence tsao Date: Tue, 25 Apr 2023 14:56:09 -0700 Subject: [PATCH 1/7] Consensus rule check and eq check before broadcast --- beacon-chain/node/node.go | 5 +++++ beacon-chain/rpc/eth/beacon/blocks.go | 19 +++++++++++++++---- beacon-chain/rpc/eth/beacon/server.go | 1 + beacon-chain/rpc/service.go | 2 ++ beacon-chain/sync/service.go | 5 +++++ beacon-chain/sync/validate_beacon_blocks.go | 14 ++++++++++++++ 6 files changed, 42 insertions(+), 4 deletions(-) diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index b51f44027a91..21f5155c10d7 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -753,6 +753,11 @@ func (b *BeaconNode) registerRPCService(router *mux.Router) error { return err } + var regSyncService *regularsync.Service + if err := b.services.FetchService(®SyncService); err != nil { + return err + } + var slasherService *slasher.Service if features.Get().EnableSlasher { if err := b.services.FetchService(&slasherService); err != nil { diff --git a/beacon-chain/rpc/eth/beacon/blocks.go b/beacon-chain/rpc/eth/beacon/blocks.go index 6c9970d9d2f4..c3b6a08005ca 100644 --- a/beacon-chain/rpc/eth/beacon/blocks.go +++ b/beacon-chain/rpc/eth/beacon/blocks.go @@ -10,6 +10,7 @@ import ( "github.com/prysmaticlabs/prysm/v4/beacon-chain/core/feed" blockfeed "github.com/prysmaticlabs/prysm/v4/beacon-chain/core/feed/block" "github.com/prysmaticlabs/prysm/v4/beacon-chain/core/helpers" + "github.com/prysmaticlabs/prysm/v4/beacon-chain/core/transition" "github.com/prysmaticlabs/prysm/v4/beacon-chain/db/filters" rpchelpers "github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/eth/helpers" "github.com/prysmaticlabs/prysm/v4/beacon-chain/rpc/lookup" @@ -1019,6 +1020,20 @@ func (bs *Server) submitBlock(ctx context.Context, blockRoot [fieldparams.RootLe }) }() + b := block.Block() + parentState, err := bs.StateGenService.StateByRoot(ctx, b.ParentRoot()) + if err != nil { + return errors.Wrap(err, "could not get parent state") + } + _, err = transition.ExecuteStateTransition(ctx, parentState, block) + if err != nil { + return errors.Wrap(err, "could not execute state transition") + } + + if bs.EqChecker.HasBlock(b.Slot(), b.ProposerIndex()) { + return fmt.Errorf("block exists in sync service, slot: %d, proposer index: %d", b.Slot(), b.ProposerIndex()) + } + // Broadcast the new block to the network. blockPb, err := block.Proto() if err != nil { @@ -1028,9 +1043,5 @@ func (bs *Server) submitBlock(ctx context.Context, blockRoot [fieldparams.RootLe return status.Errorf(codes.Internal, "Could not broadcast block: %v", err) } - if err := bs.BlockReceiver.ReceiveBlock(ctx, block, blockRoot); err != nil { - return status.Errorf(codes.Internal, "Could not process beacon block: %v", err) - } - return nil } diff --git a/beacon-chain/rpc/eth/beacon/server.go b/beacon-chain/rpc/eth/beacon/server.go index def50b84b38d..166dc097bddb 100644 --- a/beacon-chain/rpc/eth/beacon/server.go +++ b/beacon-chain/rpc/eth/beacon/server.go @@ -40,6 +40,7 @@ type Server struct { OptimisticModeFetcher blockchain.OptimisticModeFetcher V1Alpha1ValidatorServer *v1alpha1validator.Server SyncChecker sync.Checker + EqChecker sync.EqChecker CanonicalHistory *stategen.CanonicalHistory ExecutionPayloadReconstructor execution.ExecutionPayloadReconstructor FinalizationFetcher blockchain.FinalizationFetcher diff --git a/beacon-chain/rpc/service.go b/beacon-chain/rpc/service.go index 55e241832a16..2b0600761082 100644 --- a/beacon-chain/rpc/service.go +++ b/beacon-chain/rpc/service.go @@ -104,6 +104,7 @@ type Config struct { SyncCommitteeObjectPool synccommittee.Pool BLSChangesPool blstoexec.PoolManager SyncService chainSync.Checker + RegSyncService chainSync.Service Broadcaster p2p.Broadcaster PeersFetcher p2p.PeersProvider PeerManager p2p.PeerManager @@ -335,6 +336,7 @@ func (s *Service) Start() { ExecutionPayloadReconstructor: s.cfg.ExecutionPayloadReconstructor, BLSChangesPool: s.cfg.BLSChangesPool, FinalizationFetcher: s.cfg.FinalizationFetcher, + EqChecker: &s.cfg.RegSyncService, } ethpbv1alpha1.RegisterNodeServer(s.grpcServer, nodeServer) ethpbservice.RegisterBeaconNodeServer(s.grpcServer, nodeServerV1) diff --git a/beacon-chain/sync/service.go b/beacon-chain/sync/service.go index 13eb1e1f3846..9a4e127069c4 100644 --- a/beacon-chain/sync/service.go +++ b/beacon-chain/sync/service.go @@ -34,6 +34,7 @@ import ( "github.com/prysmaticlabs/prysm/v4/beacon-chain/state/stategen" lruwrpr "github.com/prysmaticlabs/prysm/v4/cache/lru" "github.com/prysmaticlabs/prysm/v4/config/params" + "github.com/prysmaticlabs/prysm/v4/consensus-types/primitives" ethpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/v4/runtime" prysmTime "github.com/prysmaticlabs/prysm/v4/time" @@ -301,3 +302,7 @@ type Checker interface { Status() error Resync() error } + +type EqChecker interface { + HasBlock(slot primitives.Slot, proposerIdx primitives.ValidatorIndex) bool +} diff --git a/beacon-chain/sync/validate_beacon_blocks.go b/beacon-chain/sync/validate_beacon_blocks.go index 0c73606bd9fd..e56840f328b2 100644 --- a/beacon-chain/sync/validate_beacon_blocks.go +++ b/beacon-chain/sync/validate_beacon_blocks.go @@ -384,3 +384,17 @@ func getBlockFields(b interfaces.ReadOnlySignedBeaconBlock) logrus.Fields { "version": b.Block().Version(), } } + +// HasBlock returns true if +// 1. same block slot and proposer index is in the pending queue +// 2. same block has been seen +func (s *Service) HasBlock(slot primitives.Slot, proposerIdx primitives.ValidatorIndex) bool { + blks := s.pendingBlocksInCache(slot) + for _, blk := range blks { + if blk.Block().Slot() == slot && blk.Block().ProposerIndex() == proposerIdx { + return true + } + } + + return s.hasSeenBlockIndexSlot(slot, proposerIdx) +} From 85ef50efd007ffdc62edaf3b9210aaf27d5a6c66 Mon Sep 17 00:00:00 2001 From: terence tsao Date: Wed, 26 Apr 2023 08:28:35 -0700 Subject: [PATCH 2/7] Use seen proposer index cache --- beacon-chain/node/node.go | 1 + beacon-chain/rpc/eth/beacon/blocks.go | 2 +- beacon-chain/rpc/eth/beacon/server.go | 2 +- beacon-chain/rpc/service.go | 4 +- beacon-chain/sync/service.go | 22 ++++++----- beacon-chain/sync/validate_beacon_blocks.go | 42 ++++++++++++++++----- 6 files changed, 50 insertions(+), 23 deletions(-) diff --git a/beacon-chain/node/node.go b/beacon-chain/node/node.go index 21f5155c10d7..d56398bde0e8 100644 --- a/beacon-chain/node/node.go +++ b/beacon-chain/node/node.go @@ -839,6 +839,7 @@ func (b *BeaconNode) registerRPCService(router *mux.Router) error { ProposerIdsCache: b.proposerIdsCache, BlockBuilder: b.fetchBuilderService(), Router: router, + RegSyncService: regSyncService, }) return b.services.RegisterService(rpcService) diff --git a/beacon-chain/rpc/eth/beacon/blocks.go b/beacon-chain/rpc/eth/beacon/blocks.go index c3b6a08005ca..b69db302feb9 100644 --- a/beacon-chain/rpc/eth/beacon/blocks.go +++ b/beacon-chain/rpc/eth/beacon/blocks.go @@ -1030,7 +1030,7 @@ func (bs *Server) submitBlock(ctx context.Context, blockRoot [fieldparams.RootLe return errors.Wrap(err, "could not execute state transition") } - if bs.EqChecker.HasBlock(b.Slot(), b.ProposerIndex()) { + if bs.EquivocationChecker.SeenProposerIndex(b.Slot(), b.ProposerIndex()) { return fmt.Errorf("block exists in sync service, slot: %d, proposer index: %d", b.Slot(), b.ProposerIndex()) } diff --git a/beacon-chain/rpc/eth/beacon/server.go b/beacon-chain/rpc/eth/beacon/server.go index 166dc097bddb..89926b4eaf65 100644 --- a/beacon-chain/rpc/eth/beacon/server.go +++ b/beacon-chain/rpc/eth/beacon/server.go @@ -40,7 +40,7 @@ type Server struct { OptimisticModeFetcher blockchain.OptimisticModeFetcher V1Alpha1ValidatorServer *v1alpha1validator.Server SyncChecker sync.Checker - EqChecker sync.EqChecker + EquivocationChecker sync.EquivocationChecker CanonicalHistory *stategen.CanonicalHistory ExecutionPayloadReconstructor execution.ExecutionPayloadReconstructor FinalizationFetcher blockchain.FinalizationFetcher diff --git a/beacon-chain/rpc/service.go b/beacon-chain/rpc/service.go index 2b0600761082..1e188bd1ced9 100644 --- a/beacon-chain/rpc/service.go +++ b/beacon-chain/rpc/service.go @@ -104,7 +104,7 @@ type Config struct { SyncCommitteeObjectPool synccommittee.Pool BLSChangesPool blstoexec.PoolManager SyncService chainSync.Checker - RegSyncService chainSync.Service + RegSyncService chainSync.EquivocationChecker Broadcaster p2p.Broadcaster PeersFetcher p2p.PeersProvider PeerManager p2p.PeerManager @@ -336,7 +336,7 @@ func (s *Service) Start() { ExecutionPayloadReconstructor: s.cfg.ExecutionPayloadReconstructor, BLSChangesPool: s.cfg.BLSChangesPool, FinalizationFetcher: s.cfg.FinalizationFetcher, - EqChecker: &s.cfg.RegSyncService, + EquivocationChecker: s.cfg.RegSyncService, } ethpbv1alpha1.RegisterNodeServer(s.grpcServer, nodeServer) ethpbservice.RegisterBeaconNodeServer(s.grpcServer, nodeServerV1) diff --git a/beacon-chain/sync/service.go b/beacon-chain/sync/service.go index 9a4e127069c4..967de01ff791 100644 --- a/beacon-chain/sync/service.go +++ b/beacon-chain/sync/service.go @@ -111,6 +111,7 @@ type Service struct { ctx context.Context cancel context.CancelFunc slotToPendingBlocks *gcache.Cache + seenProposerIndexCache []primitives.ValidatorIndex seenPendingBlocks map[[32]byte]bool blkRootToPendingAtts map[[32]byte][]*ethpb.SignedAggregateAttestationAndProof subHandler *subTopicHandler @@ -147,14 +148,15 @@ func NewService(ctx context.Context, opts ...Option) *Service { c := gcache.New(pendingBlockExpTime /* exp time */, 2*pendingBlockExpTime /* prune time */) ctx, cancel := context.WithCancel(ctx) r := &Service{ - ctx: ctx, - cancel: cancel, - chainStarted: abool.New(), - cfg: &config{}, - slotToPendingBlocks: c, - seenPendingBlocks: make(map[[32]byte]bool), - blkRootToPendingAtts: make(map[[32]byte][]*ethpb.SignedAggregateAttestationAndProof), - signatureChan: make(chan *signatureVerifier, verifierLimit), + ctx: ctx, + cancel: cancel, + chainStarted: abool.New(), + cfg: &config{}, + slotToPendingBlocks: c, + seenPendingBlocks: make(map[[32]byte]bool), + blkRootToPendingAtts: make(map[[32]byte][]*ethpb.SignedAggregateAttestationAndProof), + signatureChan: make(chan *signatureVerifier, verifierLimit), + seenProposerIndexCache: []primitives.ValidatorIndex{0}, // Index 0 is reserved for slot } for _, opt := range opts { if err := opt(r); err != nil { @@ -303,6 +305,6 @@ type Checker interface { Resync() error } -type EqChecker interface { - HasBlock(slot primitives.Slot, proposerIdx primitives.ValidatorIndex) bool +type EquivocationChecker interface { + SeenProposerIndex(slot primitives.Slot, proposerIdx primitives.ValidatorIndex) bool } diff --git a/beacon-chain/sync/validate_beacon_blocks.go b/beacon-chain/sync/validate_beacon_blocks.go index e56840f328b2..b63b9081bdd2 100644 --- a/beacon-chain/sync/validate_beacon_blocks.go +++ b/beacon-chain/sync/validate_beacon_blocks.go @@ -69,6 +69,15 @@ func (s *Service) validateBeaconBlockPubSub(ctx context.Context, pid peer.ID, ms return pubsub.ValidationReject, errors.New("block.Block is nil") } + parentState, err := s.cfg.stateGen.StateByRoot(ctx, blk.Block().ParentRoot()) + if err != nil { + return pubsub.ValidationIgnore, err + } + if err = blocks.VerifyBlockSignatureUsingCurrentFork(parentState, blk); err != nil { + return pubsub.ValidationReject, err + } + s.insertProposerIndexCache(blk.Block().Slot(), blk.Block().ProposerIndex()) + // Broadcast the block on a feed to notify other services in the beacon node // of a received block (even if it does not process correctly through a state transition). s.cfg.blockNotifier.BlockFeed().Send(&feed.Event{ @@ -385,16 +394,31 @@ func getBlockFields(b interfaces.ReadOnlySignedBeaconBlock) logrus.Fields { } } -// HasBlock returns true if -// 1. same block slot and proposer index is in the pending queue -// 2. same block has been seen -func (s *Service) HasBlock(slot primitives.Slot, proposerIdx primitives.ValidatorIndex) bool { - blks := s.pendingBlocksInCache(slot) - for _, blk := range blks { - if blk.Block().Slot() == slot && blk.Block().ProposerIndex() == proposerIdx { +func (s *Service) insertProposerIndexCache(slot primitives.Slot, proposerIdx primitives.ValidatorIndex) { + if s.cfg.chain.CurrentSlot() != slot { + return + } + + switch { + case uint64(s.seenProposerIndexCache[0]) > uint64(slot): + return + case uint64(s.seenProposerIndexCache[0]) == uint64(slot): + s.seenProposerIndexCache = append(s.seenProposerIndexCache, proposerIdx) + case uint64(slot) > uint64(s.seenProposerIndexCache[0]): + // Overwrite slot in proposer index cache if it's higher. + s.seenProposerIndexCache = []primitives.ValidatorIndex{primitives.ValidatorIndex(slot)} + s.seenProposerIndexCache = append(s.seenProposerIndexCache, proposerIdx) + } +} + +func (s *Service) SeenProposerIndex(slot primitives.Slot, proposerIdx primitives.ValidatorIndex) bool { + if s.seenProposerIndexCache[0] != primitives.ValidatorIndex(slot) { + return false + } + for _, i := range s.seenProposerIndexCache[1:] { + if i == proposerIdx { return true } } - - return s.hasSeenBlockIndexSlot(slot, proposerIdx) + return false } From 8a088992d604f10bb224ca924bca99a5df6b5218 Mon Sep 17 00:00:00 2001 From: terence tsao Date: Wed, 26 Apr 2023 08:29:42 -0700 Subject: [PATCH 3/7] Add nil block check --- beacon-chain/rpc/eth/beacon/blocks.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/beacon-chain/rpc/eth/beacon/blocks.go b/beacon-chain/rpc/eth/beacon/blocks.go index b69db302feb9..b8ce67177417 100644 --- a/beacon-chain/rpc/eth/beacon/blocks.go +++ b/beacon-chain/rpc/eth/beacon/blocks.go @@ -1020,6 +1020,10 @@ func (bs *Server) submitBlock(ctx context.Context, blockRoot [fieldparams.RootLe }) }() + if block == nil || block.IsNil() { + return errors.New("nil block") + } + b := block.Block() parentState, err := bs.StateGenService.StateByRoot(ctx, b.ParentRoot()) if err != nil { From 29dd025a3fc95456c850da00132f231e8c349413 Mon Sep 17 00:00:00 2001 From: terence tsao Date: Wed, 26 Apr 2023 08:46:14 -0700 Subject: [PATCH 4/7] Feedback --- beacon-chain/sync/validate_beacon_blocks.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/beacon-chain/sync/validate_beacon_blocks.go b/beacon-chain/sync/validate_beacon_blocks.go index b63b9081bdd2..afb5a130831b 100644 --- a/beacon-chain/sync/validate_beacon_blocks.go +++ b/beacon-chain/sync/validate_beacon_blocks.go @@ -395,23 +395,27 @@ func getBlockFields(b interfaces.ReadOnlySignedBeaconBlock) logrus.Fields { } func (s *Service) insertProposerIndexCache(slot primitives.Slot, proposerIdx primitives.ValidatorIndex) { + if s.seenProposerIndexCache == nil { + return + } if s.cfg.chain.CurrentSlot() != slot { return } switch { - case uint64(s.seenProposerIndexCache[0]) > uint64(slot): - return case uint64(s.seenProposerIndexCache[0]) == uint64(slot): s.seenProposerIndexCache = append(s.seenProposerIndexCache, proposerIdx) case uint64(slot) > uint64(s.seenProposerIndexCache[0]): // Overwrite slot in proposer index cache if it's higher. - s.seenProposerIndexCache = []primitives.ValidatorIndex{primitives.ValidatorIndex(slot)} - s.seenProposerIndexCache = append(s.seenProposerIndexCache, proposerIdx) + s.seenProposerIndexCache = []primitives.ValidatorIndex{primitives.ValidatorIndex(slot), proposerIdx} } } func (s *Service) SeenProposerIndex(slot primitives.Slot, proposerIdx primitives.ValidatorIndex) bool { + if s.seenProposerIndexCache == nil { + return false + } + if s.seenProposerIndexCache[0] != primitives.ValidatorIndex(slot) { return false } From 8b50411252d97662ea485381c4e7038de59218f2 Mon Sep 17 00:00:00 2001 From: terence tsao Date: Wed, 26 Apr 2023 08:56:44 -0700 Subject: [PATCH 5/7] Add comments and headstate --- beacon-chain/rpc/eth/beacon/blocks.go | 14 ++++++-------- beacon-chain/sync/validate_beacon_blocks.go | 4 ++-- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/beacon-chain/rpc/eth/beacon/blocks.go b/beacon-chain/rpc/eth/beacon/blocks.go index b8ce67177417..287bd9948e71 100644 --- a/beacon-chain/rpc/eth/beacon/blocks.go +++ b/beacon-chain/rpc/eth/beacon/blocks.go @@ -199,10 +199,9 @@ func (bs *Server) ListBlockHeaders(ctx context.Context, req *ethpbv1.BlockHeader } // SubmitBlock instructs the beacon node to broadcast a newly signed beacon block to the beacon network, to be -// included in the beacon chain. The beacon node is not required to validate the signed ReadOnlyBeaconBlock, and a successful -// response (20X) only indicates that the broadcast has been successful. The beacon node is expected to integrate the -// new block into its state, and therefore validate the block internally, however blocks which fail the validation are -// still broadcast but a different status code is returned (202). +// included in the beacon chain. The beacon node will validate the signed ReadOnlyBeaconBlock, and a successful +// response (20X) only indicates that the broadcast has been successful. The beacon node is not expected to integrate the +// new block into its state. func (bs *Server) SubmitBlock(ctx context.Context, req *ethpbv2.SignedBeaconBlockContainer) (*emptypb.Empty, error) { ctx, span := trace.StartSpan(ctx, "beacon.SubmitBlock") defer span.End() @@ -232,10 +231,9 @@ func (bs *Server) SubmitBlock(ctx context.Context, req *ethpbv2.SignedBeaconBloc } // SubmitBlockSSZ instructs the beacon node to broadcast a newly signed beacon block to the beacon network, to be -// included in the beacon chain. The beacon node is not required to validate the signed ReadOnlyBeaconBlock, and a successful -// response (20X) only indicates that the broadcast has been successful. The beacon node is expected to integrate the -// new block into its state, and therefore validate the block internally, however blocks which fail the validation are -// still broadcast but a different status code is returned (202). +// included in the beacon chain. The beacon node will validate the signed ReadOnlyBeaconBlock, and a successful +// response (20X) only indicates that the broadcast has been successful. The beacon node is not expected to integrate the +// new block into its state. // // The provided block must be SSZ-serialized. func (bs *Server) SubmitBlockSSZ(ctx context.Context, req *ethpbv2.SSZContainer) (*emptypb.Empty, error) { diff --git a/beacon-chain/sync/validate_beacon_blocks.go b/beacon-chain/sync/validate_beacon_blocks.go index afb5a130831b..5016ddfe670a 100644 --- a/beacon-chain/sync/validate_beacon_blocks.go +++ b/beacon-chain/sync/validate_beacon_blocks.go @@ -69,11 +69,11 @@ func (s *Service) validateBeaconBlockPubSub(ctx context.Context, pid peer.ID, ms return pubsub.ValidationReject, errors.New("block.Block is nil") } - parentState, err := s.cfg.stateGen.StateByRoot(ctx, blk.Block().ParentRoot()) + headState, err := s.cfg.chain.HeadStateReadOnly(ctx) if err != nil { return pubsub.ValidationIgnore, err } - if err = blocks.VerifyBlockSignatureUsingCurrentFork(parentState, blk); err != nil { + if err = blocks.VerifyBlockSignatureUsingCurrentFork(headState, blk); err != nil { return pubsub.ValidationReject, err } s.insertProposerIndexCache(blk.Block().Slot(), blk.Block().ProposerIndex()) From 8e5a192c74bf0ff8067067d5f6dba80c433e23b4 Mon Sep 17 00:00:00 2001 From: terence tsao Date: Wed, 26 Apr 2023 09:08:23 -0700 Subject: [PATCH 6/7] Pass through logs --- beacon-chain/sync/validate_beacon_blocks.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/beacon-chain/sync/validate_beacon_blocks.go b/beacon-chain/sync/validate_beacon_blocks.go index 5016ddfe670a..cb224df4da18 100644 --- a/beacon-chain/sync/validate_beacon_blocks.go +++ b/beacon-chain/sync/validate_beacon_blocks.go @@ -71,10 +71,11 @@ func (s *Service) validateBeaconBlockPubSub(ctx context.Context, pid peer.ID, ms headState, err := s.cfg.chain.HeadStateReadOnly(ctx) if err != nil { - return pubsub.ValidationIgnore, err + log.WithError(err).Error("could not get head state") } if err = blocks.VerifyBlockSignatureUsingCurrentFork(headState, blk); err != nil { - return pubsub.ValidationReject, err + log.WithError(err).Error("could not verify signature") + } s.insertProposerIndexCache(blk.Block().Slot(), blk.Block().ProposerIndex()) From 12990b8fa21763da7e607025ab72d9d23ce90970 Mon Sep 17 00:00:00 2001 From: terence tsao Date: Wed, 26 Apr 2023 09:14:51 -0700 Subject: [PATCH 7/7] Don't return validation status --- beacon-chain/sync/validate_beacon_blocks.go | 23 ++++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/beacon-chain/sync/validate_beacon_blocks.go b/beacon-chain/sync/validate_beacon_blocks.go index cb224df4da18..c16e3e28864f 100644 --- a/beacon-chain/sync/validate_beacon_blocks.go +++ b/beacon-chain/sync/validate_beacon_blocks.go @@ -69,15 +69,9 @@ func (s *Service) validateBeaconBlockPubSub(ctx context.Context, pid peer.ID, ms return pubsub.ValidationReject, errors.New("block.Block is nil") } - headState, err := s.cfg.chain.HeadStateReadOnly(ctx) - if err != nil { - log.WithError(err).Error("could not get head state") + if err := s.verifySignatureAndInsertProposerIndex(ctx, blk); err != nil { + log.WithError(err).Error("could not verify sig and insert proposer index") } - if err = blocks.VerifyBlockSignatureUsingCurrentFork(headState, blk); err != nil { - log.WithError(err).Error("could not verify signature") - - } - s.insertProposerIndexCache(blk.Block().Slot(), blk.Block().ProposerIndex()) // Broadcast the block on a feed to notify other services in the beacon node // of a received block (even if it does not process correctly through a state transition). @@ -395,6 +389,19 @@ func getBlockFields(b interfaces.ReadOnlySignedBeaconBlock) logrus.Fields { } } +func (s *Service) verifySignatureAndInsertProposerIndex(ctx context.Context, blk interfaces.ReadOnlySignedBeaconBlock) error { + headState, err := s.cfg.chain.HeadStateReadOnly(ctx) + if err != nil { + return err + } + if err = blocks.VerifyBlockSignatureUsingCurrentFork(headState, blk); err != nil { + return err + } + + s.insertProposerIndexCache(blk.Block().Slot(), blk.Block().ProposerIndex()) + return nil +} + func (s *Service) insertProposerIndexCache(slot primitives.Slot, proposerIdx primitives.ValidatorIndex) { if s.seenProposerIndexCache == nil { return