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

Add Metadata V2 Object and Interface #8962

Merged
merged 11 commits into from
Jun 2, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 2 additions & 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(
"//shared/featureconfig:go_default_library",
"//shared/fileutil:go_default_library",
"//shared/hashutil:go_default_library",
"//shared/interfaces:go_default_library",
"//shared/iputils:go_default_library",
"//shared/p2putils:go_default_library",
"//shared/params:go_default_library",
Expand Down Expand Up @@ -139,6 +140,7 @@ go_test(
"//shared/bytesutil:go_default_library",
"//shared/event:go_default_library",
"//shared/hashutil:go_default_library",
"//shared/interfaces:go_default_library",
"//shared/iputils:go_default_library",
"//shared/p2putils:go_default_library",
"//shared/params:go_default_library",
Expand Down
3 changes: 2 additions & 1 deletion beacon-chain/p2p/broadcaster_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
testpb "github.com/prysmaticlabs/prysm/proto/testing"
"github.com/prysmaticlabs/prysm/shared/bytesutil"
"github.com/prysmaticlabs/prysm/shared/interfaces"
"github.com/prysmaticlabs/prysm/shared/testutil"
"github.com/prysmaticlabs/prysm/shared/testutil/assert"
"github.com/prysmaticlabs/prysm/shared/testutil/require"
Expand Down Expand Up @@ -253,7 +254,7 @@ func TestService_BroadcastAttestationWithDiscoveryAttempts(t *testing.T) {
// Set for 2nd peer
if i == 2 {
s.dv5Listener = listener
s.metaData = new(pb.MetaData)
s.metaData = interfaces.WrappedMetadataV0(new(pb.MetaDataV0))
bitV := bitfield.NewBitvector64()
bitV.SetBitAt(subnet, true)
s.updateSubnetRecordWithMetadata(bitV)
Expand Down
5 changes: 3 additions & 2 deletions beacon-chain/p2p/discovery_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
testp2p "github.com/prysmaticlabs/prysm/beacon-chain/p2p/testing"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
"github.com/prysmaticlabs/prysm/shared/bytesutil"
"github.com/prysmaticlabs/prysm/shared/interfaces"
"github.com/prysmaticlabs/prysm/shared/iputils"
"github.com/prysmaticlabs/prysm/shared/testutil/assert"
"github.com/prysmaticlabs/prysm/shared/testutil/require"
Expand Down Expand Up @@ -333,9 +334,9 @@ func addPeer(t *testing.T, p *peers.Status, state peerdata.PeerConnectionState)
require.NoError(t, err)
p.Add(new(enr.Record), id, nil, network.DirInbound)
p.SetConnectionState(id, state)
p.SetMetadata(id, &pb.MetaData{
p.SetMetadata(id, interfaces.WrappedMetadataV0(&pb.MetaDataV0{
SeqNumber: 0,
Attnets: bitfield.NewBitvector64(),
})
}))
return id
}
4 changes: 2 additions & 2 deletions beacon-chain/p2p/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
"github.com/prysmaticlabs/prysm/beacon-chain/p2p/encoder"
"github.com/prysmaticlabs/prysm/beacon-chain/p2p/peers"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
"github.com/prysmaticlabs/prysm/shared/interfaces"
"google.golang.org/protobuf/proto"
)

Expand Down Expand Up @@ -92,6 +92,6 @@ type PeersProvider interface {

// MetadataProvider returns the metadata related information for the local peer.
type MetadataProvider interface {
Metadata() *pb.MetaData
Metadata() interfaces.Metadata
MetadataSeq() uint64
}
3 changes: 2 additions & 1 deletion beacon-chain/p2p/peers/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ go_library(
"//beacon-chain/p2p/peers/peerdata:go_default_library",
"//beacon-chain/p2p/peers/scorers:go_default_library",
"//proto/beacon/p2p/v1:go_default_library",
"//shared/interfaces:go_default_library",
"//shared/params:go_default_library",
"//shared/rand:go_default_library",
"//shared/timeutils:go_default_library",
Expand All @@ -21,7 +22,6 @@ go_library(
"@com_github_multiformats_go_multiaddr//net:go_default_library",
"@com_github_prysmaticlabs_eth2_types//:go_default_library",
"@com_github_prysmaticlabs_go_bitfield//:go_default_library",
"@org_golang_google_protobuf//proto:go_default_library",
],
)

Expand All @@ -39,6 +39,7 @@ go_test(
"//cmd/beacon-chain/flags:go_default_library",
"//proto/beacon/p2p/v1:go_default_library",
"//shared/featureconfig:go_default_library",
"//shared/interfaces:go_default_library",
"//shared/params:go_default_library",
"//shared/testutil/assert:go_default_library",
"//shared/testutil/require:go_default_library",
Expand Down
1 change: 1 addition & 0 deletions beacon-chain/p2p/peers/peerdata/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ go_library(
deps = [
"//proto/beacon/p2p/v1:go_default_library",
"//proto/beacon/rpc/v1:go_default_library",
"//shared/interfaces:go_default_library",
"@com_github_ethereum_go_ethereum//p2p/enr:go_default_library",
"@com_github_libp2p_go_libp2p_core//network:go_default_library",
"@com_github_libp2p_go_libp2p_core//peer:go_default_library",
Expand Down
3 changes: 2 additions & 1 deletion beacon-chain/p2p/peers/peerdata/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
pbrpc "github.com/prysmaticlabs/prysm/proto/beacon/rpc/v1"
"github.com/prysmaticlabs/prysm/shared/interfaces"
)

var (
Expand Down Expand Up @@ -49,7 +50,7 @@ type PeerData struct {
Enr *enr.Record
NextValidTime time.Time
// Chain related data.
MetaData *pb.MetaData
MetaData interfaces.Metadata
ChainState *pb.Status
ChainStateLastUpdated time.Time
ChainStateValidationError error
Expand Down
19 changes: 11 additions & 8 deletions beacon-chain/p2p/peers/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ import (
"github.com/prysmaticlabs/prysm/beacon-chain/p2p/peers/peerdata"
"github.com/prysmaticlabs/prysm/beacon-chain/p2p/peers/scorers"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
"github.com/prysmaticlabs/prysm/shared/interfaces"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/prysmaticlabs/prysm/shared/rand"
"github.com/prysmaticlabs/prysm/shared/timeutils"
"google.golang.org/protobuf/proto"
)

const (
Expand Down Expand Up @@ -230,7 +230,7 @@ func (p *Status) InboundLimit() int {
}

// SetMetadata sets the metadata of the given remote peer.
func (p *Status) SetMetadata(pid peer.ID, metaData *pb.MetaData) {
func (p *Status) SetMetadata(pid peer.ID, metaData interfaces.Metadata) {
p.store.Lock()
defer p.store.Unlock()

Expand All @@ -240,12 +240,15 @@ func (p *Status) SetMetadata(pid peer.ID, metaData *pb.MetaData) {

// Metadata returns a copy of the metadata corresponding to the provided
// peer id.
func (p *Status) Metadata(pid peer.ID) (*pb.MetaData, error) {
func (p *Status) Metadata(pid peer.ID) (interfaces.Metadata, error) {
p.store.RLock()
defer p.store.RUnlock()

if peerData, ok := p.store.PeerData(pid); ok {
return proto.Clone(peerData.MetaData).(*pb.MetaData), nil
if peerData.MetaData == nil || peerData.MetaData.IsNil() {
return nil, nil
}
return peerData.MetaData.Copy(), nil
}
return nil, peerdata.ErrPeerUnknown
}
Expand All @@ -256,10 +259,10 @@ func (p *Status) CommitteeIndices(pid peer.ID) ([]uint64, error) {
defer p.store.RUnlock()

if peerData, ok := p.store.PeerData(pid); ok {
if peerData.Enr == nil || peerData.MetaData == nil {
if peerData.Enr == nil || peerData.MetaData == nil || peerData.MetaData.IsNil() {
return []uint64{}, nil
}
return indicesFromBitfield(peerData.MetaData.Attnets), nil
return indicesFromBitfield(peerData.MetaData.AttnetsBitfield()), nil
}
return nil, peerdata.ErrPeerUnknown
}
Expand All @@ -274,8 +277,8 @@ func (p *Status) SubscribedToSubnet(index uint64) []peer.ID {
for pid, peerData := range p.store.Peers() {
// look at active peers
connectedStatus := peerData.ConnState == PeerConnecting || peerData.ConnState == PeerConnected
if connectedStatus && peerData.MetaData != nil && peerData.MetaData.Attnets != nil {
indices := indicesFromBitfield(peerData.MetaData.Attnets)
if connectedStatus && peerData.MetaData != nil && !peerData.MetaData.IsNil() && peerData.MetaData.AttnetsBitfield() != nil {
indices := indicesFromBitfield(peerData.MetaData.AttnetsBitfield())
for _, idx := range indices {
if idx == index {
peers = append(peers, pid)
Expand Down
19 changes: 10 additions & 9 deletions beacon-chain/p2p/peers/status_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"github.com/prysmaticlabs/prysm/beacon-chain/p2p/peers/peerdata"
"github.com/prysmaticlabs/prysm/beacon-chain/p2p/peers/scorers"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
"github.com/prysmaticlabs/prysm/shared/interfaces"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/prysmaticlabs/prysm/shared/testutil/assert"
"github.com/prysmaticlabs/prysm/shared/testutil/require"
Expand Down Expand Up @@ -187,10 +188,10 @@ func TestPeerCommitteeIndices(t *testing.T) {
bitV.SetBitAt(uint64(i), true)
}
}
p.SetMetadata(id, &pb.MetaData{
p.SetMetadata(id, interfaces.WrappedMetadataV0(&pb.MetaDataV0{
SeqNumber: 2,
Attnets: bitV,
})
}))

wantedIndices := []uint64{2, 8, 9}

Expand Down Expand Up @@ -222,10 +223,10 @@ func TestPeerSubscribedToSubnet(t *testing.T) {
bitV.SetBitAt(uint64(i), true)
}
}
p.SetMetadata(expectedPeer, &pb.MetaData{
p.SetMetadata(expectedPeer, interfaces.WrappedMetadataV0(&pb.MetaDataV0{
SeqNumber: 2,
Attnets: bitV,
})
}))
numPeers = 3
for i := 0; i < numPeers; i++ {
addPeer(t, p, peers.PeerDisconnected)
Expand Down Expand Up @@ -369,15 +370,15 @@ func TestAddMetaData(t *testing.T) {
}
newPeer := p.All()[2]

newMetaData := &pb.MetaData{
newMetaData := &pb.MetaDataV0{
SeqNumber: 8,
Attnets: bitfield.NewBitvector64(),
}
p.SetMetadata(newPeer, newMetaData)
p.SetMetadata(newPeer, interfaces.WrappedMetadataV0(newMetaData))

md, err := p.Metadata(newPeer)
require.NoError(t, err)
assert.Equal(t, newMetaData.SeqNumber, md.SeqNumber, "Unexpected sequence number")
assert.Equal(t, newMetaData.SeqNumber, md.SequenceNumber(), "Unexpected sequence number")
}

func TestPeerConnectionStatuses(t *testing.T) {
Expand Down Expand Up @@ -1001,10 +1002,10 @@ func addPeer(t *testing.T, p *peers.Status, state peerdata.PeerConnectionState)
require.NoError(t, err)
p.Add(new(enr.Record), id, nil, network.DirUnknown)
p.SetConnectionState(id, state)
p.SetMetadata(id, &pb.MetaData{
p.SetMetadata(id, interfaces.WrappedMetadataV0(&pb.MetaDataV0{
SeqNumber: 0,
Attnets: bitfield.NewBitvector64(),
})
}))
return id
}

Expand Down
11 changes: 5 additions & 6 deletions beacon-chain/p2p/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,13 @@ import (
"github.com/prysmaticlabs/prysm/beacon-chain/p2p/encoder"
"github.com/prysmaticlabs/prysm/beacon-chain/p2p/peers"
"github.com/prysmaticlabs/prysm/beacon-chain/p2p/peers/scorers"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
"github.com/prysmaticlabs/prysm/shared"
"github.com/prysmaticlabs/prysm/shared/interfaces"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/prysmaticlabs/prysm/shared/runutil"
"github.com/prysmaticlabs/prysm/shared/slotutil"
"github.com/sirupsen/logrus"
"go.opencensus.io/trace"
"google.golang.org/protobuf/proto"
)

var _ shared.Service = (*Service)(nil)
Expand Down Expand Up @@ -65,7 +64,7 @@ type Service struct {
addrFilter *multiaddr.Filters
ipLimiter *leakybucket.Collector
privKey *ecdsa.PrivateKey
metaData *pb.MetaData
metaData interfaces.Metadata
pubsub *pubsub.PubSub
joinedTopics map[string]*pubsub.Topic
joinedTopicsLock sync.Mutex
Expand Down Expand Up @@ -342,13 +341,13 @@ func (s *Service) DiscoveryAddresses() ([]multiaddr.Multiaddr, error) {
}

// Metadata returns a copy of the peer's metadata.
func (s *Service) Metadata() *pb.MetaData {
return proto.Clone(s.metaData).(*pb.MetaData)
func (s *Service) Metadata() interfaces.Metadata {
return s.metaData.Copy()
}

// MetadataSeq returns the metadata sequence number.
func (s *Service) MetadataSeq() uint64 {
return s.metaData.SeqNumber
return s.metaData.SequenceNumber()
}

// AddPingMethod adds the metadata ping rpc method to the p2p service, so that it can
Expand Down
7 changes: 4 additions & 3 deletions beacon-chain/p2p/subnets.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/ethereum/go-ethereum/p2p/enode"
"github.com/ethereum/go-ethereum/p2p/enr"
"github.com/prysmaticlabs/go-bitfield"
"github.com/prysmaticlabs/prysm/shared/interfaces"
"go.opencensus.io/trace"

pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
Expand Down Expand Up @@ -102,10 +103,10 @@ func (s *Service) hasPeerWithSubnet(topic string) bool {
func (s *Service) updateSubnetRecordWithMetadata(bitV bitfield.Bitvector64) {
entry := enr.WithEntry(attSubnetEnrKey, &bitV)
s.dv5Listener.LocalNode().Set(entry)
s.metaData = &pb.MetaData{
SeqNumber: s.metaData.SeqNumber + 1,
s.metaData = interfaces.WrappedMetadataV0(&pb.MetaDataV0{
SeqNumber: s.metaData.SequenceNumber() + 1,
Attnets: bitV,
}
})
}

// Initializes a bitvector of attestation subnets beacon nodes is subscribed to
Expand Down
5 changes: 3 additions & 2 deletions beacon-chain/p2p/subnets_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/prysmaticlabs/prysm/beacon-chain/core/feed"
statefeed "github.com/prysmaticlabs/prysm/beacon-chain/core/feed/state"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
"github.com/prysmaticlabs/prysm/shared/interfaces"
"github.com/prysmaticlabs/prysm/shared/params"
"github.com/prysmaticlabs/prysm/shared/testutil/assert"
"github.com/prysmaticlabs/prysm/shared/testutil/require"
Expand Down Expand Up @@ -119,9 +120,9 @@ func TestStartDiscV5_DiscoverPeersWithSubnets(t *testing.T) {
// Update ENR of a peer.
testService := &Service{
dv5Listener: listeners[0],
metaData: &pb.MetaData{
metaData: interfaces.WrappedMetadataV0(&pb.MetaDataV0{
Attnets: bitfield.NewBitvector64(),
},
}),
}
cache.SubnetIDs.AddAttesterSubnetID(0, 10)
testService.RefreshENR()
Expand Down
1 change: 1 addition & 0 deletions beacon-chain/p2p/testing/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ go_library(
"//beacon-chain/p2p/peers:go_default_library",
"//beacon-chain/p2p/peers/scorers:go_default_library",
"//proto/beacon/p2p/v1:go_default_library",
"//shared/interfaces:go_default_library",
"@com_github_ethereum_go_ethereum//crypto:go_default_library",
"@com_github_ethereum_go_ethereum//p2p/enode:go_default_library",
"@com_github_ethereum_go_ethereum//p2p/enr:go_default_library",
Expand Down
4 changes: 2 additions & 2 deletions beacon-chain/p2p/testing/fuzz_p2p.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ import (
pubsub "github.com/libp2p/go-libp2p-pubsub"
"github.com/multiformats/go-multiaddr"
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
"github.com/prysmaticlabs/prysm/shared/interfaces"
"google.golang.org/protobuf/proto"

"github.com/prysmaticlabs/prysm/beacon-chain/p2p/encoder"
"github.com/prysmaticlabs/prysm/beacon-chain/p2p/peers"
pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
)

// FakeP2P stack
Expand Down Expand Up @@ -75,7 +75,7 @@ func (p *FakeP2P) LeaveTopic(_ string) error {
}

// Metadata -- fake.
func (p *FakeP2P) Metadata() *pb.MetaData {
func (p *FakeP2P) Metadata() interfaces.Metadata {
return nil
}

Expand Down
10 changes: 6 additions & 4 deletions beacon-chain/p2p/testing/mock_metadataprovider.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
package testing

import pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
import (
"github.com/prysmaticlabs/prysm/shared/interfaces"
)

// MockMetadataProvider is a fake implementation of the MetadataProvider interface.
type MockMetadataProvider struct {
Data *pb.MetaData
Data interfaces.Metadata
}

// Metadata --
func (m *MockMetadataProvider) Metadata() *pb.MetaData {
func (m *MockMetadataProvider) Metadata() interfaces.Metadata {
return m.Data
}

// MetadataSeq --
func (m *MockMetadataProvider) MetadataSeq() uint64 {
return m.Data.SeqNumber
return m.Data.SequenceNumber()
}
Loading