Documentation ¶
Index ¶
- Constants
- Variables
- func DecodePubkey(curve elliptic.Curve, e []byte) (*ecdsa.PublicKey, error)
- func EncodePubkey(key *ecdsa.PublicKey) []byte
- func IsInvalidHeader(err error) bool
- type Codec
- type Findnode
- type Header
- type Nodes
- type Nonce
- type Packet
- type Ping
- type Pong
- type SessionCache
- type StaticHeader
- type TalkRequest
- type TalkResponse
- type Unknown
- type Whoareyou
Constants ¶
const ( PingMsg byte = iota + 1 PongMsg FindnodeMsg NodesMsg TalkRequestMsg TalkResponseMsg RequestTicketMsg TicketMsg UnknownPacket = byte(255) // any non-decryptable packet WhoareyouPacket = byte(254) // the WHOAREYOU packet )
Message types.
Variables ¶
var DefaultProtocolID = [6]byte{'d', 'i', 's', 'c', 'v', '5'}
var ( // ErrInvalidReqID represents error when the ID is invalid. ErrInvalidReqID = errors.New("request ID larger than 8 bytes") )
Public errors.
Functions ¶
func DecodePubkey ¶
DecodePubkey decodes a public key in compressed format.
func EncodePubkey ¶
EncodePubkey encodes a public key.
func IsInvalidHeader ¶
IsInvalidHeader reports whether 'err' is related to an invalid packet header. When it returns false, it is pretty certain that the packet causing the error does not belong to discv5.
Types ¶
type Codec ¶
type Codec struct {
// contains filtered or unexported fields
}
Codec encodes and decodes Discovery v5 packets. This type is not safe for concurrent use.
func NewCodec ¶
func NewCodec(ln *enode.LocalNode, key *ecdsa.PrivateKey, clock mclock.Clock, protocolID *[6]byte) *Codec
NewCodec creates a wire codec.
func (*Codec) Decode ¶
func (c *Codec) Decode(inputData []byte, addr string) (src enode.ID, n *enode.Node, p Packet, err error)
Decode decodes a discovery packet.
func (*Codec) Encode ¶
func (c *Codec) Encode(id enode.ID, addr string, packet Packet, challenge *Whoareyou) ([]byte, Nonce, error)
Encode encodes a packet to a node. 'id' and 'addr' specify the destination node. The 'challenge' parameter should be the most recently received WHOAREYOU packet from that node.
type Findnode ¶
type Findnode struct { ReqID []byte Distances []uint // OpID is for debugging purposes and is not part of the packet encoding. // It identifies the 'operation' on behalf of which the request was sent. OpID uint64 `rlp:"-"` }
FINDNODE is a query for nodes in the given bucket.
func (*Findnode) AppendLogInfo ¶
func (p *Findnode) AppendLogInfo(ctx []interface{}) []interface{}
func (*Findnode) SetRequestID ¶
type Header ¶
type Header struct { IV [sizeofMaskingIV]byte StaticHeader AuthData []byte // contains filtered or unexported fields }
Header represents a packet header.
type Nodes ¶
type Nodes struct { ReqID []byte RespCount uint8 // total number of responses to the request Nodes []*enr.Record }
NODES is a response to FINDNODE.
func (*Nodes) AppendLogInfo ¶
func (p *Nodes) AppendLogInfo(ctx []interface{}) []interface{}
func (*Nodes) SetRequestID ¶
type Packet ¶
type Packet interface { Name() string // Name returns a string corresponding to the message type. Kind() byte // Kind returns the message type. RequestID() []byte // Returns the request ID. SetRequestID([]byte) // Sets the request ID. // AppendLogInfo returns its argument 'ctx' with additional fields // appended for logging purposes. AppendLogInfo(ctx []interface{}) []interface{} }
Packet is implemented by all message types.
type Ping ¶
PING is sent during liveness checks.
func (*Ping) AppendLogInfo ¶
func (p *Ping) AppendLogInfo(ctx []interface{}) []interface{}
func (*Ping) SetRequestID ¶
type Pong ¶
type Pong struct { ReqID []byte ENRSeq uint64 ToIP net.IP // These fields should mirror the UDP envelope address of the ping ToPort uint16 // packet, which provides a way to discover the external address (after NAT). }
PONG is the reply to PING.
func (*Pong) AppendLogInfo ¶
func (p *Pong) AppendLogInfo(ctx []interface{}) []interface{}
func (*Pong) SetRequestID ¶
type SessionCache ¶
type SessionCache struct {
// contains filtered or unexported fields
}
The SessionCache keeps negotiated encryption keys and state for in-progress handshakes in the Discovery v5 wire protocol.
func NewSessionCache ¶
func NewSessionCache(maxItems int, clock mclock.Clock) *SessionCache
type StaticHeader ¶
type StaticHeader struct { ProtocolID [6]byte Version uint16 Flag byte Nonce Nonce AuthSize uint16 }
StaticHeader contains the static fields of a packet header.
type TalkRequest ¶
TALKREQ is an application-level request.
func (*TalkRequest) AppendLogInfo ¶
func (p *TalkRequest) AppendLogInfo(ctx []interface{}) []interface{}
func (*TalkRequest) Kind ¶
func (*TalkRequest) Kind() byte
func (*TalkRequest) Name ¶
func (*TalkRequest) Name() string
func (*TalkRequest) RequestID ¶
func (p *TalkRequest) RequestID() []byte
func (*TalkRequest) SetRequestID ¶
func (p *TalkRequest) SetRequestID(id []byte)
type TalkResponse ¶
TALKRESP is the reply to TALKREQ.
func (*TalkResponse) AppendLogInfo ¶
func (p *TalkResponse) AppendLogInfo(ctx []interface{}) []interface{}
func (*TalkResponse) Kind ¶
func (*TalkResponse) Kind() byte
func (*TalkResponse) Name ¶
func (*TalkResponse) Name() string
func (*TalkResponse) RequestID ¶
func (p *TalkResponse) RequestID() []byte
func (*TalkResponse) SetRequestID ¶
func (p *TalkResponse) SetRequestID(id []byte)
type Unknown ¶
type Unknown struct {
Nonce Nonce
}
Unknown represents any packet that can't be decrypted.
func (*Unknown) AppendLogInfo ¶
func (*Unknown) AppendLogInfo(ctx []interface{}) []interface{}
func (*Unknown) SetRequestID ¶
type Whoareyou ¶
type Whoareyou struct { ChallengeData []byte // Encoded challenge Nonce Nonce // Nonce of request packet IDNonce [16]byte // Identity proof data RecordSeq uint64 // ENR sequence number of recipient // Node is the locally known node record of recipient. // This must be set by the caller of Encode. Node *enode.Node // contains filtered or unexported fields }
WHOAREYOU contains the handshake challenge.
func (*Whoareyou) AppendLogInfo ¶
func (*Whoareyou) AppendLogInfo(ctx []interface{}) []interface{}