From 3c463d817153b52fcd551cbcbd07b2684aa58bc7 Mon Sep 17 00:00:00 2001 From: Potuz Date: Sun, 27 Apr 2025 21:00:48 -0300 Subject: [PATCH] Pass dependent roots in block events (#15227) * Pass dependent roots in block events * Check for empty roots --- .../blockchain/process_block_helpers.go | 24 +++++++++++++++---- beacon-chain/core/feed/block/events.go | 6 +++-- beacon-chain/core/feed/state/events.go | 4 ++++ .../rpc/prysm/v1alpha1/validator/blocks.go | 22 ++++++----------- changelog/potuz_pass_roots_in_block_events.md | 3 +++ validator/client/validator.go | 6 +++++ 6 files changed, 43 insertions(+), 22 deletions(-) create mode 100644 changelog/potuz_pass_roots_in_block_events.md diff --git a/beacon-chain/blockchain/process_block_helpers.go b/beacon-chain/blockchain/process_block_helpers.go index d484374394..19cc523a83 100644 --- a/beacon-chain/blockchain/process_block_helpers.go +++ b/beacon-chain/blockchain/process_block_helpers.go @@ -103,15 +103,29 @@ func (s *Service) sendStateFeedOnBlock(cfg *postBlockProcessConfig) { log.WithError(err).Debug("Could not check if block is optimistic") optimistic = true } + currEpoch := slots.ToEpoch(s.CurrentSlot()) + currDependenRoot, err := s.cfg.ForkChoiceStore.DependentRoot(currEpoch) + if err != nil { + log.WithError(err).Debug("Could not get dependent root") + } + prevDependentRoot := [32]byte{} + if currEpoch > 0 { + prevDependentRoot, err = s.cfg.ForkChoiceStore.DependentRoot(currEpoch - 1) + if err != nil { + log.WithError(err).Debug("Could not get previous dependent root") + } + } // Send notification of the processed block to the state feed. s.cfg.StateNotifier.StateFeed().Send(&feed.Event{ Type: statefeed.BlockProcessed, Data: &statefeed.BlockProcessedData{ - Slot: cfg.roblock.Block().Slot(), - BlockRoot: cfg.roblock.Root(), - SignedBlock: cfg.roblock, - Verified: true, - Optimistic: optimistic, + Slot: cfg.roblock.Block().Slot(), + BlockRoot: cfg.roblock.Root(), + SignedBlock: cfg.roblock, + CurrDependentRoot: currDependenRoot, + PrevDependentRoot: prevDependentRoot, + Verified: true, + Optimistic: optimistic, }, }) } diff --git a/beacon-chain/core/feed/block/events.go b/beacon-chain/core/feed/block/events.go index f8c006eefe..a48a763926 100644 --- a/beacon-chain/core/feed/block/events.go +++ b/beacon-chain/core/feed/block/events.go @@ -11,6 +11,8 @@ const ( // ReceivedBlockData is the data sent with ReceivedBlock events. type ReceivedBlockData struct { - SignedBlock interfaces.ReadOnlySignedBeaconBlock - IsOptimistic bool + SignedBlock interfaces.ReadOnlySignedBeaconBlock + CurrDependentRoot [32]byte + PrevDependentRoot [32]byte + IsOptimistic bool } diff --git a/beacon-chain/core/feed/state/events.go b/beacon-chain/core/feed/state/events.go index 2a1a2ccfed..7f0cd02d53 100644 --- a/beacon-chain/core/feed/state/events.go +++ b/beacon-chain/core/feed/state/events.go @@ -43,6 +43,10 @@ type BlockProcessedData struct { BlockRoot [32]byte // SignedBlock is the physical processed block. SignedBlock interfaces.ReadOnlySignedBeaconBlock + // CurrDependentRoot is the current dependent root + CurrDependentRoot [32]byte + // PrevDependentRoot is the previous dependent root + PrevDependentRoot [32]byte // Verified is true if the block's BLS contents have been verified. Verified bool // Optimistic is true if the block is optimistic. diff --git a/beacon-chain/rpc/prysm/v1alpha1/validator/blocks.go b/beacon-chain/rpc/prysm/v1alpha1/validator/blocks.go index 7064065aa4..41470dbeef 100644 --- a/beacon-chain/rpc/prysm/v1alpha1/validator/blocks.go +++ b/beacon-chain/rpc/prysm/v1alpha1/validator/blocks.go @@ -9,7 +9,6 @@ import ( "github.com/OffchainLabs/prysm/v6/consensus-types/primitives" ethpb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1" "github.com/OffchainLabs/prysm/v6/runtime/version" - "github.com/OffchainLabs/prysm/v6/time/slots" "github.com/pkg/errors" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -67,6 +66,7 @@ func (vs *Server) StreamSlots(req *ethpb.StreamSlotsRequest, stream ethpb.Beacon select { case ev := <-ch: var s primitives.Slot + var currDependentRoot, prevDependentRoot [32]byte if req.VerifiedOnly { if ev.Type != statefeed.BlockProcessed { continue @@ -76,6 +76,8 @@ func (vs *Server) StreamSlots(req *ethpb.StreamSlotsRequest, stream ethpb.Beacon continue } s = data.Slot + currDependentRoot = data.CurrDependentRoot + prevDependentRoot = data.PrevDependentRoot } else { if ev.Type != blockfeed.ReceivedBlock { continue @@ -85,24 +87,14 @@ func (vs *Server) StreamSlots(req *ethpb.StreamSlotsRequest, stream ethpb.Beacon continue } s = data.SignedBlock.Block().Slot() - } - currEpoch := slots.ToEpoch(s) - currDepRoot, err := vs.ForkchoiceFetcher.DependentRoot(currEpoch) - if err != nil { - return status.Errorf(codes.Internal, "Could not get dependent root: %v", err) - } - prevDepRoot := currDepRoot - if currEpoch > 0 { - prevDepRoot, err = vs.ForkchoiceFetcher.DependentRoot(currEpoch - 1) - if err != nil { - return status.Errorf(codes.Internal, "Could not get dependent root: %v", err) - } + currDependentRoot = data.CurrDependentRoot + prevDependentRoot = data.PrevDependentRoot } if err := stream.Send( ðpb.StreamSlotsResponse{ Slot: s, - PreviousDutyDependentRoot: prevDepRoot[:], - CurrentDutyDependentRoot: currDepRoot[:], + PreviousDutyDependentRoot: prevDependentRoot[:], + CurrentDutyDependentRoot: currDependentRoot[:], }); err != nil { return status.Errorf(codes.Unavailable, "Could not send over stream: %v", err) } diff --git a/changelog/potuz_pass_roots_in_block_events.md b/changelog/potuz_pass_roots_in_block_events.md new file mode 100644 index 0000000000..8782af7eeb --- /dev/null +++ b/changelog/potuz_pass_roots_in_block_events.md @@ -0,0 +1,3 @@ +### Ignored + +- Add dependent roots in block events. diff --git a/validator/client/validator.go b/validator/client/validator.go index 395c364946..784f789ea5 100644 --- a/validator/client/validator.go +++ b/validator/client/validator.go @@ -1148,6 +1148,9 @@ func (v *validator) checkDependentRoots(ctx context.Context, head *structs.HeadE if err != nil { return errors.Wrap(err, "failed to decode previous duty dependent root") } + if bytes.Equal(prevDepedentRoot, params.BeaconConfig().ZeroHash[:]) { + return nil + } uintSlot, err := strconv.ParseUint(head.Slot, 10, 64) if err != nil { return errors.Wrap(err, "Failed to parse slot") @@ -1169,6 +1172,9 @@ func (v *validator) checkDependentRoots(ctx context.Context, head *structs.HeadE if err != nil { return errors.Wrap(err, "failed to decode current duty dependent root") } + if bytes.Equal(currDepedentRoot, params.BeaconConfig().ZeroHash[:]) { + return nil + } if !bytes.Equal(currDepedentRoot, v.duties.CurrDependentRoot) { if err := v.UpdateDuties(ctx, currEpochStart); err != nil { return errors.Wrap(err, "failed to update duties")