p2p

package
v1.0.0-alpha.27 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 27, 2020 License: GPL-3.0 Imports: 68 Imported by: 87

Documentation

Overview

Package p2p implements the Ethereum 2.0 networking specification.

Canonical spec reference: https://github.com/ethereum/eth2.0-specs/blob/dev/specs/phase0/p2p-interface.md

Prysm specific implementation design docs

This package is heavily utilizes the libp2p go implementation by Protocol Labs.

Package p2p defines the network protocol implementation for eth2 used by beacon nodes, including peer discovery using discv5, gossip-sub using libp2p, and handing peer lifecycles + handshakes.

Index

Constants

View Source
const (
	// RPCStatusTopic defines the topic for the status rpc method.
	RPCStatusTopic = "/eth2/beacon_chain/req/status" + schemaVersionV1
	// RPCGoodByeTopic defines the topic for the goodbye rpc method.
	RPCGoodByeTopic = "/eth2/beacon_chain/req/goodbye" + schemaVersionV1
	// RPCBlocksByRangeTopic defines the topic for the blocks by range rpc method.
	RPCBlocksByRangeTopic = "/eth2/beacon_chain/req/beacon_blocks_by_range" + schemaVersionV1
	// RPCBlocksByRootTopic defines the topic for the blocks by root rpc method.
	RPCBlocksByRootTopic = "/eth2/beacon_chain/req/beacon_blocks_by_root" + schemaVersionV1
	// RPCPingTopic defines the topic for the ping rpc method.
	RPCPingTopic = "/eth2/beacon_chain/req/ping" + schemaVersionV1
	// RPCMetaDataTopic defines the topic for the metadata rpc method.
	RPCMetaDataTopic = "/eth2/beacon_chain/req/metadata" + schemaVersionV1
)
View Source
const (
	// AttestationSubnetTopicFormat is the topic format for the attestation subnet.
	AttestationSubnetTopicFormat = "/eth2/%x/beacon_attestation_%d"
	// BlockSubnetTopicFormat is the topic format for the block subnet.
	BlockSubnetTopicFormat = "/eth2/%x/beacon_block"
	// ExitSubnetTopicFormat is the topic format for the voluntary exit subnet.
	ExitSubnetTopicFormat = "/eth2/%x/voluntary_exit"
	// ProposerSlashingSubnetTopicFormat is the topic format for the proposer slashing subnet.
	ProposerSlashingSubnetTopicFormat = "/eth2/%x/proposer_slashing"
	// AttesterSlashingSubnetTopicFormat is the topic format for the attester slashing subnet.
	AttesterSlashingSubnetTopicFormat = "/eth2/%x/attester_slashing"
	// AggregateAndProofSubnetTopicFormat is the topic format for the aggregate and proof subnet.
	AggregateAndProofSubnetTopicFormat = "/eth2/%x/beacon_aggregate_and_proof"
)

Variables

View Source
var ErrMessageNotMapped = errors.New("message type is not mapped to a PubSub topic")

ErrMessageNotMapped occurs on a Broadcast attempt when a message has not been defined in the GossipTypeMapping.

View Source
var GossipTopicMappings = map[string]proto.Message{
	BlockSubnetTopicFormat:             &pb.SignedBeaconBlock{},
	AttestationSubnetTopicFormat:       &pb.Attestation{},
	ExitSubnetTopicFormat:              &pb.SignedVoluntaryExit{},
	ProposerSlashingSubnetTopicFormat:  &pb.ProposerSlashing{},
	AttesterSlashingSubnetTopicFormat:  &pb.AttesterSlashing{},
	AggregateAndProofSubnetTopicFormat: &pb.SignedAggregateAttestationAndProof{},
}

GossipTopicMappings represent the protocol ID to protobuf message type map for easy lookup.

View Source
var GossipTypeMapping = make(map[reflect.Type]string, len(GossipTopicMappings))

