Documentation ¶
Overview ¶
Package peers provides information about peers at the Ethereum consensus protocol level.
"Protocol level" is the level above the network level, so this layer never sees or interacts with (for example) hosts that are uncontactable due to being down, firewalled, etc. Instead, this works with peers that are contactable but may or may not be of the correct fork version, not currently required due to the number of current connections, etc.
A peer can have one of a number of states:
- connected if we are able to talk to the remote peer - connecting if we are attempting to be able to talk to the remote peer - disconnecting if we are attempting to stop being able to talk to the remote peer - disconnected if we are not able to talk to the remote peer
For convenience, there are two aggregate states expressed in functions:
- active if we are connecting or connected - inactive if we are disconnecting or disconnected
Peer information is persistent for the run of the service. This allows for collection of useful long-term statistics such as number of bad responses obtained from the peer, giving the basis for decisions to not talk to known-bad peers (by de-scoring them).
Index ¶
- Constants
- Variables
- type Assigner
- type FinalizedCheckpointer
- type Status
- func (p *Status) Active() []peer.ID
- func (p *Status) Add(record *enr.Record, pid peer.ID, address ma.Multiaddr, ...)
- func (p *Status) Address(pid peer.ID) (ma.Multiaddr, error)
- func (p *Status) All() []peer.ID
- func (p *Status) Bad() []peer.ID
- func (p *Status) BestFinalized(maxPeers int, ourFinalizedEpoch primitives.Epoch) (primitives.Epoch, []peer.ID)
- func (p *Status) BestNonFinalized(minPeers int, ourHeadEpoch primitives.Epoch) (primitives.Epoch, []peer.ID)
- func (p *Status) ChainState(pid peer.ID) (*pb.Status, error)
- func (p *Status) ChainStateLastUpdated(pid peer.ID) (time.Time, error)
- func (p *Status) CommitteeIndices(pid peer.ID) ([]uint64, error)
- func (p *Status) Connected() []peer.ID
- func (p *Status) ConnectedPeerLimit() uint64
- func (p *Status) Connecting() []peer.ID
- func (p *Status) ConnectionState(pid peer.ID) (peerdata.PeerConnectionState, error)
- func (p *Status) DeleteTrustedPeers(peers []peer.ID)
- func (p *Status) Direction(pid peer.ID) (network.Direction, error)
- func (p *Status) Disconnected() []peer.ID
- func (p *Status) Disconnecting() []peer.ID
- func (p *Status) ENR(pid peer.ID) (*enr.Record, error)
- func (p *Status) GetTrustedPeers() []peer.ID
- func (p *Status) HighestEpoch() primitives.Epoch
- func (p *Status) Inactive() []peer.ID
- func (p *Status) Inbound() []peer.ID
- func (p *Status) InboundConnected() []peer.ID
- func (p *Status) InboundLimit() int
- func (p *Status) IsAboveInboundLimit() bool
- func (p *Status) IsActive(pid peer.ID) bool
- func (p *Status) IsBad(pid peer.ID) bool
- func (p *Status) IsReadyToDial(pid peer.ID) bool
- func (p *Status) IsTrustedPeers(pid peer.ID) bool
- func (p *Status) MaxPeerLimit() int
- func (p *Status) Metadata(pid peer.ID) (metadata.Metadata, error)
- func (p *Status) NextValidTime(pid peer.ID) (time.Time, error)
- func (p *Status) Outbound() []peer.ID
- func (p *Status) OutboundConnected() []peer.ID
- func (p *Status) PeersToPrune() []peer.ID
- func (p *Status) Prune()
- func (p *Status) RandomizeBackOff(pid peer.ID)
- func (p *Status) Scorers() *scorers.Service
- func (p *Status) SetChainState(pid peer.ID, chainState *pb.Status)
- func (p *Status) SetConnectionState(pid peer.ID, state peerdata.PeerConnectionState)
- func (p *Status) SetMetadata(pid peer.ID, metaData metadata.Metadata)
- func (p *Status) SetNextValidTime(pid peer.ID, nextTime time.Time)
- func (p *Status) SetTrustedPeers(peers []peer.ID)
- func (p *Status) SubscribedToSubnet(index uint64) []peer.ID
- type StatusConfig
Constants ¶
const ( // PeerDisconnected means there is no connection to the peer. PeerDisconnected peerdata.PeerConnectionState = iota // PeerDisconnecting means there is an on-going attempt to disconnect from the peer. PeerDisconnecting // PeerConnected means the peer has an active connection. PeerConnected // PeerConnecting means there is an on-going attempt to connect to the peer. PeerConnecting )
const ( // ColocationLimit restricts how many peer identities we can see from a single ip or ipv6 subnet. ColocationLimit = 5 // InboundRatio is the proportion of our connected peer limit at which we will allow inbound peers. InboundRatio = float64(0.8) // MinBackOffDuration minimum amount (in milliseconds) to wait before peer is re-dialed. // When node and peer are dialing each other simultaneously connection may fail. In order, to break // of constant dialing, peer is assigned some backoff period, and only dialed again once that backoff is up. MinBackOffDuration = 100 // MaxBackOffDuration maximum amount (in milliseconds) to wait before peer is re-dialed. MaxBackOffDuration = 5000 )
Variables ¶
var ErrInsufficientSuitable = errors.New("no suitable peers")
ErrInsufficientSuitable is a sentinel error, signaling that a peer couldn't be assigned because there are currently not enough peers that match our selection criteria to serve rpc requests. It is the responsibility of the caller to look for this error and continue to try calling Assign with appropriate backoff logic.
Functions ¶
This section is empty.
Types ¶
type Assigner ¶
type Assigner struct {
// contains filtered or unexported fields
}
Assigner uses the "BestFinalized" peer scoring method to pick the next-best peer to receive rpc requests.
func NewAssigner ¶
func NewAssigner(s *Status, fc FinalizedCheckpointer) *Assigner
NewAssigner assists in the correct construction of an Assigner by code in other packages, assuring all the important private member fields are given values. The FinalizedCheckpointer is used to retrieve the latest finalized checkpoint each time peers are requested. Peers that report an older finalized checkpoint are filtered out.
func (*Assigner) Assign ¶
Assign uses the "BestFinalized" method to select the best peers that agree on a canonical block for the configured finalized epoch. At most `n` peers will be returned. The `busy` param can be used to filter out peers that we know we don't want to connect to, for instance if we are trying to limit the number of outbound requests to each peer from a given component.
type FinalizedCheckpointer ¶
type FinalizedCheckpointer interface {
FinalizedCheckpoint() *forkchoicetypes.Checkpoint
}
FinalizedCheckpointer describes the minimum capability that Assigner needs from forkchoice. That is, the ability to retrieve the latest finalized checkpoint to help with peer evaluation.
type Status ¶
type Status struct {
// contains filtered or unexported fields
}
Status is the structure holding the peer status information.
func NewStatus ¶
func NewStatus(ctx context.Context, config *StatusConfig) *Status
NewStatus creates a new status entity.
func (*Status) Add ¶
func (p *Status) Add(record *enr.Record, pid peer.ID, address ma.Multiaddr, direction network.Direction)
Add adds a peer. If a peer already exists with this ID its address and direction are updated with the supplied data.
func (*Status) Address ¶
Address returns the multiaddress of the given remote peer. This will error if the peer does not exist.
func (*Status) BestFinalized ¶
func (p *Status) BestFinalized(maxPeers int, ourFinalizedEpoch primitives.Epoch) (primitives.Epoch, []peer.ID)
BestFinalized returns the highest finalized epoch equal to or higher than ours that is agreed upon by the majority of peers. This method may not return the absolute highest finalized, but the finalized epoch in which most peers can serve blocks (plurality voting). Ideally, all peers would be reporting the same finalized epoch but some may be behind due to their own latency, or because of their finalized epoch at the time we queried them. Returns epoch number and list of peers that are at or beyond that epoch.
func (*Status) BestNonFinalized ¶
func (p *Status) BestNonFinalized(minPeers int, ourHeadEpoch primitives.Epoch) (primitives.Epoch, []peer.ID)
BestNonFinalized returns the highest known epoch, higher than ours, and is shared by at least minPeers.
func (*Status) ChainState ¶
ChainState gets the chain state of the given remote peer. This will error if the peer does not exist. This will error if there is no known chain state for the peer.
func (*Status) ChainStateLastUpdated ¶
ChainStateLastUpdated gets the last time the chain state of the given remote peer was updated. This will error if the peer does not exist.
func (*Status) CommitteeIndices ¶
CommitteeIndices retrieves the committee subnets the peer is subscribed to.
func (*Status) ConnectedPeerLimit ¶
ConnectedPeerLimit returns the peer limit of concurrent peers connected to the beacon-node.
func (*Status) Connecting ¶
Connecting returns the peers that are connecting.
func (*Status) ConnectionState ¶
ConnectionState gets the connection state of the given remote peer. This will error if the peer does not exist.
func (*Status) DeleteTrustedPeers ¶
DeleteTrustedPeers removes peers from trusted peer set
func (*Status) Direction ¶
Direction returns the direction of the given remote peer. This will error if the peer does not exist.
func (*Status) Disconnected ¶
Disconnected returns the peers that are disconnected.
func (*Status) Disconnecting ¶
Disconnecting returns the peers that are disconnecting.
func (*Status) GetTrustedPeers ¶
GetTrustedPeers returns a list of all trusted peers' ids
func (*Status) HighestEpoch ¶
func (p *Status) HighestEpoch() primitives.Epoch
HighestEpoch returns the highest epoch reported epoch amongst peers.
func (*Status) InboundConnected ¶
InboundConnected returns the current batch of inbound peers that are connected.
func (*Status) InboundLimit ¶
InboundLimit returns the current inbound peer limit.
func (*Status) IsAboveInboundLimit ¶
IsAboveInboundLimit checks if we are above our current inbound peer limit.
func (*Status) IsActive ¶
IsActive checks if a peers is active and returns the result appropriately.
func (*Status) IsBad ¶
IsBad states if the peer is to be considered bad (by *any* of the registered scorers). If the peer is unknown this will return `false`, which makes using this function easier than returning an error.
func (*Status) IsReadyToDial ¶
IsReadyToDial checks where the given peer is ready to be dialed again.
func (*Status) IsTrustedPeers ¶
IsTrustedPeers returns if given peer is a Trusted peer
func (*Status) MaxPeerLimit ¶
MaxPeerLimit returns the max peer limit stored in the current peer store.
func (*Status) Metadata ¶
Metadata returns a copy of the metadata corresponding to the provided peer id.
func (*Status) NextValidTime ¶
NextValidTime gets the earliest possible time it is to contact/dial a peer again. This is used to back-off from peers in the event they are 'full' or have banned us.
func (*Status) OutboundConnected ¶
OutboundConnected returns the current batch of outbound peers that are connected.
func (*Status) PeersToPrune ¶
PeersToPrune selects the most suitable inbound peers to disconnect the host peer from. As of this moment the pruning relies on simple heuristics such as bad response count. In the future scoring will be used to determine the most suitable peers to take out.
func (*Status) Prune ¶
func (p *Status) Prune()
Prune clears out and removes outdated and disconnected peers.
func (*Status) RandomizeBackOff ¶
RandomizeBackOff adds extra backoff period during which peer will not be dialed.
func (*Status) SetChainState ¶
SetChainState sets the chain state of the given remote peer.
func (*Status) SetConnectionState ¶
func (p *Status) SetConnectionState(pid peer.ID, state peerdata.PeerConnectionState)
SetConnectionState sets the connection state of the given remote peer.
func (*Status) SetMetadata ¶
SetMetadata sets the metadata of the given remote peer.
func (*Status) SetNextValidTime ¶
SetNextValidTime sets the earliest possible time we are able to contact this peer again.
func (*Status) SetTrustedPeers ¶
SetTrustedPeers sets our trusted peer set into our peerstore.
type StatusConfig ¶
type StatusConfig struct { // PeerLimit specifies maximum amount of concurrent peers that are expected to be connect to the node. PeerLimit int // ScorerParams holds peer scorer configuration params. ScorerParams *scorers.Config }
StatusConfig represents peer status service params.