Documentation ¶
Index ¶
- Constants
- Variables
- func DecodePubkey(curve elliptic.Curve, e []byte) (*ecdsa.PublicKey, error)
- func EncodePubkey(key *ecdsa.PublicKey) []byte
- 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.
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(input []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{}