GossipTypeMapping is the inverse of GossipTopicMappings so that an arbitrary protobuf message can be mapped to a protocol ID string.

RPCTopicMappings map the base message type to the rpc request.

Functions

func MakePeer

func MakePeer(addr string) (*peer.AddrInfo, error)

MakePeer from multiaddress string.

func SerializeENR added in v1.0.0

func SerializeENR(record *enr.Record) (string, error)

SerializeENR takes the enr record in its key-value form and serializes it.

func VerifyTopicMapping added in v1.0.0

func VerifyTopicMapping(topic string, msg interface{}) error

VerifyTopicMapping verifies that the topic and its accompanying message type is correct.

Types

type Broadcaster

type Broadcaster interface {
	Broadcast(context.Context, proto.Message) error
	BroadcastAttestation(ctx context.Context, subnet uint64, att *ethpb.Attestation) error
}

Broadcaster broadcasts messages to peers over the p2p pubsub protocol.

type Config

type Config struct {
	NoDiscovery         bool
	EnableUPnP          bool
	DisableDiscv5       bool
	StaticPeers         []string
	BootstrapNodeAddr   []string
	Discv5BootStrapAddr []string
	RelayNodeAddr       string
	LocalIP             string
	HostAddress         string
	HostDNS             string
	PrivateKey          string
	DataDir             string
	MetaDataDir         string
	TCPPort             uint
	UDPPort             uint
	MaxPeers            uint
	AllowListCIDR       string
	DenyListCIDR        []string
	StateNotifier       statefeed.Notifier
}

Config for the p2p service. These parameters are set from application level flags to initialize the p2p service.

type ConnectionHandler

type ConnectionHandler interface {
	AddConnectionHandler(f func(ctx context.Context, id peer.ID) error)
	AddDisconnectionHandler(f func(ctx context.Context, id peer.ID) error)
	connmgr.ConnectionGater
}

ConnectionHandler configures p2p to handle connections with a peer.

type EncodingProvider

type EncodingProvider interface {
	Encoding() encoder.NetworkEncoding
}

EncodingProvider provides p2p network encoding.

type Listener

type Listener interface {
	Self() *enode.Node
	Close()
	Lookup(enode.ID) []*enode.Node
	Resolve(*enode.Node) *enode.Node
	RandomNodes() enode.Iterator
	Ping(*enode.Node) error
	RequestENR(*enode.Node) (*enode.Node, error)
	LocalNode() *enode.LocalNode
}

Listener defines the discovery V5 network interface that is used to communicate with other peers.

type MetadataProvider added in v1.0.0

type MetadataProvider interface {
	Metadata() *pb.MetaData
	MetadataSeq() uint64
}

MetadataProvider returns the metadata related information for the local peer.

type P2P

P2P represents the full p2p interface composed of all of the sub-interfaces.

type PeerManager

type PeerManager interface {
	Disconnect(peer.ID) error
	PeerID() peer.ID
	Host() host.Host
	ENR() *enr.Record
	RefreshENR()
	FindPeersWithSubnet(ctx context.Context, index uint64) (bool, error)
	AddPingMethod(reqFunc func(ctx context.Context, id peer.ID) error)
}

PeerManager abstracts some peer management methods from libp2p.

type PeersProvider added in v0.3.0

type PeersProvider interface {
	Peers() *peers.Status
}

PeersProvider abstracts obtaining our current list of known peers status.

type PubSubProvider

type PubSubProvider interface {
	PubSub() *pubsub.PubSub
}

PubSubProvider provides the p2p pubsub protocol.

type PubSubTopicUser added in v1.0.0

type PubSubTopicUser interface {
	JoinTopic(topic string, opts ...pubsub.TopicOpt) (*pubsub.Topic, error)
	LeaveTopic(topic string) error
	PublishToTopic(ctx context.Context, topic string, data []byte, opts ...pubsub.PubOpt) error
	SubscribeToTopic(topic string, opts ...pubsub.SubOpt) (*pubsub.Subscription, error)
}

