tendermint: github.com/tendermint/tendermint/p2p Index | Files | Directories

package p2p

import "github.com/tendermint/tendermint/p2p"


Package Files

base_reactor.go conn_set.go errors.go fuzz.go key.go metrics.go netaddress.go node_info.go peer.go peer_set.go switch.go test_util.go transport.go types.go


const EmptyNetAddress = "<nil-NetAddress>"

EmptyNetAddress defines the string representation of an empty NetAddress

const IDByteLength = crypto.AddressSize

IDByteLength is the length of a crypto.Address. Currently only 20. TODO: support other length addresses ?

const (
    // MetricsSubsystem is a subsystem shared by all metrics exposed by this
    // package.
    MetricsSubsystem = "p2p"
const TestHost = "localhost"

func AddPeerToSwitchPeerSet Uses

func AddPeerToSwitchPeerSet(sw *Switch, peer Peer)

func Connect2Switches Uses

func Connect2Switches(switches []*Switch, i, j int)

Connect2Switches will connect switches i and j via net.Pipe(). Blocks until a connection is established. NOTE: caller ensures i and j are within bounds.

func FuzzConn Uses

func FuzzConn(conn net.Conn) net.Conn

FuzzConn creates a new FuzzedConnection. Fuzzing starts immediately.

func FuzzConnAfter Uses

func FuzzConnAfter(conn net.Conn, d time.Duration) net.Conn

FuzzConnAfter creates a new FuzzedConnection. Fuzzing starts when the duration elapses.

func FuzzConnAfterFromConfig Uses

func FuzzConnAfterFromConfig(
    conn net.Conn,
    d time.Duration,
    config *config.FuzzConnConfig,
) net.Conn

FuzzConnAfterFromConfig creates a new FuzzedConnection from a config. Fuzzing starts when the duration elapses.

func FuzzConnFromConfig Uses

func FuzzConnFromConfig(conn net.Conn, config *config.FuzzConnConfig) net.Conn

FuzzConnFromConfig creates a new FuzzedConnection from a config. Fuzzing starts immediately.

func IDAddressString Uses

func IDAddressString(id ID, protocolHostPort string) string

IDAddressString returns id@hostPort. It strips the leading protocol from protocolHostPort if it exists.

func MConnConfig Uses

func MConnConfig(cfg *config.P2PConfig) conn.MConnConfig

MConnConfig returns an MConnConfig with fields updated from the P2PConfig.

func MakePoWTarget Uses

func MakePoWTarget(difficulty, targetBits uint) []byte

MakePoWTarget returns the big-endian encoding of 2^(targetBits - difficulty) - 1. It can be used as a Proof of Work target. NOTE: targetBits must be a multiple of 8 and difficulty must be less than targetBits.

func MaxNodeInfoSize Uses

func MaxNodeInfoSize() int

Max size of the NodeInfo struct

func NetAddressesToProto Uses

func NetAddressesToProto(nas []*NetAddress) []tmp2p.NetAddress

NetAddressesToProto converts a slice of NetAddresses into a Protobuf slice.

func StartSwitches Uses

func StartSwitches(switches []*Switch) error

StartSwitches calls sw.Start() for each given switch. It returns the first encountered error.

type AddrBook Uses

type AddrBook interface {
    AddAddress(addr *NetAddress, src *NetAddress) error
    OurAddress(*NetAddress) bool
    HasAddress(*NetAddress) bool

An AddrBook represents an address book from the pex package, which is used to store peer addresses.

type AddrBookMock Uses

type AddrBookMock struct {
    Addrs        map[string]struct{}
    OurAddrs     map[string]struct{}
    PrivateAddrs map[string]struct{}

func (*AddrBookMock) AddAddress Uses

func (book *AddrBookMock) AddAddress(addr *NetAddress, src *NetAddress) error

func (*AddrBookMock) AddOurAddress Uses

func (book *AddrBookMock) AddOurAddress(addr *NetAddress)

func (*AddrBookMock) AddPrivateIDs Uses

func (book *AddrBookMock) AddPrivateIDs(addrs []string)

func (*AddrBookMock) HasAddress Uses

func (book *AddrBookMock) HasAddress(addr *NetAddress) bool

func (*AddrBookMock) MarkGood Uses

func (book *AddrBookMock) MarkGood(ID)

func (*AddrBookMock) OurAddress Uses

func (book *AddrBookMock) OurAddress(addr *NetAddress) bool

func (*AddrBookMock) RemoveAddress Uses

func (book *AddrBookMock) RemoveAddress(addr *NetAddress)

func (*AddrBookMock) Save Uses

func (book *AddrBookMock) Save()

type BaseReactor Uses

type BaseReactor struct {
    service.BaseService // Provides Start, Stop, .Quit
    Switch              *Switch

func NewBaseReactor Uses

func NewBaseReactor(name string, impl Reactor) *BaseReactor

func (*BaseReactor) AddPeer Uses

func (*BaseReactor) AddPeer(peer Peer)

func (*BaseReactor) GetChannels Uses

func (*BaseReactor) GetChannels() []*conn.ChannelDescriptor

func (*BaseReactor) InitPeer Uses

func (*BaseReactor) InitPeer(peer Peer) Peer

func (*BaseReactor) Receive Uses

func (*BaseReactor) Receive(chID byte, peer Peer, msgBytes []byte)

func (*BaseReactor) RemovePeer Uses

func (*BaseReactor) RemovePeer(peer Peer, reason interface{})

func (*BaseReactor) SetSwitch Uses

func (br *BaseReactor) SetSwitch(sw *Switch)

type ChannelDescriptor Uses

type ChannelDescriptor = conn.ChannelDescriptor

type ConnFilterFunc Uses

type ConnFilterFunc func(ConnSet, net.Conn, []net.IP) error

ConnFilterFunc to be implemented by filter hooks after a new connection has been established. The set of exisiting connections is passed along together with all resolved IPs for the new connection.

func ConnDuplicateIPFilter Uses

func ConnDuplicateIPFilter() ConnFilterFunc

ConnDuplicateIPFilter resolves and keeps all ips for an incoming connection and refuses new ones if they come from a known ip.

type ConnSet Uses

type ConnSet interface {
    Has(net.Conn) bool
    HasIP(net.IP) bool
    Set(net.Conn, []net.IP)

ConnSet is a lookup table for connections and all their ips.

func NewConnSet Uses

func NewConnSet() ConnSet

NewConnSet returns a ConnSet implementation.

type ConnectionStatus Uses

type ConnectionStatus = conn.ConnectionStatus

type DefaultNodeInfo Uses

type DefaultNodeInfo struct {
    ProtocolVersion ProtocolVersion `json:"protocol_version"`

    // Authenticate
    // TODO: replace with NetAddress
    DefaultNodeID ID     `json:"id"`          // authenticated identifier
    ListenAddr    string `json:"listen_addr"` // accepting incoming

    // Check compatibility.
    // Channels are HexBytes so easier to read as JSON
    Network  string         `json:"network"`  // network/chain ID
    Version  string         `json:"version"`  // major.minor.revision
    Channels bytes.HexBytes `json:"channels"` // channels this node knows about

    // ASCIIText fields
    Moniker string               `json:"moniker"` // arbitrary moniker
    Other   DefaultNodeInfoOther `json:"other"`   // other application specific data

DefaultNodeInfo is the basic node information exchanged between two peers during the Tendermint P2P handshake.

func DefaultNodeInfoFromToProto Uses

func DefaultNodeInfoFromToProto(pb *tmp2p.DefaultNodeInfo) (DefaultNodeInfo, error)

func (DefaultNodeInfo) CompatibleWith Uses

func (info DefaultNodeInfo) CompatibleWith(otherInfo NodeInfo) error

CompatibleWith checks if two DefaultNodeInfo are compatible with eachother. CONTRACT: two nodes are compatible if the Block version and network match and they have at least one channel in common.

func (DefaultNodeInfo) ID Uses

func (info DefaultNodeInfo) ID() ID

ID returns the node's peer ID.

func (DefaultNodeInfo) NetAddress Uses

func (info DefaultNodeInfo) NetAddress() (*NetAddress, error)

NetAddress returns a NetAddress derived from the DefaultNodeInfo - it includes the authenticated peer ID and the self-reported ListenAddr. Note that the ListenAddr is not authenticated and may not match that address actually dialed if its an outbound peer.

func (DefaultNodeInfo) ToProto Uses

func (info DefaultNodeInfo) ToProto() *tmp2p.DefaultNodeInfo

func (DefaultNodeInfo) Validate Uses

func (info DefaultNodeInfo) Validate() error

Validate checks the self-reported DefaultNodeInfo is safe. It returns an error if there are too many Channels, if there are any duplicate Channels, if the ListenAddr is malformed, or if the ListenAddr is a host name that can not be resolved to some IP. TODO: constraints for Moniker/Other? Or is that for the UI ? JAE: It needs to be done on the client, but to prevent ambiguous unicode characters, maybe it's worth sanitizing it here. In the future we might want to validate these, once we have a name-resolution system up. International clients could then use punycode (or we could use url-encoding), and we just need to be careful with how we handle that in our clients. (e.g. off by default).

type DefaultNodeInfoOther Uses

type DefaultNodeInfoOther struct {
    TxIndex    string `json:"tx_index"`
    RPCAddress string `json:"rpc_address"`

DefaultNodeInfoOther is the misc. applcation specific data

type ErrCurrentlyDialingOrExistingAddress Uses

type ErrCurrentlyDialingOrExistingAddress struct {
    Addr string

ErrCurrentlyDialingOrExistingAddress indicates that we're currently dialing this address or it belongs to an existing peer.

func (ErrCurrentlyDialingOrExistingAddress) Error Uses

func (e ErrCurrentlyDialingOrExistingAddress) Error() string

type ErrFilterTimeout Uses

type ErrFilterTimeout struct{}

ErrFilterTimeout indicates that a filter operation timed out.

func (ErrFilterTimeout) Error Uses

func (e ErrFilterTimeout) Error() string

type ErrNetAddressInvalid Uses

type ErrNetAddressInvalid struct {
    Addr string
    Err  error

func (ErrNetAddressInvalid) Error Uses

func (e ErrNetAddressInvalid) Error() string

type ErrNetAddressLookup Uses

type ErrNetAddressLookup struct {
    Addr string
    Err  error

func (ErrNetAddressLookup) Error Uses

func (e ErrNetAddressLookup) Error() string

type ErrNetAddressNoID Uses

type ErrNetAddressNoID struct {
    Addr string

func (ErrNetAddressNoID) Error Uses

func (e ErrNetAddressNoID) Error() string

type ErrRejected Uses

type ErrRejected struct {
    // contains filtered or unexported fields

ErrRejected indicates that a Peer was rejected carrying additional information as to the reason.

func (ErrRejected) Addr Uses

func (e ErrRejected) Addr() NetAddress

Addr returns the NetAddress for the rejected Peer.

func (ErrRejected) Error Uses

func (e ErrRejected) Error() string

func (ErrRejected) IsAuthFailure Uses

func (e ErrRejected) IsAuthFailure() bool

IsAuthFailure when Peer authentication was unsuccessful.

func (ErrRejected) IsDuplicate Uses

func (e ErrRejected) IsDuplicate() bool

IsDuplicate when Peer ID or IP are present already.

func (ErrRejected) IsFiltered Uses

func (e ErrRejected) IsFiltered() bool

IsFiltered when Peer ID or IP was filtered.

func (ErrRejected) IsIncompatible Uses

func (e ErrRejected) IsIncompatible() bool

IsIncompatible when Peer NodeInfo is not compatible with our own.

func (ErrRejected) IsNodeInfoInvalid Uses

func (e ErrRejected) IsNodeInfoInvalid() bool

IsNodeInfoInvalid when the sent NodeInfo is not valid.

func (ErrRejected) IsSelf Uses

func (e ErrRejected) IsSelf() bool

IsSelf when Peer is our own node.

type ErrSwitchAuthenticationFailure Uses

type ErrSwitchAuthenticationFailure struct {
    Dialed *NetAddress
    Got    ID

func (ErrSwitchAuthenticationFailure) Error Uses

func (e ErrSwitchAuthenticationFailure) Error() string

type ErrSwitchConnectToSelf Uses

type ErrSwitchConnectToSelf struct {
    Addr *NetAddress

ErrSwitchConnectToSelf to be raised when trying to connect to itself.

func (ErrSwitchConnectToSelf) Error Uses

func (e ErrSwitchConnectToSelf) Error() string

type ErrSwitchDuplicatePeerID Uses

type ErrSwitchDuplicatePeerID struct {
    ID ID

ErrSwitchDuplicatePeerID to be raised when a peer is connecting with a known ID.

func (ErrSwitchDuplicatePeerID) Error Uses

func (e ErrSwitchDuplicatePeerID) Error() string

type ErrSwitchDuplicatePeerIP Uses

type ErrSwitchDuplicatePeerIP struct {
    IP net.IP

ErrSwitchDuplicatePeerIP to be raised whena a peer is connecting with a known IP.

func (ErrSwitchDuplicatePeerIP) Error Uses

func (e ErrSwitchDuplicatePeerIP) Error() string

type ErrTransportClosed Uses

type ErrTransportClosed struct{}

ErrTransportClosed is raised when the Transport has been closed.

func (ErrTransportClosed) Error Uses

func (e ErrTransportClosed) Error() string

type FuzzedConnection Uses

type FuzzedConnection struct {
    // contains filtered or unexported fields

FuzzedConnection wraps any net.Conn and depending on the mode either delays reads/writes or randomly drops reads/writes/connections.

func (*FuzzedConnection) Close Uses

func (fc *FuzzedConnection) Close() error

Close implements net.Conn.

func (*FuzzedConnection) Config Uses

func (fc *FuzzedConnection) Config() *config.FuzzConnConfig

Config returns the connection's config.

func (*FuzzedConnection) LocalAddr Uses

func (fc *FuzzedConnection) LocalAddr() net.Addr

LocalAddr implements net.Conn.

func (*FuzzedConnection) Read Uses

func (fc *FuzzedConnection) Read(data []byte) (n int, err error)

Read implements net.Conn.

func (*FuzzedConnection) RemoteAddr Uses

func (fc *FuzzedConnection) RemoteAddr() net.Addr

RemoteAddr implements net.Conn.

func (*FuzzedConnection) SetDeadline Uses

func (fc *FuzzedConnection) SetDeadline(t time.Time) error

SetDeadline implements net.Conn.

func (*FuzzedConnection) SetReadDeadline Uses

func (fc *FuzzedConnection) SetReadDeadline(t time.Time) error

SetReadDeadline implements net.Conn.

func (*FuzzedConnection) SetWriteDeadline Uses

func (fc *FuzzedConnection) SetWriteDeadline(t time.Time) error

SetWriteDeadline implements net.Conn.

func (*FuzzedConnection) Write Uses

func (fc *FuzzedConnection) Write(data []byte) (n int, err error)

Write implements net.Conn.

type ID Uses

type ID string

ID is a hex-encoded crypto.Address

func PubKeyToID Uses

func PubKeyToID(pubKey crypto.PubKey) ID

PubKeyToID returns the ID corresponding to the given PubKey. It's the hex-encoding of the pubKey.Address().

type IPResolver Uses

type IPResolver interface {
    LookupIPAddr(context.Context, string) ([]net.IPAddr, error)

IPResolver is a behaviour subset of net.Resolver.

type IPeerSet Uses

type IPeerSet interface {
    Has(key ID) bool
    HasIP(ip net.IP) bool
    Get(key ID) Peer
    List() []Peer
    Size() int

IPeerSet has a (immutable) subset of the methods of PeerSet.

type Metrics Uses

type Metrics struct {
    // Number of peers.
    Peers metrics.Gauge
    // Number of bytes received from a given peer.
    PeerReceiveBytesTotal metrics.Counter
    // Number of bytes sent to a given peer.
    PeerSendBytesTotal metrics.Counter
    // Pending bytes to be sent to a given peer.
    PeerPendingSendBytes metrics.Gauge
    // Number of transactions submitted by each peer.
    NumTxs metrics.Gauge

Metrics contains metrics exposed by this package.

func NopMetrics Uses

func NopMetrics() *Metrics

NopMetrics returns no-op Metrics.

func PrometheusMetrics Uses

func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics

PrometheusMetrics returns Metrics build using Prometheus client library. Optionally, labels can be provided along with their values ("foo", "fooValue").

type MultiplexTransport Uses

type MultiplexTransport struct {
    // contains filtered or unexported fields

MultiplexTransport accepts and dials tcp connections and upgrades them to multiplexed peers.

func NewMultiplexTransport Uses

func NewMultiplexTransport(
    nodeInfo NodeInfo,
    nodeKey NodeKey,
    mConfig conn.MConnConfig,
) *MultiplexTransport

NewMultiplexTransport returns a tcp connected multiplexed peer.

func (*MultiplexTransport) Accept Uses

func (mt *MultiplexTransport) Accept(cfg peerConfig) (Peer, error)

Accept implements Transport.

func (*MultiplexTransport) Cleanup Uses

func (mt *MultiplexTransport) Cleanup(p Peer)

Cleanup removes the given address from the connections set and closes the connection.

func (*MultiplexTransport) Close Uses

func (mt *MultiplexTransport) Close() error

Close implements transportLifecycle.

func (*MultiplexTransport) Dial Uses

func (mt *MultiplexTransport) Dial(
    addr NetAddress,
    cfg peerConfig,
) (Peer, error)

Dial implements Transport.

func (*MultiplexTransport) Listen Uses

func (mt *MultiplexTransport) Listen(addr NetAddress) error

Listen implements transportLifecycle.

func (*MultiplexTransport) NetAddress Uses

func (mt *MultiplexTransport) NetAddress() NetAddress

NetAddress implements Transport.

type MultiplexTransportOption Uses

type MultiplexTransportOption func(*MultiplexTransport)

MultiplexTransportOption sets an optional parameter on the MultiplexTransport.

func MultiplexTransportConnFilters Uses

func MultiplexTransportConnFilters(
    filters ...ConnFilterFunc,
) MultiplexTransportOption

MultiplexTransportConnFilters sets the filters for rejection new connections.

func MultiplexTransportFilterTimeout Uses

func MultiplexTransportFilterTimeout(
    timeout time.Duration,
) MultiplexTransportOption

MultiplexTransportFilterTimeout sets the timeout waited for filter calls to return.

func MultiplexTransportMaxIncomingConnections Uses

func MultiplexTransportMaxIncomingConnections(n int) MultiplexTransportOption

MultiplexTransportMaxIncomingConnections sets the maximum number of simultaneous connections (incoming). Default: 0 (unlimited)

func MultiplexTransportResolver Uses

func MultiplexTransportResolver(resolver IPResolver) MultiplexTransportOption

MultiplexTransportResolver sets the Resolver used for ip lokkups, defaults to net.DefaultResolver.

type NetAddress Uses

type NetAddress struct {
    ID   ID     `json:"id"`
    IP   net.IP `json:"ip"`
    Port uint16 `json:"port"`

NetAddress defines information about a peer on the network including its ID, IP address, and port.

func CreateRoutableAddr Uses

func CreateRoutableAddr() (addr string, netAddr *NetAddress)

func NetAddressFromProto Uses

func NetAddressFromProto(pb tmp2p.NetAddress) (*NetAddress, error)

NetAddressFromProto converts a Protobuf NetAddress into a native struct.

func NetAddressesFromProto Uses

func NetAddressesFromProto(pbs []tmp2p.NetAddress) ([]*NetAddress, error)

NetAddressesFromProto converts a slice of Protobuf NetAddresses into a native slice.

func NewNetAddress Uses

func NewNetAddress(id ID, addr net.Addr) *NetAddress

NewNetAddress returns a new NetAddress using the provided TCP address. When testing, other net.Addr (except TCP) will result in using When normal run, other net.Addr (except TCP) will panic. Panics if ID is invalid. TODO: socks proxies?

func NewNetAddressIPPort Uses

func NewNetAddressIPPort(ip net.IP, port uint16) *NetAddress

NewNetAddressIPPort returns a new NetAddress using the provided IP and port number.

func NewNetAddressString Uses

func NewNetAddressString(addr string) (*NetAddress, error)

NewNetAddressString returns a new NetAddress using the provided address in the form of "ID@IP:Port". Also resolves the host if host is not an IP. Errors are of type ErrNetAddressXxx where Xxx is in (NoID, Invalid, Lookup)

func NewNetAddressStrings Uses

func NewNetAddressStrings(addrs []string) ([]*NetAddress, []error)

NewNetAddressStrings returns an array of NetAddress'es build using the provided strings.

func (*NetAddress) Dial Uses

func (na *NetAddress) Dial() (net.Conn, error)

Dial calls net.Dial on the address.

func (*NetAddress) DialString Uses

func (na *NetAddress) DialString() string

func (*NetAddress) DialTimeout Uses

func (na *NetAddress) DialTimeout(timeout time.Duration) (net.Conn, error)

DialTimeout calls net.DialTimeout on the address.

func (*NetAddress) Equals Uses

func (na *NetAddress) Equals(other interface{}) bool

Equals reports whether na and other are the same addresses, including their ID, IP, and Port.

func (*NetAddress) HasID Uses

func (na *NetAddress) HasID() bool

HasID returns true if the address has an ID. NOTE: It does not check whether the ID is valid or not.

func (*NetAddress) Local Uses

func (na *NetAddress) Local() bool

Local returns true if it is a local address.

func (*NetAddress) OnionCatTor Uses

func (na *NetAddress) OnionCatTor() bool

func (*NetAddress) RFC1918 Uses

func (na *NetAddress) RFC1918() bool

func (*NetAddress) RFC3849 Uses

func (na *NetAddress) RFC3849() bool

func (*NetAddress) RFC3927 Uses

func (na *NetAddress) RFC3927() bool

func (*NetAddress) RFC3964 Uses

func (na *NetAddress) RFC3964() bool

func (*NetAddress) RFC4193 Uses

func (na *NetAddress) RFC4193() bool

func (*NetAddress) RFC4380 Uses

func (na *NetAddress) RFC4380() bool

func (*NetAddress) RFC4843 Uses

func (na *NetAddress) RFC4843() bool

func (*NetAddress) RFC4862 Uses

func (na *NetAddress) RFC4862() bool

func (*NetAddress) RFC6052 Uses

func (na *NetAddress) RFC6052() bool

func (*NetAddress) RFC6145 Uses

func (na *NetAddress) RFC6145() bool

func (*NetAddress) ReachabilityTo Uses

func (na *NetAddress) ReachabilityTo(o *NetAddress) int

ReachabilityTo checks whenever o can be reached from na.

func (*NetAddress) Routable Uses

func (na *NetAddress) Routable() bool

Routable returns true if the address is routable.

func (*NetAddress) Same Uses

func (na *NetAddress) Same(other interface{}) bool

Same returns true is na has the same non-empty ID or DialString as other.

func (*NetAddress) String Uses

func (na *NetAddress) String() string

String representation: <ID>@<IP>:<PORT>

func (*NetAddress) ToProto Uses

func (na *NetAddress) ToProto() tmp2p.NetAddress

ToProto converts a NetAddress to Protobuf.

func (*NetAddress) Valid Uses

func (na *NetAddress) Valid() error

For IPv4 these are either a 0 or all bits set address. For IPv6 a zero address or one that matches the RFC3849 documentation address format.

type NodeInfo Uses

type NodeInfo interface {
    ID() ID
    // contains filtered or unexported methods

NodeInfo exposes basic info of a node and determines if we're compatible.

type NodeKey Uses

type NodeKey struct {
    PrivKey crypto.PrivKey `json:"priv_key"` // our priv key

NodeKey is the persistent peer key. It contains the nodes private key for authentication.

func LoadNodeKey Uses

func LoadNodeKey(filePath string) (*NodeKey, error)

LoadNodeKey loads NodeKey located in filePath.

func LoadOrGenNodeKey Uses

func LoadOrGenNodeKey(filePath string) (*NodeKey, error)

LoadOrGenNodeKey attempts to load the NodeKey from the given filePath. If the file does not exist, it generates and saves a new NodeKey.

func (*NodeKey) ID Uses

func (nodeKey *NodeKey) ID() ID

ID returns the peer's canonical ID - the hash of its public key.

func (*NodeKey) PubKey Uses

func (nodeKey *NodeKey) PubKey() crypto.PubKey

PubKey returns the peer's PubKey

func (*NodeKey) SaveAs Uses

func (nodeKey *NodeKey) SaveAs(filePath string) error

SaveAs persists the NodeKey to filePath.

type Peer Uses

type Peer interface {

    ID() ID               // peer's cryptographic ID
    RemoteIP() net.IP     // remote IP of the connection
    RemoteAddr() net.Addr // remote address of the connection

    IsOutbound() bool   // did we dial the peer
    IsPersistent() bool // do we redial this peer when we disconnect

    CloseConn() error // close original connection

    NodeInfo() NodeInfo // peer's info
    Status() tmconn.ConnectionStatus
    SocketAddr() *NetAddress // actual address of the socket

    Send(byte, []byte) bool
    TrySend(byte, []byte) bool

    Set(string, interface{})
    Get(string) interface{}

Peer is an interface representing a peer connected on a reactor.

func CreateRandomPeer Uses

func CreateRandomPeer(outbound bool) Peer

type PeerFilterFunc Uses

type PeerFilterFunc func(IPeerSet, Peer) error

PeerFilterFunc to be implemented by filter hooks after a new Peer has been fully setup.

type PeerOption Uses

type PeerOption func(*peer)

func PeerMetrics Uses

func PeerMetrics(metrics *Metrics) PeerOption

type PeerSet Uses

type PeerSet struct {
    // contains filtered or unexported fields

PeerSet is a special structure for keeping a table of peers. Iteration over the peers is super fast and thread-safe.

func NewPeerSet Uses

func NewPeerSet() *PeerSet

NewPeerSet creates a new peerSet with a list of initial capacity of 256 items.

func (*PeerSet) Add Uses

func (ps *PeerSet) Add(peer Peer) error

Add adds the peer to the PeerSet. It returns an error carrying the reason, if the peer is already present.

func (*PeerSet) Get Uses

func (ps *PeerSet) Get(peerKey ID) Peer

Get looks up a peer by the provided peerKey. Returns nil if peer is not found.

func (*PeerSet) Has Uses

func (ps *PeerSet) Has(peerKey ID) bool

Has returns true if the set contains the peer referred to by this peerKey, otherwise false.

func (*PeerSet) HasIP Uses

func (ps *PeerSet) HasIP(peerIP net.IP) bool

HasIP returns true if the set contains the peer referred to by this IP address, otherwise false.

func (*PeerSet) List Uses

func (ps *PeerSet) List() []Peer

List returns the threadsafe list of peers.

func (*PeerSet) Remove Uses

func (ps *PeerSet) Remove(peer Peer) bool

Remove discards peer by its Key, if the peer was previously memoized. Returns true if the peer was removed, and false if it was not found. in the set.

func (*PeerSet) Size Uses

func (ps *PeerSet) Size() int

Size returns the number of unique items in the peerSet.

type ProtocolVersion Uses

type ProtocolVersion struct {
    P2P   uint64 `json:"p2p"`
    Block uint64 `json:"block"`
    App   uint64 `json:"app"`

ProtocolVersion contains the protocol versions for the software.

func NewProtocolVersion Uses

func NewProtocolVersion(p2p, block, app uint64) ProtocolVersion

NewProtocolVersion returns a fully populated ProtocolVersion.

type Reactor Uses

type Reactor interface {
    service.Service // Start, Stop

    // SetSwitch allows setting a switch.

    // GetChannels returns the list of MConnection.ChannelDescriptor. Make sure
    // that each ID is unique across all the reactors added to the switch.
    GetChannels() []*conn.ChannelDescriptor

    // InitPeer is called by the switch before the peer is started. Use it to
    // initialize data for the peer (e.g. peer state).
    // NOTE: The switch won't call AddPeer nor RemovePeer if it fails to start
    // the peer. Do not store any data associated with the peer in the reactor
    // itself unless you don't want to have a state, which is never cleaned up.
    InitPeer(peer Peer) Peer

    // AddPeer is called by the switch after the peer is added and successfully
    // started. Use it to start goroutines communicating with the peer.
    AddPeer(peer Peer)

    // RemovePeer is called by the switch when the peer is stopped (due to error
    // or other reason).
    RemovePeer(peer Peer, reason interface{})

    // Receive is called by the switch when msgBytes is received from the peer.
    // NOTE reactor can not keep msgBytes around after Receive completes without
    // copying.
    // CONTRACT: msgBytes are not nil.
    Receive(chID byte, peer Peer, msgBytes []byte)

Reactor is responsible for handling incoming messages on one or more Channel. Switch calls GetChannels when reactor is added to it. When a new peer joins our node, InitPeer and AddPeer are called. RemovePeer is called when the peer is stopped. Receive is called when a message is received on a channel associated with this reactor.

Peer#Send or Peer#TrySend should be used to send the message to a peer.

type Switch Uses

type Switch struct {
    // contains filtered or unexported fields

Switch handles peer connections and exposes an API to receive incoming messages on `Reactors`. Each `Reactor` is responsible for handling incoming messages of one or more `Channels`. So while sending outgoing messages is typically performed on the peer, incoming messages are received on the reactor.

func MakeConnectedSwitches Uses

func MakeConnectedSwitches(cfg *config.P2PConfig,
    n int,
    initSwitch func(int, *Switch) *Switch,
    connect func([]*Switch, int, int),
) []*Switch

MakeConnectedSwitches returns n switches, connected according to the connect func. If connect==Connect2Switches, the switches will be fully connected. initSwitch defines how the i'th switch should be initialized (ie. with what reactors). NOTE: panics if any switch fails to start.

func MakeSwitch Uses

func MakeSwitch(
    cfg *config.P2PConfig,
    i int,
    network, version string,
    initSwitch func(int, *Switch) *Switch,
    opts ...SwitchOption,
) *Switch

func NewSwitch Uses

func NewSwitch(
    cfg *config.P2PConfig,
    transport Transport,
    options ...SwitchOption,
) *Switch

NewSwitch creates a new Switch with the given config.

func (*Switch) AddPersistentPeers Uses

func (sw *Switch) AddPersistentPeers(addrs []string) error

AddPersistentPeers allows you to set persistent peers. It ignores ErrNetAddressLookup. However, if there are other errors, first encounter is returned.

func (*Switch) AddPrivatePeerIDs Uses

func (sw *Switch) AddPrivatePeerIDs(ids []string) error

func (*Switch) AddReactor Uses

func (sw *Switch) AddReactor(name string, reactor Reactor) Reactor

AddReactor adds the given reactor to the switch. NOTE: Not goroutine safe.

func (*Switch) AddUnconditionalPeerIDs Uses

func (sw *Switch) AddUnconditionalPeerIDs(ids []string) error

func (*Switch) Broadcast Uses

func (sw *Switch) Broadcast(chID byte, msgBytes []byte) chan bool

Broadcast runs a go routine for each attempted send, which will block trying to send for defaultSendTimeoutSeconds. Returns a channel which receives success values for each attempted send (false if times out). Channel will be closed once msg bytes are sent to all peers (or time out).

NOTE: Broadcast uses goroutines, so order of broadcast may not be preserved.

func (*Switch) DialPeerWithAddress Uses

func (sw *Switch) DialPeerWithAddress(addr *NetAddress) error

DialPeerWithAddress dials the given peer and runs sw.addPeer if it connects and authenticates successfully. If we're currently dialing this address or it belongs to an existing peer, ErrCurrentlyDialingOrExistingAddress is returned.

func (*Switch) DialPeersAsync Uses

func (sw *Switch) DialPeersAsync(peers []string) error

DialPeersAsync dials a list of peers asynchronously in random order. Used to dial peers from config on startup or from unsafe-RPC (trusted sources). It ignores ErrNetAddressLookup. However, if there are other errors, first encounter is returned. Nop if there are no peers.

func (*Switch) IsDialingOrExistingAddress Uses

func (sw *Switch) IsDialingOrExistingAddress(addr *NetAddress) bool

IsDialingOrExistingAddress returns true if switch has a peer with the given address or dialing it at the moment.

func (*Switch) IsPeerPersistent Uses

func (sw *Switch) IsPeerPersistent(na *NetAddress) bool

func (*Switch) IsPeerUnconditional Uses

func (sw *Switch) IsPeerUnconditional(id ID) bool

func (*Switch) MarkPeerAsGood Uses

func (sw *Switch) MarkPeerAsGood(peer Peer)

MarkPeerAsGood marks the given peer as good when it did something useful like contributed to consensus.

func (*Switch) MaxNumOutboundPeers Uses

func (sw *Switch) MaxNumOutboundPeers() int

MaxNumOutboundPeers returns a maximum number of outbound peers.

func (*Switch) NetAddress Uses

func (sw *Switch) NetAddress() *NetAddress

NetAddress returns the address the switch is listening on.

func (*Switch) NodeInfo Uses

func (sw *Switch) NodeInfo() NodeInfo

NodeInfo returns the switch's NodeInfo. NOTE: Not goroutine safe.

func (*Switch) NumPeers Uses

func (sw *Switch) NumPeers() (outbound, inbound, dialing int)

NumPeers returns the count of outbound/inbound and outbound-dialing peers. unconditional peers are not counted here.

func (*Switch) OnStart Uses

func (sw *Switch) OnStart() error

OnStart implements BaseService. It starts all the reactors and peers.

func (*Switch) OnStop Uses

func (sw *Switch) OnStop()

OnStop implements BaseService. It stops all peers and reactors.

func (*Switch) Peers Uses

func (sw *Switch) Peers() IPeerSet

Peers returns the set of peers that are connected to the switch.

func (*Switch) Reactor Uses

func (sw *Switch) Reactor(name string) Reactor

Reactor returns the reactor with the given name. NOTE: Not goroutine safe.

func (*Switch) Reactors Uses

func (sw *Switch) Reactors() map[string]Reactor

Reactors returns a map of reactors registered on the switch. NOTE: Not goroutine safe.

func (*Switch) RemoveReactor Uses

func (sw *Switch) RemoveReactor(name string, reactor Reactor)

RemoveReactor removes the given Reactor from the Switch. NOTE: Not goroutine safe.

func (*Switch) SetAddrBook Uses

func (sw *Switch) SetAddrBook(addrBook AddrBook)

SetAddrBook allows to set address book on Switch.

func (*Switch) SetNodeInfo Uses

func (sw *Switch) SetNodeInfo(nodeInfo NodeInfo)

SetNodeInfo sets the switch's NodeInfo for checking compatibility and handshaking with other nodes. NOTE: Not goroutine safe.

func (*Switch) SetNodeKey Uses

func (sw *Switch) SetNodeKey(nodeKey *NodeKey)

SetNodeKey sets the switch's private key for authenticated encryption. NOTE: Not goroutine safe.

func (*Switch) StopPeerForError Uses

func (sw *Switch) StopPeerForError(peer Peer, reason interface{})

StopPeerForError disconnects from a peer due to external error. If the peer is persistent, it will attempt to reconnect. TODO: make record depending on reason.

func (*Switch) StopPeerGracefully Uses

func (sw *Switch) StopPeerGracefully(peer Peer)

StopPeerGracefully disconnects from a peer gracefully. TODO: handle graceful disconnects.

type SwitchOption Uses

type SwitchOption func(*Switch)

SwitchOption sets an optional parameter on the Switch.

func SwitchFilterTimeout Uses

func SwitchFilterTimeout(timeout time.Duration) SwitchOption

SwitchFilterTimeout sets the timeout used for peer filters.

func SwitchPeerFilters Uses

func SwitchPeerFilters(filters ...PeerFilterFunc) SwitchOption

SwitchPeerFilters sets the filters for rejection of new peers.

func WithMetrics Uses

func WithMetrics(metrics *Metrics) SwitchOption

WithMetrics sets the metrics.

type Transport Uses

type Transport interface {
    // Listening address.
    NetAddress() NetAddress

    // Accept returns a newly connected Peer.
    Accept(peerConfig) (Peer, error)

    // Dial connects to the Peer for the address.
    Dial(NetAddress, peerConfig) (Peer, error)

    // Cleanup any resources associated with Peer.

Transport emits and connects to Peers. The implementation of Peer is left to the transport. Each transport is also responsible to filter establishing peers specific to its domain.


upnpTaken from taipei-torrent.

Package p2p imports 36 packages (graph) and is imported by 189 packages. Updated 2020-09-22. Refresh now. Tools for package owners.