Documentation ¶
Overview ¶
Package p2p implements the Ethereum consensus networking specification.
Canonical spec reference: https://github.com/ethereum/eth2.0-specs/blob/dev/specs/phase0/p2p-interface.md
Prysm specific implementation design docs
- Networking Design Doc: https://docs.google.com/document/d/1VyhobQRkEjEkEPxmmdWvaHfKWn0j6dEae_wLZlrFtfU/view
This package is heavily utilizes the libp2p go implementation by Protocol Labs.
Package p2p defines the network protocol implementation for Ethereum consensus used by beacon nodes, including peer discovery using discv5, gossip-sub using libp2p, and handing peer lifecycles + handshakes.
Index ¶
- Constants
- Variables
- func MakePeer(addr string) (*peer.AddrInfo, error)
- func SerializeENR(record *enr.Record) (string, error)
- func TopicDeconstructor(topic string) (string, string, string, error)
- func VerifyTopicMapping(topic string, msg interface{}) error
- type Broadcaster
- type Config
- type ConnectionHandler
- type EncodingProvider
- type Listener
- type MetadataProvider
- type P2P
- type PeerManager
- type PeersProvider
- type PubSubProvider
- type PubSubTopicUser
- type RPCTopic
- type Sender
- type Service
- func (s *Service) AddConnectionHandler(reqFunc, goodByeFunc func(ctx context.Context, id peer.ID) error)
- func (s *Service) AddDisconnectionHandler(handler func(ctx context.Context, id peer.ID) error)
- func (s *Service) AddPingMethod(reqFunc func(ctx context.Context, id peer.ID) error)
- func (s *Service) Broadcast(ctx context.Context, msg proto.Message) error
- func (s *Service) BroadcastAttestation(ctx context.Context, subnet uint64, att *eth.Attestation) error
- func (s *Service) CanSubscribe(topic string) bool
- func (s *Service) Connect(pi peer.AddrInfo) error
- func (s *Service) Disconnect(pid peer.ID) error
- func (s *Service) DiscoveryAddresses() ([]multiaddr.Multiaddr, error)
- func (s *Service) ENR() *enr.Record
- func (s *Service) Encoding() encoder.NetworkEncoding
- func (s *Service) FilterIncomingSubscriptions(_ peer.ID, subs []*pubsubpb.RPC_SubOpts) ([]*pubsubpb.RPC_SubOpts, error)
- func (s *Service) FindPeersWithSubnet(ctx context.Context, topic string, index, threshold uint64) (bool, error)
- func (s *Service) Host() host.Host
- func (s *Service) InfoHandler(w http.ResponseWriter, _ *http.Request)
- func (s *Service) InterceptAccept(n network.ConnMultiaddrs) (allow bool)
- func (s *Service) InterceptAddrDial(pid peer.ID, m multiaddr.Multiaddr) (allow bool)
- func (s *Service) InterceptPeerDial(_ peer.ID) (allow bool)
- func (s *Service) InterceptSecured(_ network.Direction, _ peer.ID, _ network.ConnMultiaddrs) (allow bool)
- func (s *Service) InterceptUpgraded(_ network.Conn) (allow bool, reason control.DisconnectReason)
- func (s *Service) JoinTopic(topic string, opts ...pubsub.TopicOpt) (*pubsub.Topic, error)
- func (s *Service) LeaveTopic(topic string) error
- func (s *Service) Metadata() interfaces.Metadata
- func (s *Service) MetadataSeq() uint64
- func (s *Service) PeerID() peer.ID
- func (s *Service) Peers() *peers.Status
- func (s *Service) PubSub() *pubsub.PubSub
- func (s *Service) PublishToTopic(ctx context.Context, topic string, data []byte, opts ...pubsub.PubOpt) error
- func (s *Service) RefreshENR()
- func (s *Service) Send(ctx context.Context, message interface{}, baseTopic string, pid peer.ID) (network.Stream, error)
- func (s *Service) SetStreamHandler(topic string, handler network.StreamHandler)
- func (s *Service) Start()
- func (s *Service) Started() bool
- func (s *Service) Status() error
- func (s *Service) Stop() error
- func (s *Service) SubscribeToTopic(topic string, opts ...pubsub.SubOpt) (*pubsub.Subscription, error)
- type SetStreamHandler
Constants ¶
const ( // V1 RPC Topics // RPCStatusTopicV1 defines the v1 topic for the status rpc method. RPCStatusTopicV1 = protocolPrefix + statusMessageName + SchemaVersionV1 // RPCGoodByeTopicV1 defines the v1 topic for the goodbye rpc method. RPCGoodByeTopicV1 = protocolPrefix + goodbyeMessageName + SchemaVersionV1 // RPCBlocksByRangeTopicV1 defines v1 the topic for the blocks by range rpc method. RPCBlocksByRangeTopicV1 = protocolPrefix + beaconBlocksByRangeMessageName + SchemaVersionV1 // RPCBlocksByRootTopicV1 defines the v1 topic for the blocks by root rpc method. RPCBlocksByRootTopicV1 = protocolPrefix + beaconBlocksByRootsMessageName + SchemaVersionV1 // RPCPingTopicV1 defines the v1 topic for the ping rpc method. RPCPingTopicV1 = protocolPrefix + pingMessageName + SchemaVersionV1 // RPCMetaDataTopicV1 defines the v1 topic for the metadata rpc method. RPCMetaDataTopicV1 = protocolPrefix + metadataMessageName + SchemaVersionV1 )
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" )
const SchemaVersionV1 = "/1"
SchemaVersionV1 specifies the schema version for our rpc protocol ID.
Variables ¶
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.
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.
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.
var RPCTopicMappings = map[string]interface{}{ RPCStatusTopicV1: new(pb.Status), RPCGoodByeTopicV1: new(types.SSZUint64), RPCBlocksByRangeTopicV1: new(pb.BeaconBlocksByRangeRequest), RPCBlocksByRootTopicV1: new(p2ptypes.BeaconBlockByRootsReq), RPCPingTopicV1: new(types.SSZUint64), RPCMetaDataTopicV1: new(interface{}), }
RPCTopicMappings map the base message type to the rpc request.
Functions ¶
func SerializeENR ¶ added in v1.0.0
SerializeENR takes the enr record in its key-value form and serializes it.
func TopicDeconstructor ¶ added in v1.3.10
TopicDeconstructor splits the provided topic to its logical sub-sections. It is assumed all input topics will follow the specific schema: /protocol-prefix/message-name/schema-version/... For the purposes of deconstruction, only the first 3 components are relevant.
func VerifyTopicMapping ¶ added in v1.0.0
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 DB db.ReadOnlyDatabase }
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, j 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() interfaces.Metadata MetadataSeq() uint64 }
MetadataProvider returns the metadata related information for the local peer.
type P2P ¶
type P2P interface { Broadcaster SetStreamHandler EncodingProvider PubSubProvider PubSubTopicUser PeerManager Sender ConnectionHandler PeersProvider MetadataProvider }
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 DiscoveryAddresses() ([]multiaddr.Multiaddr, error) RefreshENR() FindPeersWithSubnet(ctx context.Context, topic string, index, threshold 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
PeersProvider abstracts obtaining our current list of known peers status.
type PubSubProvider ¶
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 RPCTopic ¶ added in v1.3.10
type RPCTopic string
RPCTopic is a type used to denote and represent a req/resp topic.
func (RPCTopic) MessageType ¶ added in v1.3.10
MessageType returns the message type of the rpc topic.
func (RPCTopic) ProtocolPrefix ¶ added in v1.3.10
ProtocolPrefix returns the protocol prefix of the rpc topic.
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 ¶
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, goodByeFunc 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 ¶
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
AddPingMethod adds the metadata ping rpc method to the p2p service, so that it can be used to refresh ENR.
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) CanSubscribe ¶ added in v1.0.0
CanSubscribe returns true if the topic is of interest and we could subscribe to it.
func (*Service) Disconnect ¶
Disconnect from a peer.
func (*Service) DiscoveryAddresses ¶ added in v1.1.0
DiscoveryAddresses represents our enr addresses as multiaddresses.
func (*Service) Encoding ¶
func (s *Service) Encoding() encoder.NetworkEncoding
Encoding returns the configured networking encoding.
func (*Service) FilterIncomingSubscriptions ¶ added in v1.0.0
func (s *Service) FilterIncomingSubscriptions(_ peer.ID, subs []*pubsubpb.RPC_SubOpts) ([]*pubsubpb.RPC_SubOpts, error)
FilterIncomingSubscriptions is invoked for all RPCs containing subscription notifications. This method returns only the topics of interest and may return an error if the subscription request contains too many topics.
func (*Service) FindPeersWithSubnet ¶ added in v0.3.8
func (s *Service) FindPeersWithSubnet(ctx context.Context, topic string, index, threshold uint64) (bool, error)
FindPeersWithSubnet performs a network search for peers subscribed to a particular subnet. Then we try to connect with those peers. This method will block until the required amount of peers are found, the method only exits in the event of context timeouts.
func (*Service) Host ¶ added in v1.0.0
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 checks whether the incidental inbound connection is allowed.
func (*Service) InterceptAddrDial ¶ added in v1.0.0
InterceptAddrDial tests whether we're permitted to dial the specified multiaddr for the given peer.
func (*Service) InterceptPeerDial ¶ added in v1.0.0
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, _ network.ConnMultiaddrs) (allow bool)
InterceptSecured tests whether a given connection, now authenticated, is allowed.
func (*Service) InterceptUpgraded ¶ added in v1.0.0
InterceptUpgraded tests whether a fully capable connection is allowed.
func (*Service) JoinTopic ¶ added in v1.0.0
JoinTopic will join PubSub topic, if not already joined.
func (*Service) LeaveTopic ¶ added in v1.0.0
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() interfaces.Metadata
Metadata returns a copy of the peer's metadata.
func (*Service) MetadataSeq ¶ added in v1.0.0
MetadataSeq returns the metadata sequence number.
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.
When done, the caller must Close or Reset on the stream.
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) Status ¶
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) 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.
Source Files ¶
- addr_factory.go
- broadcaster.go
- config.go
- connection_gater.go
- dial_relay_node.go
- discovery.go
- doc.go
- fork.go
- gossip_scoring_params.go
- gossip_topic_mappings.go
- handshake.go
- info.go
- interfaces.go
- iterator.go
- log.go
- monitoring.go
- options.go
- pubsub.go
- pubsub_filter.go
- rpc_topic_mappings.go
- sender.go
- service.go
- subnets.go
- topics.go
- utils.go
- watch_peers.go
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 Ethereum consensus protocol level.
|
Package peers provides information about peers at the Ethereum consensus 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. |
Package types contains all the respective p2p types that are required for sync but cannot be represented as a protobuf schema.
|
Package types contains all the respective p2p types that are required for sync but cannot be represented as a protobuf schema. |