PubSubTopicUser provides way to join, use and leave PubSub topics.

type Sender

type Sender interface {
	Send(context.Context, interface{}, string, peer.ID) (network.Stream, error)
}

Sender abstracts the sending functionality from libp2p.

type Service

type Service struct {
	// contains filtered or unexported fields
}

Service for managing peer to peer (p2p) networking.

func NewService

func NewService(ctx context.Context, cfg *Config) (*Service, error)

NewService initializes a new p2p service compatible with shared.Service interface. No connections are made until the Start function is called during the service registry startup.

func (*Service) AddConnectionHandler

func (s *Service) AddConnectionHandler(reqFunc func(ctx context.Context, id peer.ID) error)

AddConnectionHandler adds a callback function which handles the connection with a newly added peer. It performs a handshake with that peer by sending a hello request and validating the response from the peer.

func (*Service) AddDisconnectionHandler

func (s *Service) AddDisconnectionHandler(handler func(ctx context.Context, id peer.ID) error)

AddDisconnectionHandler disconnects from peers. It handles updating the peer status. This also calls the handler responsible for maintaining other parts of the sync or p2p system.

func (*Service) AddPingMethod added in v1.0.0

func (s *Service) AddPingMethod(reqFunc func(ctx context.Context, id peer.ID) error)

AddPingMethod adds the metadata ping rpc method to the p2p service, so that it can be used to refresh ENR.

func (*Service) Broadcast

func (s *Service) Broadcast(ctx context.Context, msg proto.Message) error

Broadcast a message to the p2p network.

func (*Service) BroadcastAttestation added in v1.0.0

func (s *Service) BroadcastAttestation(ctx context.Context, subnet uint64, att *eth.Attestation) error

BroadcastAttestation broadcasts an attestation to the p2p network.

func (*Service) Connect added in v1.0.0

func (s *Service) Connect(pi peer.AddrInfo) error

Connect to a specific peer.

func (*Service) Disconnect

func (s *Service) Disconnect(pid peer.ID) error

Disconnect from a peer.

func (*Service) ENR added in v1.0.0

func (s *Service) ENR() *enr.Record

ENR returns the local node's current ENR.

func (*Service) Encoding

func (s *Service) Encoding() encoder.NetworkEncoding

Encoding returns the configured networking encoding.

func (*Service) FindPeersWithSubnet added in v0.3.8

func (s *Service) FindPeersWithSubnet(ctx context.Context, index uint64) (bool, error)

FindPeersWithSubnet performs a network search for peers subscribed to a particular subnet. Then we try to connect with those peers.

func (*Service) Host added in v1.0.0

func (s *Service) Host() host.Host

Host returns the currently running libp2p host of the service.

func (*Service) InfoHandler

func (s *Service) InfoHandler(w http.ResponseWriter, _ *http.Request)

InfoHandler is a handler to serve /p2p page in metrics.

func (*Service) InterceptAccept added in v1.0.0

func (s *Service) InterceptAccept(n network.ConnMultiaddrs) (allow bool)

InterceptAccept tests whether an incipient inbound connection is allowed.

func (*Service) InterceptAddrDial added in v1.0.0

func (s *Service) InterceptAddrDial(_ peer.ID, m multiaddr.Multiaddr) (allow bool)

InterceptAddrDial tests whether we're permitted to dial the specified multiaddr for the given peer.

func (*Service) InterceptPeerDial added in v1.0.0

func (s *Service) InterceptPeerDial(p peer.ID) (allow bool)

InterceptPeerDial tests whether we're permitted to Dial the specified peer.

func (*Service) InterceptSecured added in v1.0.0

func (s *Service) InterceptSecured(_ network.Direction, _ peer.ID, n network.ConnMultiaddrs) (allow bool)

