Documentation ¶
Index ¶
- type CommandType
- type DefaultDiscovery
- func (d *DefaultDiscovery) BackFill(addrs ...string)
- func (d *DefaultDiscovery) BadPeers() []string
- func (d *DefaultDiscovery) GoodPeers() []string
- func (d *DefaultDiscovery) PoolCount() int
- func (d *DefaultDiscovery) RegisterBadAddr(addr string)
- func (d *DefaultDiscovery) RegisterConnectedAddr(addr string)
- func (d *DefaultDiscovery) RegisterGoodAddr(s string)
- func (d *DefaultDiscovery) RequestRemote(n int)
- func (d *DefaultDiscovery) UnconnectedPeers() []string
- func (d *DefaultDiscovery) UnregisterConnectedAddr(s string)
- type Discoverer
- type Message
- type Peer
- type RelayReason
- type Server
- func (s *Server) BadPeers() []string
- func (s *Server) HandshakedPeersCount() int
- func (s *Server) ID() uint32
- func (s *Server) MkMsg(cmd CommandType, p payload.Payload) *Message
- func (s *Server) PeerCount() int
- func (s *Server) Peers() map[Peer]bool
- func (s *Server) RelayTxn(t *transaction.Transaction) RelayReason
- func (s *Server) Shutdown()
- func (s *Server) Start(errChan chan error)
- func (s *Server) UnconnectedPeers() []string
- type ServerConfig
- type TCPPeer
- func (p *TCPPeer) Disconnect(err error)
- func (p *TCPPeer) EnqueueHPPacket(msg []byte) error
- func (p *TCPPeer) EnqueueMessage(msg *Message) error
- func (p *TCPPeer) EnqueueP2PMessage(msg *Message) error
- func (p *TCPPeer) EnqueueP2PPacket(msg []byte) error
- func (p *TCPPeer) EnqueuePacket(msg []byte) error
- func (p *TCPPeer) HandlePong(pong *payload.Ping) error
- func (p *TCPPeer) HandleVersion(version *payload.Version) error
- func (p *TCPPeer) HandleVersionAck() error
- func (p *TCPPeer) Handshaked() bool
- func (p *TCPPeer) LastBlockIndex() uint32
- func (p *TCPPeer) PeerAddr() net.Addr
- func (p *TCPPeer) RemoteAddr() net.Addr
- func (p *TCPPeer) SendPing(msg *Message) error
- func (p *TCPPeer) SendVersion() error
- func (p *TCPPeer) SendVersionAck(msg *Message) error
- func (p *TCPPeer) StartProtocol()
- func (p *TCPPeer) Version() *payload.Version
- type TCPTransport
- type Transporter
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type CommandType ¶
type CommandType string
CommandType represents the type of a message command.
const ( CMDAddr CommandType = "addr" CMDBlock CommandType = "block" CMDConsensus CommandType = "consensus" CMDFilterAdd CommandType = "filteradd" CMDFilterClear CommandType = "filterclear" CMDFilterLoad CommandType = "filterload" CMDGetAddr CommandType = "getaddr" CMDGetBlocks CommandType = "getblocks" CMDGetData CommandType = "getdata" CMDGetHeaders CommandType = "getheaders" CMDHeaders CommandType = "headers" CMDInv CommandType = "inv" CMDMempool CommandType = "mempool" CMDMerkleBlock CommandType = "merkleblock" CMDPing CommandType = "ping" CMDPong CommandType = "pong" CMDTX CommandType = "tx" CMDUnknown CommandType = "unknown" CMDVerack CommandType = "verack" CMDVersion CommandType = "version" )
Valid protocol commands used to send between nodes.
type DefaultDiscovery ¶
type DefaultDiscovery struct {
// contains filtered or unexported fields
}
DefaultDiscovery default implementation of the Discoverer interface.
func NewDefaultDiscovery ¶
func NewDefaultDiscovery(dt time.Duration, ts Transporter) *DefaultDiscovery
NewDefaultDiscovery returns a new DefaultDiscovery.
func (*DefaultDiscovery) BackFill ¶
func (d *DefaultDiscovery) BackFill(addrs ...string)
BackFill implements the Discoverer interface and will backfill the the pool with the given addresses.
func (*DefaultDiscovery) BadPeers ¶
func (d *DefaultDiscovery) BadPeers() []string
BadPeers returns all addresses of bad addrs.
func (*DefaultDiscovery) GoodPeers ¶
func (d *DefaultDiscovery) GoodPeers() []string
GoodPeers returns all addresses of known good peers (that at least once succeeded handshaking with us).
func (*DefaultDiscovery) PoolCount ¶
func (d *DefaultDiscovery) PoolCount() int
PoolCount returns the number of available node addresses.
func (*DefaultDiscovery) RegisterBadAddr ¶
func (d *DefaultDiscovery) RegisterBadAddr(addr string)
RegisterBadAddr registers the given address as a bad address.
func (*DefaultDiscovery) RegisterConnectedAddr ¶ added in v0.72.0
func (d *DefaultDiscovery) RegisterConnectedAddr(addr string)
RegisterConnectedAddr tells discoverer that given address is now connected.
func (*DefaultDiscovery) RegisterGoodAddr ¶
func (d *DefaultDiscovery) RegisterGoodAddr(s string)
RegisterGoodAddr registers good known connected address that passed handshake successfully.
func (*DefaultDiscovery) RequestRemote ¶
func (d *DefaultDiscovery) RequestRemote(n int)
RequestRemote tries to establish a connection with n nodes.
func (*DefaultDiscovery) UnconnectedPeers ¶
func (d *DefaultDiscovery) UnconnectedPeers() []string
UnconnectedPeers returns all addresses of unconnected addrs.
func (*DefaultDiscovery) UnregisterConnectedAddr ¶
func (d *DefaultDiscovery) UnregisterConnectedAddr(s string)
UnregisterConnectedAddr tells discoverer that this address is no longer connected, but it still is considered as good one.
type Discoverer ¶
type Discoverer interface { BackFill(...string) PoolCount() int RequestRemote(int) RegisterBadAddr(string) RegisterGoodAddr(string) RegisterConnectedAddr(string) UnregisterConnectedAddr(string) UnconnectedPeers() []string BadPeers() []string GoodPeers() []string }
Discoverer is an interface that is responsible for maintaining a healthy connection pool.
type Message ¶
type Message struct { // NetMode of the node that sends this message. Magic config.NetMode // Command is utf8 code, of which the length is 12 bytes, // the extra part is filled with 0. Command [cmdSize]byte // Length of the payload. Length uint32 // Checksum is the first 4 bytes of the value that two times SHA256 // hash of the payload. Checksum uint32 // Payload send with the message. Payload payload.Payload }
Message is the complete message send between nodes.
func NewMessage ¶
NewMessage returns a new message with the given payload.
func (*Message) Bytes ¶ added in v0.72.0
Bytes serializes a Message into the new allocated buffer and returns it.
func (*Message) CommandType ¶
func (m *Message) CommandType() CommandType
CommandType converts the 12 byte command slice to a CommandType.
type Peer ¶
type Peer interface { // RemoteAddr returns the remote address that we're connected to now. RemoteAddr() net.Addr // PeerAddr returns the remote address that should be used to establish // a new connection to the node. It can differ from the RemoteAddr // address in case where the remote node is a client and its current // connection port is different from the one the other node should use // to connect to it. It's only valid after the handshake is completed, // before that it returns the same address as RemoteAddr. PeerAddr() net.Addr Disconnect(error) // EnqueueMessage is a temporary wrapper that sends a message via // EnqueuePacket if there is no error in serializing it. EnqueueMessage(*Message) error // EnqueuePacket is a blocking packet enqueuer, it doesn't return until // it puts given packet into the queue. It accepts a slice of bytes that // can be shared with other queues (so that message marshalling can be // done once for all peers). Does nothing is the peer is not yet // completed handshaking. EnqueuePacket([]byte) error // EnqueueP2PMessage is a temporary wrapper that sends a message via // EnqueueP2PPacket if there is no error in serializing it. EnqueueP2PMessage(*Message) error // EnqueueP2PPacket is a blocking packet enqueuer, it doesn't return until // it puts given packet into the queue. It accepts a slice of bytes that // can be shared with other queues (so that message marshalling can be // done once for all peers). Does nothing is the peer is not yet // completed handshaking. This queue is intended to be used for unicast // peer to peer communication that is more important than broadcasts // (handled by EnqueuePacket), but less important than high-priority // messages (handled by EnqueueHPPacket). EnqueueP2PPacket([]byte) error // EnqueueHPPacket is a blocking high priority packet enqueuer, it // doesn't return until it puts given packet into the high-priority // queue. EnqueueHPPacket([]byte) error Version() *payload.Version LastBlockIndex() uint32 Handshaked() bool // SendPing enqueues a ping message to be sent to the peer and does // appropriate protocol handling like timeouts and outstanding pings // management. SendPing(*Message) error // SendVersion checks handshake status and sends a version message to // the peer. SendVersion() error SendVersionAck(*Message) error // StartProtocol is a goroutine to be run after the handshake. It // implements basic peer-related protocol handling. StartProtocol() HandleVersion(*payload.Version) error HandleVersionAck() error // HandlePong checks pong contents against Peer's state and updates it. HandlePong(pong *payload.Ping) error }
Peer represents a network node neo-go is connected to.
type RelayReason ¶
type RelayReason uint8
RelayReason is the type which describes the different relay outcome.
const ( RelaySucceed RelayReason = iota RelayAlreadyExists RelayOutOfMemory RelayUnableToVerify RelayInvalid RelayPolicyFail RelayUnknown )
List of valid RelayReason.
type Server ¶
type Server struct { // ServerConfig holds the Server configuration. ServerConfig // contains filtered or unexported fields }
Server represents the local Node in the network. Its transport could be of any kind.
func NewServer ¶
func NewServer(config ServerConfig, chain core.Blockchainer, log *zap.Logger) (*Server, error)
NewServer returns a new Server, initialized with the given configuration.
func (*Server) HandshakedPeersCount ¶ added in v0.70.1
HandshakedPeersCount returns the number of connected peers which have already performed handshake.
func (*Server) MkMsg ¶ added in v0.72.0
func (s *Server) MkMsg(cmd CommandType, p payload.Payload) *Message
MkMsg creates a new message based on the server configured network and given parameters.
func (*Server) RelayTxn ¶
func (s *Server) RelayTxn(t *transaction.Transaction) RelayReason
RelayTxn a new transaction to the local node and the connected peers. Reference: the method OnRelay in C#: https://github.com/neo-project/neo/blob/master/neo/Network/P2P/LocalNode.cs#L159
func (*Server) Shutdown ¶
func (s *Server) Shutdown()
Shutdown disconnects all peers and stops listening.
func (*Server) UnconnectedPeers ¶
UnconnectedPeers returns a list of peers that are in the discovery peer list but are not connected to the server.
type ServerConfig ¶
type ServerConfig struct { // MinPeers is the minimum number of peers for normal operation, // when the node has less than this number of peers it tries to // connect with some new ones. MinPeers int // AttemptConnPeers it the number of connection to try to // establish when the connection count drops below the MinPeers // value. AttemptConnPeers int // MaxPeers it the maximum numbers of peers that can // be connected to the server. MaxPeers int // The user agent of the server. UserAgent string // Address. Example: "127.0.0.1". Address string // Port. Example: 20332. Port uint16 // The network mode the server will operate on. // ModePrivNet docker private network. // ModeTestNet NEO test network. // ModeMainNet NEO main network. Net config.NetMode // Relay determines whether the server is forwarding its inventory. Relay bool // Seeds are a list of initial nodes used to establish connectivity. Seeds []string // Maximum duration a single dial may take. DialTimeout time.Duration // The duration between protocol ticks with each connected peer. // When this is 0, the default interval of 5 seconds will be used. ProtoTickInterval time.Duration // Interval used in pinging mechanism for syncing blocks. PingInterval time.Duration // Time to wait for pong(response for sent ping request). PingTimeout time.Duration // Level of the internal logger. LogLevel zapcore.Level // Wallet is a wallet configuration. Wallet *config.WalletConfig // TimePerBlock is an interval which should pass between two successive blocks. TimePerBlock time.Duration }
ServerConfig holds the server configuration.
func NewServerConfig ¶
func NewServerConfig(cfg config.Config) ServerConfig
NewServerConfig creates a new ServerConfig struct using the main applications config.
type TCPPeer ¶
type TCPPeer struct {
// contains filtered or unexported fields
}
TCPPeer represents a connected remote node in the network over TCP.
func NewTCPPeer ¶
NewTCPPeer returns a TCPPeer structure based on the given connection.
func (*TCPPeer) Disconnect ¶
Disconnect will fill the peer's done channel with the given error.
func (*TCPPeer) EnqueueHPPacket ¶ added in v0.72.0
EnqueueHPPacket implements the Peer interface. It the peer is not yet handshaked it's a noop.
func (*TCPPeer) EnqueueMessage ¶ added in v0.72.0
EnqueueMessage is a temporary wrapper that sends a message via EnqueuePacket if there is no error in serializing it.
func (*TCPPeer) EnqueueP2PMessage ¶ added in v0.72.0
EnqueueP2PMessage implements the Peer interface.
func (*TCPPeer) EnqueueP2PPacket ¶ added in v0.72.0
EnqueueP2PPacket implements the Peer interface.
func (*TCPPeer) EnqueuePacket ¶ added in v0.72.0
EnqueuePacket implements the Peer interface.
func (*TCPPeer) HandlePong ¶ added in v0.72.0
HandlePong handles a pong message received from the peer and does appropriate accounting of outstanding pings and timeouts.
func (*TCPPeer) HandleVersion ¶
HandleVersion checks for the handshake state and version message contents.
func (*TCPPeer) HandleVersionAck ¶
HandleVersionAck checks handshake sequence correctness when VerAck message is received.
func (*TCPPeer) Handshaked ¶
Handshaked returns status of the handshake, whether it's completed or not.
func (*TCPPeer) LastBlockIndex ¶ added in v0.72.0
LastBlockIndex returns last block index.
func (*TCPPeer) RemoteAddr ¶ added in v0.62.0
RemoteAddr implements the Peer interface.
func (*TCPPeer) SendPing ¶ added in v0.72.0
SendPing sends a ping message to the peer and does appropriate accounting of outstanding pings and timeouts.
func (*TCPPeer) SendVersion ¶
SendVersion checks for the handshake state and sends a message to the peer.
func (*TCPPeer) SendVersionAck ¶
SendVersionAck checks for the handshake state and sends a message to the peer.
func (*TCPPeer) StartProtocol ¶ added in v0.72.0
func (p *TCPPeer) StartProtocol()
StartProtocol starts a long running background loop that interacts every ProtoTickInterval with the peer. It's only good to run after the handshake.
type TCPTransport ¶
type TCPTransport struct {
// contains filtered or unexported fields
}
TCPTransport allows network communication over TCP.
func NewTCPTransport ¶
func NewTCPTransport(s *Server, bindAddr string, log *zap.Logger) *TCPTransport
NewTCPTransport returns a new TCPTransport that will listen for new incoming peer connections.
func (*TCPTransport) Accept ¶
func (t *TCPTransport) Accept()
Accept implements the Transporter interface.
func (*TCPTransport) Close ¶
func (t *TCPTransport) Close()
Close implements the Transporter interface.
func (*TCPTransport) Dial ¶
func (t *TCPTransport) Dial(addr string, timeout time.Duration) error
Dial implements the Transporter interface.
func (*TCPTransport) Proto ¶
func (t *TCPTransport) Proto() string
Proto implements the Transporter interface.