Documentation ¶
Index ¶
- Constants
- Variables
- func AddPeerToSwitch(sw *Switch, peer Peer)
- func Connect2Switches(switches []*Switch, i, j int)
- func CreateRandomPeer(outbound bool) *peer
- func FuzzConn(conn net.Conn) net.Conn
- func FuzzConnAfter(conn net.Conn, d time.Duration) net.Conn
- func FuzzConnAfterFromConfig(conn net.Conn, d time.Duration, config *FuzzConnConfig) net.Conn
- func FuzzConnFromConfig(conn net.Conn, config *FuzzConnConfig) net.Conn
- func IDAddressString(id ID, hostPort string) string
- func MakePoWTarget(difficulty, targetBits uint) []byte
- func MaxNodeInfoSize() int
- func StartSwitches(switches []*Switch) error
- type AddrBook
- type BaseReactor
- type ChannelDescriptor
- type ConnectionStatus
- type DefaultListener
- func (l *DefaultListener) Connections() <-chan net.Conn
- func (l *DefaultListener) ExternalAddress() *NetAddress
- func (l *DefaultListener) InternalAddress() *NetAddress
- func (l *DefaultListener) NetListener() net.Listener
- func (l *DefaultListener) OnStart() error
- func (l *DefaultListener) OnStop()
- func (l *DefaultListener) String() string
- type ErrNetAddressInvalid
- type ErrNetAddressLookup
- type ErrNetAddressNoID
- type ErrSwitchAuthenticationFailure
- type FuzzConnConfig
- type FuzzedConnection
- func (fc *FuzzedConnection) Close() error
- func (fc *FuzzedConnection) Config() *FuzzConnConfig
- func (fc *FuzzedConnection) LocalAddr() net.Addr
- func (fc *FuzzedConnection) Read(data []byte) (n int, err error)
- func (fc *FuzzedConnection) RemoteAddr() net.Addr
- func (fc *FuzzedConnection) SetDeadline(t time.Time) error
- func (fc *FuzzedConnection) SetReadDeadline(t time.Time) error
- func (fc *FuzzedConnection) SetWriteDeadline(t time.Time) error
- func (fc *FuzzedConnection) Write(data []byte) (n int, err error)
- type ID
- type IPeerSet
- type Listener
- type NetAddress
- func CreateRoutableAddr() (addr string, netAddr *NetAddress)
- func NewNetAddress(id ID, addr net.Addr) *NetAddress
- func NewNetAddressIPPort(ip net.IP, port uint16) *NetAddress
- func NewNetAddressString(addr string) (*NetAddress, error)
- func NewNetAddressStringWithOptionalID(addr string) (*NetAddress, error)
- func NewNetAddressStrings(addrs []string) ([]*NetAddress, []error)
- func (na *NetAddress) Dial() (net.Conn, error)
- func (na *NetAddress) DialString() string
- func (na *NetAddress) DialTimeout(timeout time.Duration) (net.Conn, error)
- func (na *NetAddress) Equals(other interface{}) bool
- func (na *NetAddress) Local() bool
- func (na *NetAddress) RFC1918() bool
- func (na *NetAddress) RFC3849() bool
- func (na *NetAddress) RFC3927() bool
- func (na *NetAddress) RFC3964() bool
- func (na *NetAddress) RFC4193() bool
- func (na *NetAddress) RFC4380() bool
- func (na *NetAddress) RFC4843() bool
- func (na *NetAddress) RFC4862() bool
- func (na *NetAddress) RFC6052() bool
- func (na *NetAddress) RFC6145() bool
- func (na *NetAddress) ReachabilityTo(o *NetAddress) int
- func (na *NetAddress) Routable() bool
- func (na *NetAddress) Same(other interface{}) bool
- func (na *NetAddress) String() string
- func (na *NetAddress) Valid() bool
- type NodeInfo
- type NodeKey
- type Peer
- type PeerConfig
- type PeerSet
- type Reactor
- type Switch
- func (sw *Switch) AddListener(l Listener)
- func (sw *Switch) AddReactor(name string, reactor Reactor) Reactor
- func (sw *Switch) Broadcast(chID byte, msgBytes []byte) chan bool
- func (sw *Switch) DialPeerWithAddress(addr *NetAddress, persistent bool) error
- func (sw *Switch) DialPeersAsync(addrBook AddrBook, peers []string, persistent bool) error
- func (sw *Switch) FilterConnByAddr(addr net.Addr) error
- func (sw *Switch) FilterConnByID(id ID) error
- func (sw *Switch) IsDialing(id ID) bool
- func (sw *Switch) IsListening() bool
- func (sw *Switch) Listeners() []Listener
- func (sw *Switch) MarkPeerAsGood(peer Peer)
- func (sw *Switch) NodeInfo() NodeInfo
- func (sw *Switch) NumPeers() (outbound, inbound, dialing int)
- func (sw *Switch) OnStart() error
- func (sw *Switch) OnStop()
- func (sw *Switch) Peers() IPeerSet
- func (sw *Switch) Reactor(name string) Reactor
- func (sw *Switch) Reactors() map[string]Reactor
- func (sw *Switch) SetAddrBook(addrBook AddrBook)
- func (sw *Switch) SetAddrFilter(f func(net.Addr) error)
- func (sw *Switch) SetIDFilter(f func(ID) error)
- func (sw *Switch) SetNodeInfo(nodeInfo NodeInfo)
- func (sw *Switch) SetNodeKey(nodeKey *NodeKey)
- func (sw *Switch) StopPeerForError(peer Peer, reason interface{})
- func (sw *Switch) StopPeerGracefully(peer Peer)
Constants ¶
const ( // FuzzModeDrop is a mode in which we randomly drop reads/writes, connections or sleep FuzzModeDrop = iota // FuzzModeDelay is a mode in which we randomly sleep FuzzModeDelay )
const ( // keep at least this many outbound peers // TODO: move to config DefaultMinNumOutboundPeers = 10 )
const IDByteLength = 20
IDByteLength is the length of a crypto.Address. Currently only 20. TODO: support other length addresses ?
const TEST_HOST = "localhost"
const Version = "0.5.0"
Variables ¶
var ( ErrSwitchDuplicatePeer = errors.New("Duplicate peer") ErrSwitchConnectToSelf = errors.New("Connect to self") )
Functions ¶
func AddPeerToSwitch ¶
func Connect2Switches ¶
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 CreateRandomPeer ¶
func CreateRandomPeer(outbound bool) *peer
func FuzzConnAfter ¶
FuzzConnAfter creates a new FuzzedConnection. Fuzzing starts when the duration elapses.
func FuzzConnAfterFromConfig ¶
FuzzConnAfterFromConfig creates a new FuzzedConnection from a config. Fuzzing starts when the duration elapses.
func FuzzConnFromConfig ¶
func FuzzConnFromConfig(conn net.Conn, config *FuzzConnConfig) net.Conn
FuzzConnFromConfig creates a new FuzzedConnection from a config. Fuzzing starts immediately.
func IDAddressString ¶
IDAddressString returns id@hostPort.
func MakePoWTarget ¶
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 StartSwitches ¶
StartSwitches calls sw.Start() for each given switch. It returns the first encountered error.
Types ¶
type AddrBook ¶
type AddrBook interface { AddAddress(addr *NetAddress, src *NetAddress) error AddOurAddress(*NetAddress) OurAddress(*NetAddress) bool MarkGood(*NetAddress) RemoveAddress(*NetAddress) HasAddress(*NetAddress) bool Save() }
An AddrBook represents an address book from the pex package, which is used to store peer addresses.
type BaseReactor ¶
type BaseReactor struct { cmn.BaseService // Provides Start, Stop, .Quit Switch *Switch }
func NewBaseReactor ¶
func NewBaseReactor(name string, impl Reactor) *BaseReactor
func (*BaseReactor) AddPeer ¶
func (*BaseReactor) AddPeer(peer Peer)
func (*BaseReactor) GetChannels ¶
func (*BaseReactor) GetChannels() []*conn.ChannelDescriptor
func (*BaseReactor) RemovePeer ¶
func (*BaseReactor) RemovePeer(peer Peer, reason interface{})
func (*BaseReactor) SetSwitch ¶
func (br *BaseReactor) SetSwitch(sw *Switch)
type ChannelDescriptor ¶
type ChannelDescriptor = conn.ChannelDescriptor
type ConnectionStatus ¶
type ConnectionStatus = conn.ConnectionStatus
type DefaultListener ¶ added in v0.10.0
type DefaultListener struct { cmn.BaseService // contains filtered or unexported fields }
Implements Listener
func (*DefaultListener) Connections ¶ added in v0.10.0
func (l *DefaultListener) Connections() <-chan net.Conn
A channel of inbound connections. It gets closed when the listener closes.
func (*DefaultListener) ExternalAddress ¶ added in v0.10.0
func (l *DefaultListener) ExternalAddress() *NetAddress
func (*DefaultListener) InternalAddress ¶ added in v0.10.0
func (l *DefaultListener) InternalAddress() *NetAddress
func (*DefaultListener) NetListener ¶ added in v0.10.0
func (l *DefaultListener) NetListener() net.Listener
NOTE: The returned listener is already Accept()'ing. So it's not suitable to pass into http.Serve().
func (*DefaultListener) OnStart ¶ added in v0.10.0
func (l *DefaultListener) OnStart() error
func (*DefaultListener) OnStop ¶ added in v0.10.0
func (l *DefaultListener) OnStop()
func (*DefaultListener) String ¶ added in v0.10.0
func (l *DefaultListener) String() string
type ErrNetAddressInvalid ¶
func (ErrNetAddressInvalid) Error ¶
func (e ErrNetAddressInvalid) Error() string
type ErrNetAddressLookup ¶
func (ErrNetAddressLookup) Error ¶
func (e ErrNetAddressLookup) Error() string
type ErrNetAddressNoID ¶
type ErrNetAddressNoID struct {
Addr string
}
func (ErrNetAddressNoID) Error ¶
func (e ErrNetAddressNoID) Error() string
type ErrSwitchAuthenticationFailure ¶
type ErrSwitchAuthenticationFailure struct { Dialed *NetAddress Got ID }
func (ErrSwitchAuthenticationFailure) Error ¶
func (e ErrSwitchAuthenticationFailure) Error() string
type FuzzConnConfig ¶ added in v0.10.0
type FuzzConnConfig struct { Mode int MaxDelay time.Duration ProbDropRW float64 ProbDropConn float64 ProbSleep float64 }
FuzzConnConfig is a FuzzedConnection configuration.
func DefaultFuzzConnConfig ¶ added in v0.10.0
func DefaultFuzzConnConfig() *FuzzConnConfig
DefaultFuzzConnConfig returns the default config.
type FuzzedConnection ¶
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 ¶
func (fc *FuzzedConnection) Close() error
Close implements net.Conn.
func (*FuzzedConnection) Config ¶
func (fc *FuzzedConnection) Config() *FuzzConnConfig
Config returns the connection's config.
func (*FuzzedConnection) LocalAddr ¶
func (fc *FuzzedConnection) LocalAddr() net.Addr
LocalAddr implements net.Conn.
func (*FuzzedConnection) Read ¶
func (fc *FuzzedConnection) Read(data []byte) (n int, err error)
Read implements net.Conn.
func (*FuzzedConnection) RemoteAddr ¶
func (fc *FuzzedConnection) RemoteAddr() net.Addr
RemoteAddr implements net.Conn.
func (*FuzzedConnection) SetDeadline ¶
func (fc *FuzzedConnection) SetDeadline(t time.Time) error
SetDeadline implements net.Conn.
func (*FuzzedConnection) SetReadDeadline ¶
func (fc *FuzzedConnection) SetReadDeadline(t time.Time) error
SetReadDeadline implements net.Conn.
func (*FuzzedConnection) SetWriteDeadline ¶
func (fc *FuzzedConnection) SetWriteDeadline(t time.Time) error
SetWriteDeadline implements net.Conn.
type ID ¶
type ID string
ID is a hex-encoded crypto.Address
func PubKeyToID ¶
PubKeyToID returns the ID corresponding to the given PubKey. It's the hex-encoding of the pubKey.Address().
type Listener ¶ added in v0.10.0
type Listener interface { Connections() <-chan net.Conn InternalAddress() *NetAddress ExternalAddress() *NetAddress String() string Stop() error }
type NetAddress ¶
type NetAddress struct { ID ID `json:"id"` IP net.IP `json:"ip"` Port uint16 `json:"port"` // contains filtered or unexported fields }
NetAddress defines information about a peer on the network including its ID, IP address, and port.
func CreateRoutableAddr ¶
func CreateRoutableAddr() (addr string, netAddr *NetAddress)
func NewNetAddress ¶
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 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 "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 NewNetAddressStringWithOptionalID ¶
func NewNetAddressStringWithOptionalID(addr string) (*NetAddress, error)
NewNetAddressStringWithOptionalID returns a new NetAddress using the provided address in the form of "ID@IP:Port", where the ID is optional. 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
func (*NetAddress) DialTimeout ¶
DialTimeout calls net.DialTimeout on the address.
func (*NetAddress) Equals ¶
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) Local ¶
func (na *NetAddress) Local() bool
Local returns true if it is a local address.
func (*NetAddress) RFC1918 ¶
func (na *NetAddress) RFC1918() bool
func (*NetAddress) RFC3849 ¶
func (na *NetAddress) RFC3849() bool
func (*NetAddress) RFC3927 ¶
func (na *NetAddress) RFC3927() bool
func (*NetAddress) RFC3964 ¶
func (na *NetAddress) RFC3964() bool
func (*NetAddress) RFC4193 ¶
func (na *NetAddress) RFC4193() bool
func (*NetAddress) RFC4380 ¶
func (na *NetAddress) RFC4380() bool
func (*NetAddress) RFC4843 ¶
func (na *NetAddress) RFC4843() bool
func (*NetAddress) RFC4862 ¶
func (na *NetAddress) RFC4862() bool
func (*NetAddress) RFC6052 ¶
func (na *NetAddress) RFC6052() bool
func (*NetAddress) RFC6145 ¶
func (na *NetAddress) RFC6145() bool
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) Same ¶
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 ¶
func (na *NetAddress) String() string
String representation: <ID>@<IP>:<PORT>
func (*NetAddress) Valid ¶
func (na *NetAddress) Valid() bool
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 { // Authenticate // TODO: replace with NetAddress ID 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 cmn.HexBytes `json:"channels"` // channels this node knows about // ASCIIText fields Moniker string `json:"moniker"` // arbitrary moniker Other []string `json:"other"` // other application specific data }
NodeInfo is the basic node information exchanged between two peers during the Tendermint P2P handshake.
func (NodeInfo) CompatibleWith ¶ added in v0.10.0
CompatibleWith checks if two NodeInfo are compatible with eachother. CONTRACT: two nodes are compatible if the major version matches and network match and they have at least one channel in common.
func (NodeInfo) NetAddress ¶ added in v0.16.0
func (info NodeInfo) NetAddress() *NetAddress
NetAddress returns a NetAddress derived from the NodeInfo - 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 (NodeInfo) Validate ¶ added in v0.16.0
Validate checks the self-reported NodeInfo 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 NodeKey ¶
NodeKey is the persistent peer key. It contains the nodes private key for authentication.
func LoadNodeKey ¶
func LoadOrGenNodeKey ¶
LoadOrGenNodeKey attempts to load the NodeKey from the given filePath. If the file does not exist, it generates and saves a new NodeKey.
type Peer ¶
type Peer interface { cmn.Service ID() ID // peer's cryptographic ID IsOutbound() bool // did we dial the peer IsPersistent() bool // do we redial this peer when we disconnect NodeInfo() NodeInfo // peer's info Status() tmconn.ConnectionStatus 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.
type PeerConfig ¶ added in v0.10.0
type PeerConfig struct { AuthEnc bool `mapstructure:"auth_enc"` // authenticated encryption // times are in seconds HandshakeTimeout time.Duration `mapstructure:"handshake_timeout"` DialTimeout time.Duration `mapstructure:"dial_timeout"` MConfig *tmconn.MConnConfig `mapstructure:"connection"` DialFail bool `mapstructure:"dial_fail"` // for testing Fuzz bool `mapstructure:"fuzz"` // fuzz connection (for testing) FuzzConfig *FuzzConnConfig `mapstructure:"fuzz_config"` }
PeerConfig is a Peer configuration.
func DefaultPeerConfig ¶ added in v0.10.0
func DefaultPeerConfig() *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 ¶
Add adds the peer to the PeerSet. It returns ErrSwitchDuplicatePeer if the peer is already present.
func (*PeerSet) Has ¶
Has returns true iff the PeerSet contains the peer referred to by this peerKey.
type Reactor ¶
type Reactor interface { cmn.Service // Start, Stop // SetSwitch allows setting a switch. SetSwitch(*Switch) // GetChannels returns the list of channel descriptors. GetChannels() []*conn.ChannelDescriptor // AddPeer is called by the switch when a new peer is added. 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 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) }
type Switch ¶
type Switch struct { cmn.BaseService // 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 ¶
func MakeConnectedSwitches(cfg *cfg.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 ¶
func (*Switch) AddListener ¶ added in v0.10.0
AddListener adds the given listener to the switch for listening to incoming peer connections. NOTE: Not goroutine safe.
func (*Switch) AddReactor ¶
AddReactor adds the given reactor to the switch. NOTE: Not goroutine safe.
func (*Switch) Broadcast ¶
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 ¶
func (sw *Switch) DialPeerWithAddress(addr *NetAddress, persistent bool) error
DialPeerWithAddress dials the given peer and runs sw.addPeer if it connects and authenticates successfully. If `persistent == true`, the switch will always try to reconnect to this peer if the connection ever fails.
func (*Switch) DialPeersAsync ¶
DialPeersAsync dials a list of peers asynchronously in random order (optionally, making them persistent). Used to dial peers from config on startup or from unsafe-RPC (trusted sources). TODO: remove addrBook arg since it's now set on the switch
func (*Switch) FilterConnByAddr ¶ added in v0.10.0
FilterConnByAddr returns an error if connecting to the given address is forbidden.
func (*Switch) FilterConnByID ¶ added in v0.17.0
FilterConnByID returns an error if connecting to the given peer ID is forbidden.
func (*Switch) IsDialing ¶ added in v0.10.0
IsDialing returns true if the switch is currently dialing the given ID.
func (*Switch) IsListening ¶ added in v0.10.0
IsListening returns true if the switch has at least one listener. NOTE: Not goroutine safe.
func (*Switch) Listeners ¶ added in v0.10.0
Listeners returns the list of listeners the switch listens on. NOTE: Not goroutine safe.
func (*Switch) MarkPeerAsGood ¶
MarkPeerAsGood marks the given peer as good when it did something useful like contributed to consensus.
func (*Switch) NumPeers ¶
NumPeers returns the count of outbound/inbound and outbound-dialing peers.
func (*Switch) OnStart ¶
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) Reactors ¶
Reactors returns a map of reactors registered on the switch. NOTE: Not goroutine safe.
func (*Switch) SetAddrBook ¶
SetAddrBook allows to set address book on Switch.
func (*Switch) SetAddrFilter ¶ added in v0.10.0
SetAddrFilter sets the function for filtering connections by address.
func (*Switch) SetIDFilter ¶ added in v0.17.0
SetIDFilter sets the function for filtering connections by peer ID.
func (*Switch) SetNodeInfo ¶
SetNodeInfo sets the switch's NodeInfo for checking compatibility and handshaking with other nodes. NOTE: Not goroutine safe.
func (*Switch) SetNodeKey ¶
SetNodeKey sets the switch's private key for authenticated encryption. NOTE: Not goroutine safe.
func (*Switch) StopPeerForError ¶
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 ¶
StopPeerGracefully disconnects from a peer gracefully. TODO: handle graceful disconnects.