mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-09 15:37:56 -05:00
Turn on lc gossip (#15220)
* add and pass lcstore to sync service * validator for optimistic updates * validator for finality updates * subscribers * gossip scorings * tmp - add validation test * optimistic update validation tests * finality update validation tests * tests for subscribers * deps * changelog entry * play around with config cleanup * turn on gossip * add logs * fix typo * mock p2p * deps * better logs * turn on gossip * add logs * fix typo * update geth v1.15.9 (#15216) * Update go-ethereum to v1.15.9 * Fix go-ethereum secp256k1 build after https://github.com/ethereum/go-ethereum/pull/31242 * Fix Ping API change * Changelog fragment * mock p2p * deps * fix merge problems * changelog entry * Update broadcaster.go Co-authored-by: Radosław Kapka <rkapka@wp.pl> * Update broadcaster.go Co-authored-by: Radosław Kapka <rkapka@wp.pl> --------- Co-authored-by: Preston Van Loon <pvanloon@offchainlabs.com> Co-authored-by: Radosław Kapka <rkapka@wp.pl>
This commit is contained in:
@@ -163,6 +163,7 @@ go_test(
|
|||||||
"//beacon-chain/operations/slashings:go_default_library",
|
"//beacon-chain/operations/slashings:go_default_library",
|
||||||
"//beacon-chain/operations/voluntaryexits:go_default_library",
|
"//beacon-chain/operations/voluntaryexits:go_default_library",
|
||||||
"//beacon-chain/p2p:go_default_library",
|
"//beacon-chain/p2p:go_default_library",
|
||||||
|
"//beacon-chain/p2p/testing:go_default_library",
|
||||||
"//beacon-chain/startup:go_default_library",
|
"//beacon-chain/startup:go_default_library",
|
||||||
"//beacon-chain/state:go_default_library",
|
"//beacon-chain/state:go_default_library",
|
||||||
"//beacon-chain/state/state-native:go_default_library",
|
"//beacon-chain/state/state-native:go_default_library",
|
||||||
|
|||||||
@@ -309,6 +309,11 @@ func (s *Service) processLightClientFinalityUpdate(
|
|||||||
Type: statefeed.LightClientFinalityUpdate,
|
Type: statefeed.LightClientFinalityUpdate,
|
||||||
Data: newUpdate,
|
Data: newUpdate,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if err = s.cfg.P2p.BroadcastLightClientFinalityUpdate(ctx, newUpdate); err != nil {
|
||||||
|
return errors.Wrap(err, "could not broadcast light client finality update")
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,6 +363,10 @@ func (s *Service) processLightClientOptimisticUpdate(ctx context.Context, signed
|
|||||||
Data: newUpdate,
|
Data: newUpdate,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if err = s.cfg.P2p.BroadcastLightClientOptimisticUpdate(ctx, newUpdate); err != nil {
|
||||||
|
return errors.Wrap(err, "could not broadcast light client optimistic update")
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import (
|
|||||||
doublylinkedtree "github.com/OffchainLabs/prysm/v6/beacon-chain/forkchoice/doubly-linked-tree"
|
doublylinkedtree "github.com/OffchainLabs/prysm/v6/beacon-chain/forkchoice/doubly-linked-tree"
|
||||||
forkchoicetypes "github.com/OffchainLabs/prysm/v6/beacon-chain/forkchoice/types"
|
forkchoicetypes "github.com/OffchainLabs/prysm/v6/beacon-chain/forkchoice/types"
|
||||||
"github.com/OffchainLabs/prysm/v6/beacon-chain/operations/attestations/kv"
|
"github.com/OffchainLabs/prysm/v6/beacon-chain/operations/attestations/kv"
|
||||||
|
mockp2p "github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/testing"
|
||||||
"github.com/OffchainLabs/prysm/v6/beacon-chain/state"
|
"github.com/OffchainLabs/prysm/v6/beacon-chain/state"
|
||||||
"github.com/OffchainLabs/prysm/v6/config/features"
|
"github.com/OffchainLabs/prysm/v6/config/features"
|
||||||
fieldparams "github.com/OffchainLabs/prysm/v6/config/fieldparams"
|
fieldparams "github.com/OffchainLabs/prysm/v6/config/fieldparams"
|
||||||
@@ -3309,6 +3310,7 @@ func TestProcessLightClientOptimisticUpdate(t *testing.T) {
|
|||||||
params.OverrideBeaconConfig(beaconCfg)
|
params.OverrideBeaconConfig(beaconCfg)
|
||||||
|
|
||||||
s, tr := minimalTestService(t)
|
s, tr := minimalTestService(t)
|
||||||
|
s.cfg.P2p = &mockp2p.FakeP2P{}
|
||||||
ctx := tr.ctx
|
ctx := tr.ctx
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
@@ -3444,6 +3446,7 @@ func TestProcessLightClientFinalityUpdate(t *testing.T) {
|
|||||||
params.OverrideBeaconConfig(beaconCfg)
|
params.OverrideBeaconConfig(beaconCfg)
|
||||||
|
|
||||||
s, tr := minimalTestService(t)
|
s, tr := minimalTestService(t)
|
||||||
|
s.cfg.P2p = &mockp2p.FakeP2P{}
|
||||||
ctx := tr.ctx
|
ctx := tr.ctx
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import (
|
|||||||
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p"
|
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p"
|
||||||
"github.com/OffchainLabs/prysm/v6/beacon-chain/startup"
|
"github.com/OffchainLabs/prysm/v6/beacon-chain/startup"
|
||||||
"github.com/OffchainLabs/prysm/v6/beacon-chain/state/stategen"
|
"github.com/OffchainLabs/prysm/v6/beacon-chain/state/stategen"
|
||||||
|
"github.com/OffchainLabs/prysm/v6/consensus-types/interfaces"
|
||||||
ethpb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1"
|
ethpb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1"
|
||||||
"github.com/OffchainLabs/prysm/v6/testing/require"
|
"github.com/OffchainLabs/prysm/v6/testing/require"
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
@@ -66,6 +67,16 @@ func (mb *mockBroadcaster) BroadcastBlob(_ context.Context, _ uint64, _ *ethpb.B
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (mb *mockBroadcaster) BroadcastLightClientOptimisticUpdate(_ context.Context, _ interfaces.LightClientOptimisticUpdate) error {
|
||||||
|
mb.broadcastCalled = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (mb *mockBroadcaster) BroadcastLightClientFinalityUpdate(_ context.Context, _ interfaces.LightClientFinalityUpdate) error {
|
||||||
|
mb.broadcastCalled = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (mb *mockBroadcaster) BroadcastBLSChanges(_ context.Context, _ []*ethpb.SignedBLSToExecutionChange) {
|
func (mb *mockBroadcaster) BroadcastBLSChanges(_ context.Context, _ []*ethpb.SignedBLSToExecutionChange) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -285,13 +285,13 @@ func (s *Service) BroadcastLightClientOptimisticUpdate(ctx context.Context, upda
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: should we check if the update is too early or too late to broadcast?
|
|
||||||
|
|
||||||
if err := s.broadcastObject(ctx, update, lcOptimisticToTopic(forkDigest)); err != nil {
|
if err := s.broadcastObject(ctx, update, lcOptimisticToTopic(forkDigest)); err != nil {
|
||||||
|
log.WithError(err).Debug("Failed to broadcast light client optimistic update")
|
||||||
err := errors.Wrap(err, "could not publish message")
|
err := errors.Wrap(err, "could not publish message")
|
||||||
tracing.AnnotateError(span, err)
|
tracing.AnnotateError(span, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
log.Debug("Successfully broadcast light client optimistic update")
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -311,13 +311,13 @@ func (s *Service) BroadcastLightClientFinalityUpdate(ctx context.Context, update
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: should we check if the update is too early or too late to broadcast?
|
|
||||||
|
|
||||||
if err := s.broadcastObject(ctx, update, lcFinalityToTopic(forkDigest)); err != nil {
|
if err := s.broadcastObject(ctx, update, lcFinalityToTopic(forkDigest)); err != nil {
|
||||||
|
log.WithError(err).Debug("Failed to broadcast light client finality update")
|
||||||
err := errors.Wrap(err, "could not publish message")
|
err := errors.Wrap(err, "could not publish message")
|
||||||
tracing.AnnotateError(span, err)
|
tracing.AnnotateError(span, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
log.Debug("Successfully broadcast light client finality update")
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
|
|
||||||
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/encoder"
|
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/encoder"
|
||||||
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/peers"
|
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/peers"
|
||||||
|
"github.com/OffchainLabs/prysm/v6/consensus-types/interfaces"
|
||||||
ethpb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1"
|
ethpb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1"
|
||||||
"github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1/metadata"
|
"github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1/metadata"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enr"
|
"github.com/ethereum/go-ethereum/p2p/enr"
|
||||||
@@ -36,6 +37,8 @@ type Broadcaster interface {
|
|||||||
BroadcastAttestation(ctx context.Context, subnet uint64, att ethpb.Att) error
|
BroadcastAttestation(ctx context.Context, subnet uint64, att ethpb.Att) error
|
||||||
BroadcastSyncCommitteeMessage(ctx context.Context, subnet uint64, sMsg *ethpb.SyncCommitteeMessage) error
|
BroadcastSyncCommitteeMessage(ctx context.Context, subnet uint64, sMsg *ethpb.SyncCommitteeMessage) error
|
||||||
BroadcastBlob(ctx context.Context, subnet uint64, blob *ethpb.BlobSidecar) error
|
BroadcastBlob(ctx context.Context, subnet uint64, blob *ethpb.BlobSidecar) error
|
||||||
|
BroadcastLightClientOptimisticUpdate(ctx context.Context, update interfaces.LightClientOptimisticUpdate) error
|
||||||
|
BroadcastLightClientFinalityUpdate(ctx context.Context, update interfaces.LightClientFinalityUpdate) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetStreamHandler configures p2p to handle streams of a certain topic ID.
|
// SetStreamHandler configures p2p to handle streams of a certain topic ID.
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ go_library(
|
|||||||
"//beacon-chain/p2p/encoder:go_default_library",
|
"//beacon-chain/p2p/encoder:go_default_library",
|
||||||
"//beacon-chain/p2p/peers:go_default_library",
|
"//beacon-chain/p2p/peers:go_default_library",
|
||||||
"//beacon-chain/p2p/peers/scorers:go_default_library",
|
"//beacon-chain/p2p/peers/scorers:go_default_library",
|
||||||
|
"//consensus-types/interfaces:go_default_library",
|
||||||
"//proto/prysm/v1alpha1:go_default_library",
|
"//proto/prysm/v1alpha1:go_default_library",
|
||||||
"//proto/prysm/v1alpha1/metadata:go_default_library",
|
"//proto/prysm/v1alpha1/metadata:go_default_library",
|
||||||
"//testing/require:go_default_library",
|
"//testing/require:go_default_library",
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
|
|
||||||
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/encoder"
|
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/encoder"
|
||||||
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/peers"
|
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/peers"
|
||||||
|
"github.com/OffchainLabs/prysm/v6/consensus-types/interfaces"
|
||||||
ethpb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1"
|
ethpb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1"
|
||||||
"github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1/metadata"
|
"github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1/metadata"
|
||||||
"github.com/ethereum/go-ethereum/p2p/enr"
|
"github.com/ethereum/go-ethereum/p2p/enr"
|
||||||
@@ -148,6 +149,16 @@ func (*FakeP2P) BroadcastBlob(_ context.Context, _ uint64, _ *ethpb.BlobSidecar)
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BroadcastLightClientOptimisticUpdate -- fake.
|
||||||
|
func (*FakeP2P) BroadcastLightClientOptimisticUpdate(_ context.Context, _ interfaces.LightClientOptimisticUpdate) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// BroadcastLightClientFinalityUpdate -- fake.
|
||||||
|
func (*FakeP2P) BroadcastLightClientFinalityUpdate(_ context.Context, _ interfaces.LightClientFinalityUpdate) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// InterceptPeerDial -- fake.
|
// InterceptPeerDial -- fake.
|
||||||
func (*FakeP2P) InterceptPeerDial(peer.ID) (allow bool) {
|
func (*FakeP2P) InterceptPeerDial(peer.ID) (allow bool) {
|
||||||
return true
|
return true
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
|
||||||
|
"github.com/OffchainLabs/prysm/v6/consensus-types/interfaces"
|
||||||
ethpb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1"
|
ethpb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1"
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
)
|
)
|
||||||
@@ -48,6 +49,18 @@ func (m *MockBroadcaster) BroadcastBlob(context.Context, uint64, *ethpb.BlobSide
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BroadcastLightClientOptimisticUpdate records a broadcast occurred.
|
||||||
|
func (m *MockBroadcaster) BroadcastLightClientOptimisticUpdate(_ context.Context, _ interfaces.LightClientOptimisticUpdate) error {
|
||||||
|
m.BroadcastCalled.Store(true)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// BroadcastLightClientFinalityUpdate records a broadcast occurred.
|
||||||
|
func (m *MockBroadcaster) BroadcastLightClientFinalityUpdate(_ context.Context, _ interfaces.LightClientFinalityUpdate) error {
|
||||||
|
m.BroadcastCalled.Store(true)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// NumMessages returns the number of messages broadcasted.
|
// NumMessages returns the number of messages broadcasted.
|
||||||
func (m *MockBroadcaster) NumMessages() int {
|
func (m *MockBroadcaster) NumMessages() int {
|
||||||
m.msgLock.Lock()
|
m.msgLock.Lock()
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import (
|
|||||||
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/encoder"
|
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/encoder"
|
||||||
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/peers"
|
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/peers"
|
||||||
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/peers/scorers"
|
"github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/peers/scorers"
|
||||||
|
"github.com/OffchainLabs/prysm/v6/consensus-types/interfaces"
|
||||||
ethpb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1"
|
ethpb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1"
|
||||||
"github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1/metadata"
|
"github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1/metadata"
|
||||||
"github.com/OffchainLabs/prysm/v6/testing/require"
|
"github.com/OffchainLabs/prysm/v6/testing/require"
|
||||||
@@ -207,6 +208,18 @@ func (p *TestP2P) BroadcastBlob(context.Context, uint64, *ethpb.BlobSidecar) err
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BroadcastLightClientOptimisticUpdate broadcasts an optimistic update for mock.
|
||||||
|
func (p *TestP2P) BroadcastLightClientOptimisticUpdate(_ context.Context, _ interfaces.LightClientOptimisticUpdate) error {
|
||||||
|
p.BroadcastCalled.Store(true)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// BroadcastLightClientFinalityUpdate broadcasts a finality update for mock.
|
||||||
|
func (p *TestP2P) BroadcastLightClientFinalityUpdate(_ context.Context, _ interfaces.LightClientFinalityUpdate) error {
|
||||||
|
p.BroadcastCalled.Store(true)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// SetStreamHandler for RPC.
|
// SetStreamHandler for RPC.
|
||||||
func (p *TestP2P) SetStreamHandler(topic string, handler network.StreamHandler) {
|
func (p *TestP2P) SetStreamHandler(topic string, handler network.StreamHandler) {
|
||||||
p.BHost.SetStreamHandler(protocol.ID(topic), handler)
|
p.BHost.SetStreamHandler(protocol.ID(topic), handler)
|
||||||
|
|||||||
@@ -133,6 +133,20 @@ func (s *Service) registerSubscribers(epoch primitives.Epoch, digest [4]byte) {
|
|||||||
s.activeSyncSubnetIndices,
|
s.activeSyncSubnetIndices,
|
||||||
func(currentSlot primitives.Slot) []uint64 { return []uint64{} },
|
func(currentSlot primitives.Slot) []uint64 { return []uint64{} },
|
||||||
)
|
)
|
||||||
|
if features.Get().EnableLightClient {
|
||||||
|
s.subscribe(
|
||||||
|
p2p.LightClientOptimisticUpdateTopicFormat,
|
||||||
|
s.validateLightClientOptimisticUpdate,
|
||||||
|
s.lightClientOptimisticUpdateSubscriber,
|
||||||
|
digest,
|
||||||
|
)
|
||||||
|
s.subscribe(
|
||||||
|
p2p.LightClientFinalityUpdateTopicFormat,
|
||||||
|
s.validateLightClientFinalityUpdate,
|
||||||
|
s.lightClientFinalityUpdateSubscriber,
|
||||||
|
digest,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// New gossip topic in Capella
|
// New gossip topic in Capella
|
||||||
|
|||||||
3
changelog/bastin_enable-light-client-gossip.md
Normal file
3
changelog/bastin_enable-light-client-gossip.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
### Added
|
||||||
|
|
||||||
|
- Enable light client gossip for optimistic and finality updates.
|
||||||
Reference in New Issue
Block a user