p2p

package
v1.1.7 Latest Latest
Warning

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

Go to latest
Published: Nov 11, 2020 License: AGPL-3.0 Imports: 30 Imported by: 5

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrDuplicatePeer  = errors.New("Duplicate peer")
	ErrConnectSelf    = errors.New("Connect self")
	ErrConnectSpvPeer = errors.New("Outbound connect spv peer")
)

pre-define errors for connecting fail

View Source
var PanicOnAddPeerErr = false

PanicOnAddPeerErr add peer error

Functions

func Connect2Switches

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

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

func ExternalIPv4

func ExternalIPv4() (string, error)

ExternalIPv4 returns the first IPv4 available.

Types

type BaseReactor

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

BaseReactor base service of a reactor

func NewBaseReactor

func NewBaseReactor(name string, impl Reactor) *BaseReactor

NewBaseReactor create new base Reactor

func (*BaseReactor) AddPeer

func (*BaseReactor) AddPeer(peer *Peer)

AddPeer is called by the switch when a new peer is added

func (*BaseReactor) GetChannels

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

GetChannels returns the list of channel descriptors

func (*BaseReactor) Receive

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

Receive is called when msgBytes is received from peer

func (*BaseReactor) RemovePeer

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

RemovePeer is called by the switch when the peer is stopped (due to error or other reason)

func (*BaseReactor) SetSwitch

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

SetSwitch setting a switch for reactor

type DefaultListener

type DefaultListener struct {
	cmn.BaseService
	// contains filtered or unexported fields
}

DefaultListener Implements vapord server Listener

func (*DefaultListener) Connections

func (l *DefaultListener) Connections() <-chan net.Conn

Connections a channel of inbound connections. It gets closed when the listener closes.

func (*DefaultListener) ExternalAddress

func (l *DefaultListener) ExternalAddress() *NetAddress

ExternalAddress listener external address for remote peer dial

func (*DefaultListener) InternalAddress

func (l *DefaultListener) InternalAddress() *NetAddress

InternalAddress listener internal address

func (*DefaultListener) NetListener

func (l *DefaultListener) NetListener() net.Listener

NetListener the returned listener is already Accept()'ing. So it's not suitable to pass into http.Serve().

func (*DefaultListener) OnStart

func (l *DefaultListener) OnStart() error

OnStart start listener

func (*DefaultListener) OnStop

func (l *DefaultListener) OnStop()

OnStop stop listener

func (*DefaultListener) String

func (l *DefaultListener) String() string

String string of default listener

type IPeerSet

type IPeerSet interface {
	Has(key string) bool
	Get(key string) *Peer
	List() []*Peer
	Size() int
}

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

type Listener

type Listener interface {
	Connections() <-chan net.Conn
	InternalAddress() *NetAddress
	ExternalAddress() *NetAddress
	String() string
	Stop() bool
}

Listener subset of the methods of DefaultListener

func GetListener

func GetListener(config *cfg.P2PConfig) (Listener, string)

GetListener get listener and listen address.

func NewDefaultListener

func NewDefaultListener(protocol string, lAddr string, skipUPNP bool) (Listener, bool)

NewDefaultListener create a default listener

type NetAddress

type NetAddress struct {
	IP   net.IP
	Port uint16
	// contains filtered or unexported fields
}

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

func CreateRoutableAddr

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

func NewLANNetAddressIPPort

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

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

func NewNetAddress

