Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lc p2p #14983

Draft
wants to merge 47 commits into
base: develop
Choose a base branch
from
Draft

Lc p2p #14983

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
7a0862e
Light Client - use the new consensus types (#14549)
rkapka Oct 21, 2024
4e5f72b
Return the correct light client payload proof (#14565)
rkapka Oct 22, 2024
46ae78a
Set fields of wrapped proto object in light client setters (#14573)
rkapka Oct 23, 2024
1a3071f
fix TODOs for events (#14570)
rupam-04 Oct 25, 2024
b7e92dc
align changelog with develop branch
rkapka Oct 26, 2024
59c504d
bzl
rkapka Oct 26, 2024
2242393
LC Updates by Range to read from DB (#14531)
Inspector-Butters Oct 28, 2024
be92c1e
Light Client: Electra finality branch (#14597)
rkapka Nov 2, 2024
d528dbb
fix issue in `CreateDefaultLightClientUpdate` function (#14585)
rupam-04 Nov 3, 2024
ea06554
Set fields of wrapped proto object in light client setters (#14573)
rkapka Oct 23, 2024
ce6388f
Set fields of wrapped proto object in light client setters (#14573)
rkapka Oct 23, 2024
471b0c2
align changelog with develop branch
rkapka Oct 26, 2024
28af3d6
get files from gossip branch
rkapka Oct 26, 2024
6bbdd59
get files from rpc branch
rkapka Oct 26, 2024
0751271
in prog
rkapka Oct 28, 2024
df2bbc8
Revert "Auxiliary commit to revert individual files from fbe143f5635b…
rkapka Oct 31, 2024
95a3bf0
Revert "Auxiliary commit to revert individual files from 19192c68ed1d…
rkapka Oct 31, 2024
aa82d6f
Electra version
rkapka Oct 31, 2024
99dbf1c
fix protos
rkapka Oct 31, 2024
4d60cc3
fix issues
rkapka Oct 31, 2024
ba8578e
poc complete
rkapka Nov 3, 2024
37f2b44
unused ctx
rkapka Nov 3, 2024
0031d64
remove unused structs
rkapka Nov 3, 2024
ca29e37
Beacon API handlers
rkapka Nov 3, 2024
9fdc36b
final changes
rkapka Nov 4, 2024
4e31417
fix some tests
rkapka Nov 4, 2024
79ec529
save update
Inspector-Butters Nov 4, 2024
a64a739
save update
Inspector-Butters Nov 4, 2024
21aa9bf
fix events
rkapka Nov 5, 2024
fa63182
debugging help
rkapka Nov 5, 2024
d393667
move create lc bootstrap to core
Inspector-Butters Nov 5, 2024
97df300
bootstrap db
Inspector-Butters Nov 5, 2024
852b022
save bootstrap
Inspector-Butters Nov 5, 2024
cd69603
Merge remote-tracking branch 'bastin/save-updates' into lc-p2p
rkapka Nov 6, 2024
9d70436
debugging
rkapka Nov 6, 2024
54f51df
bootstrp and updatesByRange working
rkapka Nov 6, 2024
9a0dcb6
rpc fork digest
rkapka Nov 7, 2024
64381ce
broadcasting
rkapka Nov 7, 2024
5a2d0c7
more logs and no rate limiting
rkapka Nov 8, 2024
cf42ce3
Merge branch '__develop' into lc-p2p
rkapka Dec 13, 2024
f96f4a0
post-merge cleanup
rkapka Dec 13, 2024
b957dec
set ValidatorData
rkapka Dec 18, 2024
bbbd4e8
debugging panic
rkapka Dec 19, 2024
81b399f
set proto as ValidatroData
rkapka Dec 20, 2024
08b3c4f
use correct type in subscribers
rkapka Dec 20, 2024
139807d
post-rebase fixes
rkapka Jan 9, 2025
e8e1239
small improvements
rkapka Jan 9, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions beacon-chain/blockchain/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ go_library(
"//beacon-chain/forkchoice:go_default_library",
"//beacon-chain/forkchoice/doubly-linked-tree:go_default_library",
"//beacon-chain/forkchoice/types:go_default_library",
"//beacon-chain/light-client:go_default_library",
"//beacon-chain/operations/attestations:go_default_library",
"//beacon-chain/operations/blstoexec:go_default_library",
"//beacon-chain/operations/slashings:go_default_library",
Expand Down
8 changes: 8 additions & 0 deletions beacon-chain/blockchain/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/prysmaticlabs/prysm/v5/beacon-chain/db/filesystem"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/execution"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/forkchoice"
light_client "github.com/prysmaticlabs/prysm/v5/beacon-chain/light-client"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/operations/attestations"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/operations/blstoexec"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/operations/slashings"
Expand Down Expand Up @@ -213,3 +214,10 @@ func WithSyncChecker(checker Checker) Option {
return nil
}
}

func WithLightClientStore(lcs *light_client.Store) Option {
return func(s *Service) error {
s.lcStore = lcs
return nil
}
}
47 changes: 43 additions & 4 deletions beacon-chain/blockchain/process_block_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@ import (
"strings"
"time"

lightclient "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/light-client"

"github.com/ethereum/go-ethereum/common"
"github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/feed"
statefeed "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/feed/state"
lightclient "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/light-client"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/transition"
doublylinkedtree "github.com/prysmaticlabs/prysm/v5/beacon-chain/forkchoice/doubly-linked-tree"
forkchoicetypes "github.com/prysmaticlabs/prysm/v5/beacon-chain/forkchoice/types"
Expand Down Expand Up @@ -262,15 +261,47 @@ func (s *Service) processLightClientFinalityUpdate(
attestedBlock,
finalizedBlock,
)

if err != nil {
return errors.Wrap(err, "could not create light client finality update")
}
log.Info("LC: created new finality update post-block")
log.Infof("%v", update)

maxActiveParticipants := update.SyncAggregate().SyncCommitteeBits.Len()
numActiveParticipants := update.SyncAggregate().SyncCommitteeBits.Count()
hasSupermajority := numActiveParticipants*3 >= maxActiveParticipants*2

last := s.lcStore.LastLCFinalityUpdate
if last != nil {
// The finalized_header.beacon.slot is greater than that of all previously forwarded finality_updates,
// or it matches the highest previously forwarded slot and also has a sync_aggregate indicating supermajority (> 2/3)
// sync committee participation while the previously forwarded finality_update for that slot did not indicate supermajority
slot := last.FinalizedHeader().Beacon().Slot
lastMaxActiveParticipants := last.SyncAggregate().SyncCommitteeBits.Len()
lastNumActiveParticipants := last.SyncAggregate().SyncCommitteeBits.Count()
lastHasSupermajority := lastNumActiveParticipants*3 >= lastMaxActiveParticipants*2

if update.FinalizedHeader().Beacon().Slot < slot {
return nil
}
if update.FinalizedHeader().Beacon().Slot == slot && (lastHasSupermajority || !hasSupermajority) {
return nil
}
}

log.Info("LC: storing new finality update post-block")
log.Infof("%v", update)
s.lcStore.LastLCFinalityUpdate = update

if err = s.cfg.P2p.BroadcastLightClientFinalityUpdate(ctx, update); err != nil {
return errors.Wrap(err, "could not broadcast light client finality update")
}

s.cfg.StateNotifier.StateFeed().Send(&feed.Event{
Type: statefeed.LightClientFinalityUpdate,
Data: update,
})

return nil
}

Expand All @@ -294,7 +325,6 @@ func (s *Service) processLightClientOptimisticUpdate(ctx context.Context, signed
attestedState,
attestedBlock,
)

if err != nil {
if strings.Contains(err.Error(), lightclient.ErrNotEnoughSyncCommitteeBits) {
log.WithError(err).Debug("Skipping processing light client optimistic update")
Expand All @@ -303,6 +333,15 @@ func (s *Service) processLightClientOptimisticUpdate(ctx context.Context, signed
return errors.Wrap(err, "could not create light client optimistic update")
}

last := s.lcStore.LastLCOptimisticUpdate
if last != nil {
// The attested_header.beacon.slot is greater than that of all previously forwarded optimistic_updates
if update.AttestedHeader().Beacon().Slot <= last.AttestedHeader().Beacon().Slot {
return nil
}
log.Debug("Skipping processing light client optimistic update because attested header's slot is not newer")
}

s.cfg.StateNotifier.StateFeed().Send(&feed.Event{
Type: statefeed.LightClientOptimisticUpdate,
Data: update,
Expand Down
2 changes: 2 additions & 0 deletions beacon-chain/blockchain/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"github.com/prysmaticlabs/prysm/v5/beacon-chain/execution"
f "github.com/prysmaticlabs/prysm/v5/beacon-chain/forkchoice"
forkchoicetypes "github.com/prysmaticlabs/prysm/v5/beacon-chain/forkchoice/types"
light_client "github.com/prysmaticlabs/prysm/v5/beacon-chain/light-client"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/operations/attestations"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/operations/blstoexec"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/operations/slashings"
Expand Down Expand Up @@ -65,6 +66,7 @@ type Service struct {
blobNotifiers *blobNotifierMap
blockBeingSynced *currentlySyncingBlock
blobStorage *filesystem.BlobStorage
lcStore *light_client.Store
}

// config options for the service.
Expand Down
9 changes: 9 additions & 0 deletions beacon-chain/light-client/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
load("@prysm//tools/go:def.bzl", "go_library")

go_library(
name = "go_default_library",
srcs = ["store.go"],
importpath = "github.com/prysmaticlabs/prysm/v5/beacon-chain/light-client",
visibility = ["//visibility:public"],
deps = ["//consensus-types/interfaces:go_default_library"],
)
10 changes: 10 additions & 0 deletions beacon-chain/light-client/store.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package light_client

import (
"github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces"
)

type Store struct {
LastLCFinalityUpdate interfaces.LightClientFinalityUpdate
LastLCOptimisticUpdate interfaces.LightClientOptimisticUpdate
}
1 change: 1 addition & 0 deletions beacon-chain/node/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ go_library(
"//beacon-chain/execution:go_default_library",
"//beacon-chain/forkchoice:go_default_library",
"//beacon-chain/forkchoice/doubly-linked-tree:go_default_library",
"//beacon-chain/light-client:go_default_library",
"//beacon-chain/monitor:go_default_library",
"//beacon-chain/node/registration:go_default_library",
"//beacon-chain/operations/attestations:go_default_library",
Expand Down
6 changes: 6 additions & 0 deletions beacon-chain/node/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import (
"github.com/prysmaticlabs/prysm/v5/beacon-chain/execution"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/forkchoice"
doublylinkedtree "github.com/prysmaticlabs/prysm/v5/beacon-chain/forkchoice/doubly-linked-tree"
light_client "github.com/prysmaticlabs/prysm/v5/beacon-chain/light-client"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/monitor"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/node/registration"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/operations/attestations"
Expand Down Expand Up @@ -121,6 +122,7 @@ type BeaconNode struct {
BlobStorageOptions []filesystem.BlobStorageOption
verifyInitWaiter *verification.InitializerWaiter
syncChecker *initialsync.SyncChecker
lcStore *light_client.Store
}

// New creates a new node instance, sets up configuration options, and registers
Expand Down Expand Up @@ -158,6 +160,7 @@ func New(cliCtx *cli.Context, cancel context.CancelFunc, opts ...Option) (*Beaco
serviceFlagOpts: &serviceFlagOpts{},
initialSyncComplete: make(chan struct{}),
syncChecker: &initialsync.SyncChecker{},
lcStore: &light_client.Store{},
}

for _, opt := range opts {
Expand Down Expand Up @@ -752,6 +755,7 @@ func (b *BeaconNode) registerBlockchainService(fc forkchoice.ForkChoicer, gs *st
blockchain.WithTrackedValidatorsCache(b.trackedValidatorsCache),
blockchain.WithPayloadIDCache(b.payloadIDCache),
blockchain.WithSyncChecker(b.syncChecker),
blockchain.WithLightClientStore(b.lcStore),
)

blockchainService, err := blockchain.NewService(b.ctx, opts...)
Expand Down Expand Up @@ -836,6 +840,7 @@ func (b *BeaconNode) registerSyncService(initialSyncComplete chan struct{}, bFil
regularsync.WithBlobStorage(b.BlobStorage),
regularsync.WithVerifierWaiter(b.verifyInitWaiter),
regularsync.WithAvailableBlocker(bFillStore),
regularsync.WithLightClientStore(b.lcStore),
)
return b.services.RegisterService(rs)
}
Expand Down Expand Up @@ -982,6 +987,7 @@ func (b *BeaconNode) registerRPCService(router *http.ServeMux) error {
BlobStorage: b.BlobStorage,
TrackedValidatorsCache: b.trackedValidatorsCache,
PayloadIDCache: b.payloadIDCache,
LCStore: b.lcStore,
})

return b.services.RegisterService(rpcService)
Expand Down
1 change: 1 addition & 0 deletions beacon-chain/p2p/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ go_library(
"//cmd/beacon-chain/flags:go_default_library",
"//config/features:go_default_library",
"//config/params:go_default_library",
"//consensus-types/interfaces:go_default_library",
"//consensus-types/primitives:go_default_library",
"//consensus-types/wrapper:go_default_library",
"//container/leaky-bucket:go_default_library",
Expand Down
59 changes: 59 additions & 0 deletions beacon-chain/p2p/broadcaster.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@ import (
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/altair"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/helpers"
"github.com/prysmaticlabs/prysm/v5/config/params"
"github.com/prysmaticlabs/prysm/v5/consensus-types/interfaces"
"github.com/prysmaticlabs/prysm/v5/crypto/hash"
"github.com/prysmaticlabs/prysm/v5/monitoring/tracing"
"github.com/prysmaticlabs/prysm/v5/monitoring/tracing/trace"
"github.com/prysmaticlabs/prysm/v5/network/forks"
ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
"github.com/prysmaticlabs/prysm/v5/time/slots"
"github.com/sirupsen/logrus"
Expand Down Expand Up @@ -268,6 +270,63 @@ func (s *Service) internalBroadcastBlob(ctx context.Context, subnet uint64, blob
}
}

func (s *Service) BroadcastLightClientOptimisticUpdate(ctx context.Context, update interfaces.LightClientOptimisticUpdate) error {
ctx, span := trace.StartSpan(ctx, "p2p.BroadcastLightClientOptimisticUpdate")
defer span.End()

log.Info("LC: broadcasting optimistic update")

forkDigest, err := forks.ForkDigestFromEpoch(slots.ToEpoch(update.AttestedHeader().Beacon().Slot), s.genesisValidatorsRoot)
if err != nil {
err := errors.Wrap(err, "could not retrieve fork digest")
tracing.AnnotateError(span, err)
log.WithError(err).Error("forks.ForkDigestFromEpoch")
return err
}
topic, ok := GossipTypeMapping[reflect.TypeOf(update.Proto())]
if !ok {
tracing.AnnotateError(span, ErrMessageNotMapped)
log.Error("GossipTypeMapping")
return ErrMessageNotMapped
}
if err = s.broadcastObject(ctx, update, fmt.Sprintf(topic, forkDigest)); err != nil {
log.WithError(err).Error("s.broadcastObject")
tracing.AnnotateError(span, err)
}

log.Info("LC: successfully broadcast optimistic update")

return nil
}

func (s *Service) BroadcastLightClientFinalityUpdate(ctx context.Context, update interfaces.LightClientFinalityUpdate) error {
ctx, span := trace.StartSpan(ctx, "p2p.BroadcastLightClientFinalityUpdate")
defer span.End()

log.Info("LC: broadcasting finality update")

forkDigest, err := forks.ForkDigestFromEpoch(slots.ToEpoch(update.AttestedHeader().Beacon().Slot), s.genesisValidatorsRoot)
if err != nil {
err := errors.Wrap(err, "could not retrieve fork digest")
tracing.AnnotateError(span, err)
log.WithError(err).Error("forks.ForkDigestFromEpoch")
return err
}
topic, ok := GossipTypeMapping[reflect.TypeOf(update.Proto())]
if !ok {
tracing.AnnotateError(span, ErrMessageNotMapped)
return ErrMessageNotMapped
}
if err = s.broadcastObject(ctx, update, fmt.Sprintf(topic, forkDigest)); err != nil {
log.WithError(err).Error("s.broadcastObject")
tracing.AnnotateError(span, err)
}

log.Info("LC: successfully broadcast finality update")

return nil
}

// method to broadcast messages to other peers in our gossip mesh.
func (s *Service) broadcastObject(ctx context.Context, obj ssz.Marshaler, topic string) error {
ctx, span := trace.StartSpan(ctx, "p2p.broadcastObject")
Expand Down
54 changes: 54 additions & 0 deletions beacon-chain/p2p/gossip_scoring_params.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ const (
// blsToExecutionChangeWeight specifies the scoring weight that we apply to
// our bls to execution topic.
blsToExecutionChangeWeight = 0.05
// lightClientFinalityUpdateWeight specifies the scoring weight that we apply to
// our light client finality update topic.
lightClientFinalityUpdateWeight = 0.05
// lightClientOptimisticUpdateWeight specifies the scoring weight that we apply to
// our light client optimistic update topic.
lightClientOptimisticUpdateWeight = 0.05

// maxInMeshScore describes the max score a peer can attain from being in the mesh.
maxInMeshScore = 10
Expand Down Expand Up @@ -124,6 +130,10 @@ func (s *Service) topicScoreParams(topic string) (*pubsub.TopicScoreParams, erro
case strings.Contains(topic, GossipBlobSidecarMessage):
// TODO(Deneb): Using the default block scoring. But this should be updated.
return defaultBlockTopicParams(), nil
case strings.Contains(topic, GossipLightClientFinalityUpdateMessage):
return defaultLightClientFinalityUpdateTopicParams(), nil
case strings.Contains(topic, GossipLightClientOptimisticUpdateMessage):
return defaultLightClientOptimisticUpdateTopicParams(), nil
default:
return nil, errors.Errorf("unrecognized topic provided for parameter registration: %s", topic)
}
Expand Down Expand Up @@ -503,6 +513,50 @@ func defaultBlsToExecutionChangeTopicParams() *pubsub.TopicScoreParams {
}
}

func defaultLightClientFinalityUpdateTopicParams() *pubsub.TopicScoreParams {
return &pubsub.TopicScoreParams{
TopicWeight: lightClientFinalityUpdateWeight,
TimeInMeshWeight: maxInMeshScore / inMeshCap(),
TimeInMeshQuantum: inMeshTime(),
TimeInMeshCap: inMeshCap(),
FirstMessageDeliveriesWeight: 2,
FirstMessageDeliveriesDecay: scoreDecay(oneHundredEpochs),
FirstMessageDeliveriesCap: 5,
MeshMessageDeliveriesWeight: 0,
MeshMessageDeliveriesDecay: 0,
MeshMessageDeliveriesCap: 0,
MeshMessageDeliveriesThreshold: 0,
MeshMessageDeliveriesWindow: 0,
MeshMessageDeliveriesActivation: 0,
MeshFailurePenaltyWeight: 0,
MeshFailurePenaltyDecay: 0,
InvalidMessageDeliveriesWeight: -2000,
InvalidMessageDeliveriesDecay: scoreDecay(invalidDecayPeriod),
}
}

func defaultLightClientOptimisticUpdateTopicParams() *pubsub.TopicScoreParams {
return &pubsub.TopicScoreParams{
TopicWeight: lightClientOptimisticUpdateWeight,
TimeInMeshWeight: maxInMeshScore / inMeshCap(),
TimeInMeshQuantum: inMeshTime(),
TimeInMeshCap: inMeshCap(),
FirstMessageDeliveriesWeight: 2,
FirstMessageDeliveriesDecay: scoreDecay(oneHundredEpochs),
FirstMessageDeliveriesCap: 5,
MeshMessageDeliveriesWeight: 0,
MeshMessageDeliveriesDecay: 0,
MeshMessageDeliveriesCap: 0,
MeshMessageDeliveriesThreshold: 0,
MeshMessageDeliveriesWindow: 0,
MeshMessageDeliveriesActivation: 0,
MeshFailurePenaltyWeight: 0,
MeshFailurePenaltyDecay: 0,
InvalidMessageDeliveriesWeight: -2000,
InvalidMessageDeliveriesDecay: scoreDecay(invalidDecayPeriod),
}
}

func oneSlotDuration() time.Duration {
return time.Duration(params.BeaconConfig().SecondsPerSlot) * time.Second
}
Expand Down
Loading