InterceptSecured tests whether a given connection, now authenticated, is allowed.

func (*Service) InterceptUpgraded added in v1.0.0

func (s *Service) InterceptUpgraded(n network.Conn) (allow bool, reason control.DisconnectReason)

InterceptUpgraded tests whether a fully capable connection is allowed.

func (*Service) JoinTopic added in v1.0.0

func (s *Service) JoinTopic(topic string, opts ...pubsub.TopicOpt) (*pubsub.Topic, error)

JoinTopic will join PubSub topic, if not already joined.

func (*Service) LeaveTopic added in v1.0.0

func (s *Service) LeaveTopic(topic string) error

LeaveTopic closes topic and removes corresponding handler from list of joined topics. This method will return error if there are outstanding event handlers or subscriptions.

func (*Service) Metadata added in v1.0.0

func (s *Service) Metadata() *pb.MetaData

Metadata returns a copy of the peer's metadata.

func (*Service) MetadataSeq added in v1.0.0

func (s *Service) MetadataSeq() uint64

MetadataSeq returns the metadata sequence number.

func (*Service) PeerID

func (s *Service) PeerID() peer.ID

PeerID returns the Peer ID of the local peer.

func (*Service) Peers added in v0.3.0

func (s *Service) Peers() *peers.Status

Peers returns the peer status interface.

func (*Service) PubSub

func (s *Service) PubSub() *pubsub.PubSub

PubSub returns the p2p pubsub framework.

func (*Service) PublishToTopic added in v1.0.0

func (s *Service) PublishToTopic(ctx context.Context, topic string, data []byte, opts ...pubsub.PubOpt) error

PublishToTopic joins (if necessary) and publishes a message to a PubSub topic.

func (*Service) RefreshENR added in v0.3.8

func (s *Service) RefreshENR()

RefreshENR uses an epoch to refresh the enr entry for our node with the tracked committee ids for the epoch, allowing our node to be dynamically discoverable by others given our tracked committee ids.

func (*Service) Send

func (s *Service) Send(ctx context.Context, message interface{}, baseTopic string, pid peer.ID) (network.Stream, error)

Send a message to a specific peer. The returned stream may be used for reading, but has been closed for writing.

func (*Service) SetStreamHandler

func (s *Service) SetStreamHandler(topic string, handler network.StreamHandler)

SetStreamHandler sets the protocol handler on the p2p host multiplexer. This method is a pass through to libp2pcore.Host.SetStreamHandler.

func (*Service) Start

func (s *Service) Start()

Start the p2p service.

func (*Service) Started

func (s *Service) Started() bool

Started returns true if the p2p service has successfully started.

func (*Service) Status

func (s *Service) Status() error

Status of the p2p service. Will return an error if the service is considered unhealthy to indicate that this node should not serve traffic until the issue has been resolved.

func (*Service) Stop

func (s *Service) Stop() error

Stop the p2p service and terminate all peer connections.

func (*Service) SubscribeToTopic added in v1.0.0

func (s *Service) SubscribeToTopic(topic string, opts ...pubsub.SubOpt) (*pubsub.Subscription, error)

SubscribeToTopic joins (if necessary) and subscribes to PubSub topic.

type SetStreamHandler

type SetStreamHandler interface {
	SetStreamHandler(topic string, handler network.StreamHandler)
}

SetStreamHandler configures p2p to handle streams of a certain topic ID.

Directories

Path Synopsis
Package encoder allows for registering custom data encoders for information sent as raw bytes over the wire via p2p to other nodes.
Package encoder allows for registering custom data encoders for information sent as raw bytes over the wire via p2p to other nodes.
Package peers provides information about peers at the eth2 protocol level.
Package peers provides information about peers at the eth2 protocol level.
Package testing includes useful utilities for mocking a beacon node's p2p service for unit tests.
Package testing includes useful utilities for mocking a beacon node's p2p service for unit tests.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL