package v4wire

import "github.com/ethereum/go-ethereum/p2p/discover/v4wire"

Package v4wire implements the Discovery v4 Wire Protocol.

Index

Constants

const (
	PingPacket = iota + 1 // zero is 'reserved'
	PongPacket
	FindnodePacket
	NeighborsPacket
	ENRRequestPacket
	ENRResponsePacket
)

RPC packet types

const MaxNeighbors = 12

MaxNeighbors is the maximum number of neighbor nodes in a Neighbors packet.

Variables

var (
	ErrPacketTooSmall = errors.New("too small")
	ErrBadHash        = errors.New("bad hash")
	ErrBadPoint       = errors.New("invalid curve point")
)

Functions

func Decode

func Decode(input []byte) (Packet, Pubkey, []byte, error)

Decode reads a discovery v4 packet.

func DecodePubkey

func DecodePubkey(curve elliptic.Curve, e Pubkey) (*ecdsa.PublicKey, error)

DecodePubkey reads an encoded secp256k1 public key.

func Encode

func Encode(priv *ecdsa.PrivateKey, req Packet) (packet, hash []byte, err error)

Encode encodes a discovery packet.

func Expired

func Expired(ts uint64) bool

Expired checks whether the given UNIX time stamp is in the past.

Types

type ENRRequest

type ENRRequest struct {
	Expiration uint64
	// Ignore additional fields (for forward compatibility).
	Rest []rlp.RawValue `rlp:"tail"`
}

ENRRequest queries for the remote node's record.

func (*ENRRequest) Kind

func (req *ENRRequest) Kind() byte

func (*ENRRequest) Name

func (req *ENRRequest) Name() string

type ENRResponse

type ENRResponse struct {
	ReplyTok []byte // Hash of the ENRRequest packet.
	Record   enr.Record
	// Ignore additional fields (for forward compatibility).
	Rest []rlp.RawValue `rlp:"tail"`
}

ENRResponse is the reply to ENRRequest.

func (*ENRResponse) Kind

func (req *ENRResponse) Kind() byte

func (*ENRResponse) Name

func (req *ENRResponse) Name() string

type Endpoint

type Endpoint struct {
	IP  net.IP // len 4 for IPv4 or 16 for IPv6
	UDP uint16 // for discovery protocol
	TCP uint16 // for RLPx protocol
}

Endpoint represents a network endpoint.

func NewEndpoint

func NewEndpoint(addr netip.AddrPort, tcpPort uint16) Endpoint

NewEndpoint creates an endpoint.

type Findnode

type Findnode struct {
	Target     Pubkey
	Expiration uint64
	// Ignore additional fields (for forward compatibility).
	Rest []rlp.RawValue `rlp:"tail"`
}

Findnode is a query for nodes close to the given target.

func (*Findnode) Kind

func (req *Findnode) Kind() byte

func (*Findnode) Name

func (req *Findnode) Name() string

type Neighbors

type Neighbors struct {
	Nodes      []Node
	Expiration uint64
	// Ignore additional fields (for forward compatibility).
	Rest []rlp.RawValue `rlp:"tail"`
}

Neighbors is the reply to findnode.

func (*Neighbors) Kind

func (req *Neighbors) Kind() byte

func (*Neighbors) Name

func (req *Neighbors) Name() string

type Node

type Node struct {
	IP  net.IP // len 4 for IPv4 or 16 for IPv6
	UDP uint16 // for discovery protocol
	TCP uint16 // for RLPx protocol
	ID  Pubkey
}

Node represents information about a node.

type Packet

type Packet interface {
	// Name is the name of the package, for logging purposes.
	Name() string
	// Kind is the packet type, for logging purposes.
	Kind() byte
}

type Ping

type Ping struct {
	Version    uint
	From, To   Endpoint
	Expiration uint64
	ENRSeq     uint64 `rlp:"optional"` // Sequence number of local record, added by EIP-868.

	// Ignore additional fields (for forward compatibility).
	Rest []rlp.RawValue `rlp:"tail"`
}

RPC request structures

func (*Ping) Kind

func (req *Ping) Kind() byte

func (*Ping) Name

func (req *Ping) Name() string

type Pong

type Pong struct {
	// This field should mirror the UDP envelope address
	// of the ping packet, which provides a way to discover the
	// external address (after NAT).
	To         Endpoint
	ReplyTok   []byte // This contains the hash of the ping packet.
	Expiration uint64 // Absolute timestamp at which the packet becomes invalid.
	ENRSeq     uint64 `rlp:"optional"` // Sequence number of local record, added by EIP-868.

	// Ignore additional fields (for forward compatibility).
	Rest []rlp.RawValue `rlp:"tail"`
}

Pong is the reply to ping.

func (*Pong) Kind

func (req *Pong) Kind() byte

func (*Pong) Name

func (req *Pong) Name() string

type Pubkey

type Pubkey [64]byte

Pubkey represents an encoded 64-byte secp256k1 public key.

func EncodePubkey

func EncodePubkey(key *ecdsa.PublicKey) Pubkey

EncodePubkey encodes a secp256k1 public key.

func (Pubkey) ID

func (e Pubkey) ID() enode.ID

ID returns the node ID corresponding to the public key.

Source Files

v4wire.go

Version
v1.16.2 (latest)
Published
Aug 4, 2025
Platform
linux/amd64
Imports
14 packages
Last checked
1 day ago

Tools for package owners.