func NewNetAddress(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 0.0.0.0:0. When normal run, other net.Addr (except TCP) will panic. TODO: socks proxies?

func NewNetAddressIPPort

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

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

func NewNetAddressString

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

NewNetAddressString returns a new NetAddress using the provided address in the form of "IP:Port". Also resolves the host if host is not an IP.

func NewNetAddressStrings

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

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

func (*NetAddress) Dial

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

Dial calls net.Dial on the address.

func (*NetAddress) DialString

func (na *NetAddress) DialString() string

DialString dial address string representation

func (*NetAddress) DialTimeout

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

DialTimeout calls net.DialTimeout on the address.

func (*NetAddress) DialTimeoutWithProxy

func (na *NetAddress) DialTimeoutWithProxy(proxy *socks.Proxy, timeout time.Duration) (net.Conn, error)

DialTimeoutWithProxy calls socks.Proxy.DialTimeout on the address.

func (*NetAddress) Equals

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

Equals reports whether na and other are the same addresses.

func (*NetAddress) Local

func (na *NetAddress) Local() bool

Local returns true if it is a local address.

func (*NetAddress) RFC1918

func (na *NetAddress) RFC1918() bool

RFC1918 IPv4 Private networks (10.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12)

func (*NetAddress) RFC3849

func (na *NetAddress) RFC3849() bool

RFC3849 IPv6 Documentation address (2001:0DB8::/32)

func (*NetAddress) RFC3927

func (na *NetAddress) RFC3927() bool

RFC3927 IPv4 Autoconfig (169.254.0.0/16)

func (*NetAddress) RFC3964

func (na *NetAddress) RFC3964() bool

RFC3964 IPv6 6to4 (2002::/16)

func (*NetAddress) RFC4193

func (na *NetAddress) RFC4193() bool

RFC4193 IPv6 unique local (FC00::/7)

func (*NetAddress) RFC4380

func (na *NetAddress) RFC4380() bool

RFC4380 IPv6 Teredo tunneling (2001::/32)

func (*NetAddress) RFC4843

func (na *NetAddress) RFC4843() bool

RFC4843 IPv6 ORCHID: (2001:10::/28)

func (*NetAddress) RFC4862

func (na *NetAddress) RFC4862() bool

RFC4862 IPv6 Autoconfig (FE80::/64)

func (*NetAddress) RFC6052

func (na *NetAddress) RFC6052() bool

RFC6052 IPv6 well known prefix (64:FF9B::/96)

func (*NetAddress) RFC6145

func (na *NetAddress) RFC6145() bool

RFC6145 IPv6 IPv4 translated address ::FFFF:0:0:0/96

func (*NetAddress) ReachabilityTo

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

ReachabilityTo checks whenever o can be reached from na.

func (*NetAddress) Routable

func (na *NetAddress) Routable() bool

Routable returns true if the address is routable.

func (*NetAddress) String

func (na *NetAddress) String() string

String representation.

func (*NetAddress) Valid

func (na *NetAddress) Valid() bool

Valid 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

type NodeInfo struct {
	PubKey  string `json:"pub_key"`
	Moniker string `json:"moniker"`
	Network string `json:"network"`
	//NetworkID used to isolate subnets with same network name
	NetworkID   uint64                `json:"network_id"`
	RemoteAddr  string                `json:"remote_addr"`
	ListenAddr  string                `json:"listen_addr"`
	Version     string                `json:"version"` // major.minor.revision
	ServiceFlag consensus.ServiceFlag `json:"service_flag"`
	// other application specific data
	Other []string `json:"other"`
}

NodeInfo peer node info

func NewNodeInfo

func NewNodeInfo(config *cfg.Config, pubkey signlib.PubKey, listenAddr string, netID uint64) *NodeInfo

func (NodeInfo) DoFilter

func (info NodeInfo) DoFilter(ip string, pubKey string) error

func (NodeInfo) RemoteAddrHost added in v0.3.0

func (info NodeInfo) RemoteAddrHost() string

remoteAddrHost peer external ip address

func (NodeInfo) String

func (info NodeInfo) String() string

String representation

type Peer

type Peer struct {
	cmn.BaseService
	*NodeInfo

	Key string
	// contains filtered or unexported fields
}

Peer represent a bytom network node

func CreateRandomPeer

func CreateRandomPeer(outbound bool) *Peer

func (*Peer) Addr

func (p *Peer) Addr() net.Addr

Addr returns peer's remote network address.

func (*Peer) CanSend

func (p *Peer) CanSend(chID byte) bool

CanSend returns true if the send queue is not full, false otherwise.

func (Peer) CloseConn

func (pc Peer) CloseConn()

CloseConn should be used when the peer was created, but never started.

func (*Peer) Equals

func (p *Peer) Equals(other *Peer) bool

Equals reports whenever 2 peers are actually represent the same node.

func (Peer) HandshakeTimeout

func (pc Peer) HandshakeTimeout(ourNodeInfo *NodeInfo, timeout time.Duration) (*NodeInfo, error)

HandshakeTimeout performs a handshake between a given node and the peer. NOTE: blocking

func (*Peer) ID

func (p *Peer) ID() string

ID return the uuid of the peer

func (*Peer) IsLAN

func (p *Peer) IsLAN() bool

IsLAN returns true if peer is LAN peer, false otherwise.

func (*Peer) IsOutbound

func (p *Peer) IsOutbound() bool

IsOutbound returns true if the connection is outbound, false otherwise.

func (*Peer) Moniker added in v1.0.2

func (p *Peer) Moniker() string

Moniker returns peer's moniker.

func (*Peer) OnStart

func (p *Peer) OnStart() error

OnStart implements BaseService.

func (*Peer) OnStop

func (p *Peer) OnStop()

OnStop implements BaseService.

func (*Peer) PubKey

func (p *Peer) PubKey() string

PubKey returns peer's public key.

func (*Peer) Send

func (p *Peer) Send(chID byte, msg interface{}) bool

Send msg to the channel identified by chID byte. Returns false if the send queue is full after timeout, specified by MConnection.

func (*Peer) ServiceFlag

func (p *Peer) ServiceFlag() consensus.ServiceFlag

ServiceFlag return the ServiceFlag of this peer

func (*Peer) String

func (p *Peer) String() string

String representation.

func (*Peer) TrafficStatus

func (p *Peer) TrafficStatus() (*flowrate.Status, *flowrate.Status)

TrafficStatus return the in and out traffic status

func (*Peer) TrySend

func (p *Peer) TrySend(chID byte, msg interface{}) bool

TrySend msg to the channel identified by chID byte. Immediately returns false if the send queue is full.

type PeerConfig

type PeerConfig struct {
	HandshakeTimeout time.Duration           `mapstructure:"handshake_timeout"` // times are in seconds
	DialTimeout      time.Duration           `mapstructure:"dial_timeout"`
	ProxyAddress     string                  `mapstructure:"proxy_address"`
	ProxyUsername    string                  `mapstructure:"proxy_username"`
	ProxyPassword    string                  `mapstructure:"proxy_password"`
	MConfig          *connection.MConnConfig `mapstructure:"connection"`
}

PeerConfig is a Peer configuration.

func DefaultPeerConfig

func DefaultPeerConfig(config *cfg.P2PConfig) *PeerConfig

DefaultPeerConfig returns the default config.

type PeerSet

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

func NewPeerSet() *PeerSet

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

func (*PeerSet) Add

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

Add adds the peer to the PeerSet. Returns false if peer with key (PubKeyEd25519) is already set

func (*PeerSet) DoFilter

func (ps *PeerSet) DoFilter(ip string, pubKey string) error

func (*PeerSet) Get

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

Get looks up a peer by the provided peerKey.

func (*PeerSet) Has

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

Has returns true if the PeerSet contains the peer referred to by this peerKey.

func (*PeerSet) List

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

List threadsafe list of peers.

func (*PeerSet) Remove

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

Remove discards peer if the peer was previously memoized.

func (*PeerSet) Size

func (ps *PeerSet) Size() int

Size returns the number of unique items in the peerSet.

type Reactor

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

	// SetSwitch allows setting a switch.
	SetSwitch(*Switch)

	// GetChannels returns the list of channel descriptors.
	GetChannels() []*connection.ChannelDescriptor

	// AddPeer is called by the switch when a new peer is added.
	AddPeer(peer *Peer) error

	// 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 when msgBytes is received from 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 of one or more `Channels`

type Security

type Security interface {
	DoFilter(ip string, pubKey string) error
	IsBanned(ip string, level byte, reason string) bool
	RegisterFilter(filter security.Filter)
	Start() error
}

type Switch

type Switch struct {
	cmn.BaseService

	Config *cfg.Config
	// 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 MakeSwitch

func MakeSwitch(cfg *cfg.Config, testdb dbm.DB, privKey signlib.PrivKey, initSwitch func(*Switch) *Switch) *Switch

func NewSwitch

func NewSwitch(config *cfg.Config, discv discv, lanDiscv lanDiscv, l Listener, privKey signlib.PrivKey, listenAddr string, netID uint64) (*Switch, error)

newSwitch creates a new Switch with the given config.

func NewSwitchMaybeDiscover added in v1.0.2

func NewSwitchMaybeDiscover(config *cfg.Config) (*Switch, error)

NewSwitchMaybeDiscover create a new Switch and set discover.

func (*Switch) AddListener

func (sw *Switch) AddListener(l Listener)

AddListener adds the given listener to the switch for listening to incoming peer connections. NOTE: Not goroutine safe.

func (*Switch) AddPeer

func (sw *Switch) AddPeer(pc *peerConn, isLAN bool) error

AddPeer performs the P2P handshake with a peer that already has a SecretConnection. If all goes well, it starts the peer and adds it to the switch. NOTE: This performs a blocking handshake before the peer is added. CONTRACT: If error is returned, peer is nil, and conn is immediately closed.

func (*Switch) AddReactor

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

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

func (*Switch) DialPeerWithAddress

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

DialPeerWithAddress dial node from net address

func (*Switch) DialPeers added in v1.0.2

func (sw *Switch) DialPeers(addresses []*NetAddress)

func (*Switch) GetDiscv added in v1.0.2

func (sw *Switch) GetDiscv() discv

func (*Switch) GetNodeInfo added in v1.0.2

func (sw *Switch) GetNodeInfo() *NodeInfo

func (*Switch) GetPeers added in v1.0.2

func (sw *Switch) GetPeers() *PeerSet

func (*Switch) GetReactors added in v1.0.2

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

func (*Switch) GetSecurity added in v1.0.2

func (sw *Switch) GetSecurity() Security

func (*Switch) IsBanned

func (sw *Switch) IsBanned(ip string, level byte, reason string) bool

func (*Switch) IsDialing

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

IsDialing prevent duplicate dialing

func (*Switch) IsListening

func (sw *Switch) IsListening() bool

IsListening returns true if the switch has at least one listener. NOTE: Not goroutine safe.

func (*Switch) Listeners

func (sw *Switch) Listeners() []Listener

Listeners returns the list of listeners the switch listens on. NOTE: Not goroutine safe.

func (*Switch) NumPeers

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

NumPeers Returns the count of outbound/inbound and outbound-dialing peers.

func (*Switch) OnStart

func (sw *Switch) OnStart() error

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

func (*Switch) OnStop

func (sw *Switch) OnStop()

OnStop implements BaseService. It stops all listeners, peers, and reactors.

func (*Switch) Peers

func (sw *Switch) Peers() *PeerSet

Peers return switch peerset

func (*Switch) StopPeerForError

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

StopPeerForError disconnects from a peer due to external error.

func (*Switch) StopPeerGracefully

func (sw *Switch) StopPeerGracefully(peerID string)

StopPeerGracefully disconnect from a peer gracefully.

type VersionCompatibleWith

type VersionCompatibleWith func(remoteVerStr string) (bool, error)

Directories

Path Synopsis
discover
dht
Package discv5 implements the RLPx v5 Topic Discovery Protocol.
Package discv5 implements the RLPx v5 Topic Discovery Protocol.
Package netutil contains extensions to the net package.
Package netutil contains extensions to the net package.
Taken from taipei-torrent Just enough UPnP to be able to forward ports
Taken from taipei-torrent Just enough UPnP to be able to forward ports

Jump to

Keyboard shortcuts

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