peers

package
v1.0.0-alpha.17 Latest Latest
Warning

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

Go to latest
Published: Jul 31, 2020 License: GPL-3.0 Imports: 16 Imported by: 14

Documentation

Overview

Package peers provides information about peers at the eth2 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.

Index

Constants

View Source
const (
	// DefaultBadResponsesThreshold defines how many bad responses to tolerate before peer is deemed bad.
	DefaultBadResponsesThreshold = 6
	// DefaultBadResponsesWeight is a default weight. Since score represents penalty, it has negative weight.
	DefaultBadResponsesWeight = -1.0
	// DefaultBadResponsesDecayInterval defines how often to decay previous statistics.
	// Every interval bad responses counter will be decremented by 1.
	DefaultBadResponsesDecayInterval = time.Hour
)

Variables

View Source
var (
	// ErrPeerUnknown is returned when there is an attempt to obtain data from a peer that is not known.
	ErrPeerUnknown = errors.New("peer unknown")
)

Functions

This section is empty.

Types

type BadResponsesScorer

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

BadResponsesScorer represents bad responses scoring service.

func (*BadResponsesScorer) BadPeers

func (s *BadResponsesScorer) BadPeers() []peer.ID

BadPeers returns the peers that are bad.

func (*BadResponsesScorer) Count

func (s *BadResponsesScorer) Count(pid peer.ID) (int, error)

Count obtains the number of bad responses we have received from the given remote peer.

func (*BadResponsesScorer) Decay

func (s *BadResponsesScorer) Decay()

Decay reduces the bad responses of all peers, giving reformed peers a chance to join the network. This can be run periodically, although note that each time it runs it does give all bad peers another chance as well to clog up the network with bad responses, so should not be run too frequently; once an hour would be reasonable.

func (*BadResponsesScorer) Increment

func (s *BadResponsesScorer) Increment(pid peer.ID)

Increment increments the number of bad responses we have received from the given remote peer. If peer doesn't exist this method is no-op.

func (*BadResponsesScorer) IsBadPeer

func (s *BadResponsesScorer) IsBadPeer(pid peer.ID) bool

IsBadPeer states if the peer is to be considered bad. If the peer is unknown this will return `false`, which makes using this function easier than returning an error.

func (*BadResponsesScorer) Params

Params exposes scorer's parameters.

func (*BadResponsesScorer) Score

func (s *BadResponsesScorer) Score(pid peer.ID) float64

Score returns score (penalty) of bad responses peer produced.

type BadResponsesScorerConfig

type BadResponsesScorerConfig struct {
	// Threshold specifies number of bad responses tolerated, before peer is banned.
	Threshold int
	// Weight defines weight of bad response/threshold ratio on overall score.
	Weight float64
	// DecayInterval specifies how often bad response stats should be decayed.
	DecayInterval time.Duration
}

BadResponsesScorerConfig holds configuration parameters for bad response scoring service.

type PeerConnectionState

type PeerConnectionState ethpb.ConnectionState

PeerConnectionState is the state of the connection.

const (
	// PeerDisconnected means there is no connection to the peer.
	PeerDisconnected 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
)

type PeerScorerConfig

type PeerScorerConfig struct {
	BadResponsesScorerConfig *BadResponsesScorerConfig
}

PeerScorerConfig holds configuration parameters for scoring service.

type PeerScorerManager

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

PeerScorerManager keeps track of peer scorers that are used to calculate overall peer score.

func (*PeerScorerManager) BadResponsesScorer

func (m *PeerScorerManager) BadResponsesScorer() *BadResponsesScorer

BadResponsesScorer exposes bad responses scoring service.

func (*PeerScorerManager) Score

func (m *PeerScorerManager) Score(pid peer.ID) float64

Score returns calculated peer score across all tracked metrics.

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) Active

func (p *Status) Active() []peer.ID

Active returns the peers that are connecting or connected.

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

func (p *Status) Address(pid peer.ID) (ma.Multiaddr, error)

Address returns the multiaddress of the given remote peer. This will error if the peer does not exist.

func (*Status) All

func (p *Status) All() []peer.ID

All returns all the peers regardless of state.

