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 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 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, msg interface{}) chan bool
- func (sw *Switch) DialPeerWithAddress(addr *NetAddress, persistent bool) (Peer, error)
- func (sw *Switch) DialPeersAsync(addrBook AddrBook, peers []string, persistent bool) error
- func (sw *Switch) FilterConnByAddr(addr net.Addr) error
- func (sw *Switch) FilterConnByPubKey(pubkey crypto.PubKey) error
- func (sw *Switch) IsDialing(id ID) bool
- func (sw *Switch) IsListening() bool
- func (sw *Switch) Listeners() []Listener
- 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) SetAddrFilter(f func(net.Addr) error)
- func (sw *Switch) SetNodeInfo(nodeInfo NodeInfo)
- func (sw *Switch) SetNodeKey(nodeKey *NodeKey)
- func (sw *Switch) SetPubKeyFilter(f func(crypto.PubKey) error)
- 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 IDByteLength = 20
IDByteLength is the length of a crypto.Address. Currently only 20. TODO: support other length addresses ?
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 MaxNodeInfoSize ¶
func MaxNodeInfoSize() int
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 Save() }
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 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 ¶
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", 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 PubKey crypto.PubKey `json:"pub_key"` // authenticated pubkey ListenAddr string `json:"listen_addr"` // accepting incoming // Check compatibility Network string `json:"network"` // network/chain ID Version string `json:"version"` // major.minor.revision Channels []byte `json:"channels"` // channels this node knows about // Sanitize 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/minor versions match 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.
type NodeKey ¶
NodeKey is the persistent peer key. It contains the nodes private key for authentication.
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, interface{}) bool TrySend(byte, interface{}) 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"` 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 send to all peers.
NOTE: Broadcast uses goroutines, so order of broadcast may not be preserved.
func (*Switch) DialPeerWithAddress ¶
func (sw *Switch) DialPeerWithAddress(addr *NetAddress, persistent bool) (Peer, 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).
func (*Switch) FilterConnByAddr ¶ added in v0.10.0
FilterConnByAddr returns an error if connecting to the given address is forbidden.
func (*Switch) FilterConnByPubKey ¶ added in v0.10.0
FilterConnByPubKey returns an error if connecting to the given public key 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) 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) SetAddrFilter ¶ added in v0.10.0
SetAddrFilter sets the function for filtering connections by address.
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) SetPubKeyFilter ¶ added in v0.10.0
SetPubKeyFilter sets the function for filtering connections by public key.
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.