func (*Status) Bad added in v0.3.2

func (p *Status) Bad() []peer.ID

Bad returns the peers that are bad.

func (*Status) BestFinalized

func (p *Status) BestFinalized(maxPeers int, ourFinalizedEpoch uint64) (uint64, []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. 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 the best finalized root, epoch number, and list of peers that are at or beyond that epoch.

func (*Status) ChainState

func (p *Status) ChainState(pid peer.ID) (*pb.Status, error)

ChainState gets the chain state of the given remote peer. This can return nil if there is no known chain state for the peer. This will error if the peer does not exist.

func (*Status) ChainStateLastUpdated

func (p *Status) ChainStateLastUpdated(pid peer.ID) (time.Time, error)

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 added in v0.3.8

func (p *Status) CommitteeIndices(pid peer.ID) ([]uint64, error)

CommitteeIndices retrieves the committee subnets the peer is subscribed to.

func (*Status) Connected

func (p *Status) Connected() []peer.ID

Connected returns the peers that are connected.

func (*Status) Connecting

func (p *Status) Connecting() []peer.ID

Connecting returns the peers that are connecting.

func (*Status) ConnectionState

func (p *Status) ConnectionState(pid peer.ID) (PeerConnectionState, error)

ConnectionState gets the connection state of the given remote peer. This will error if the peer does not exist.

func (*Status) Direction

func (p *Status) Direction(pid peer.ID) (network.Direction, error)

Direction returns the direction of the given remote peer. This will error if the peer does not exist.

func (*Status) Disconnected

func (p *Status) Disconnected() []peer.ID

Disconnected returns the peers that are disconnected.

func (*Status) Disconnecting

func (p *Status) Disconnecting() []peer.ID

Disconnecting returns the peers that are disconnecting.

func (*Status) ENR added in v1.0.0

func (p *Status) ENR(pid peer.ID) (*enr.Record, error)

ENR returns the enr for the corresponding peer id.

func (*Status) HighestEpoch added in v1.0.0

func (p *Status) HighestEpoch() uint64

HighestEpoch returns the highest epoch reported epoch amongst peers.

func (*Status) Inactive

func (p *Status) Inactive() []peer.ID

Inactive returns the peers that are disconnecting or disconnected.

func (*Status) IsActive added in v0.3.8

func (p *Status) IsActive(pid peer.ID) bool

IsActive checks if a peers is active and returns the result appropriately.

func (*Status) IsBad

func (p *Status) IsBad(pid peer.ID) bool

IsBad states if the peer is to be considered bad. If the peer is unknown this will return `false`, which makes using this function easier than returning an error.

func (*Status) MaxPeerLimit added in v1.0.0

func (p *Status) MaxPeerLimit() int

MaxPeerLimit returns the max peer limit stored in the current peer store.

func (*Status) Metadata added in v1.0.0

func (p *Status) Metadata(pid peer.ID) (*pb.MetaData, error)

Metadata returns a copy of the metadata corresponding to the provided peer id.

func (*Status) Prune added in v1.0.0

func (p *Status) Prune()

Prune clears out and removes outdated and disconnected peers.

func (*Status) Scorers added in v1.0.0

func (p *Status) Scorers() *PeerScorerManager

Scorers exposes peer scoring management service.

func (*Status) SetChainState

func (p *Status) SetChainState(pid peer.ID, chainState *pb.Status)

SetChainState sets the chain state of the given remote peer.

func (*Status) SetConnectionState

func (p *Status) SetConnectionState(pid peer.ID, state PeerConnectionState)

SetConnectionState sets the connection state of the given remote peer.

func (*Status) SetMetadata added in v1.0.0

func (p *Status) SetMetadata(pid peer.ID, metaData *pb.MetaData)

SetMetadata sets the metadata of the given remote peer.

func (*Status) SubscribedToSubnet added in v0.3.8

func (p *Status) SubscribedToSubnet(index uint64) []peer.ID

SubscribedToSubnet retrieves the peers subscribed to the given committee subnet.

type StatusConfig added in v1.0.0

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 *PeerScorerConfig
}

StatusConfig represents peer status service params.

Jump to

Keyboard shortcuts

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