Documentation ¶
Overview ¶
Package enr implements Ethereum Node Records as defined in EIP-778. A node record holds arbitrary information about a node on the peer-to-peer network. Node information is stored in key/value Pairs. To store and retrieve key/values in a record, use the Entry interface.
Signature Handling ¶
Records must be signed before transmitting them to another node.
Decoding a record doesn't check its Signature. Code working with records from an untrusted source must always verify two things: that the record uses an identity scheme deemed secure, and that the Signature is valid according to the declared scheme.
When creating a record, set the entries you want and use a signing function provided by the identity scheme to add the Signature. Modifying a record invalidates the Signature.
Package enr supports the "secp256k1-keccak" identity scheme.
Index ¶
- Constants
- Variables
- func IsNotFound(err error) bool
- type Entry
- type ID
- type IP
- type IdentityScheme
- type KeyError
- type Pair
- type Record
- func (r *Record) AppendElements(list []msg.MsgpMember) []msg.MsgpMember
- func (r *Record) Decode(b []byte) ([]byte, error)
- func (z *Record) DecodeMsg(dc *msgp.Reader) (err error)
- func (r Record) Encode(b []byte) ([]byte, error)
- func (z *Record) EncodeMsg(en *msgp.Writer) (err error)
- func (r Record) Equal(r1 Record) (ok bool, reason error)
- func (r *Record) GetSeq() uint64
- func (r *Record) IdentityScheme() string
- func (r *Record) Load(e Entry) error
- func (z *Record) MarshalMsg(b []byte) (o []byte, err error)
- func (z *Record) Msgsize() (s int)
- func (r *Record) Set(e Entry)
- func (r *Record) SetSeq(s uint64)
- func (r *Record) SetSig(s IdentityScheme, sig []byte) error
- func (z *Record) UnmarshalMsg(bts []byte) (o []byte, err error)
- func (r *Record) VerifySignature(s IdentityScheme) error
- type SchemeMap
- type TCP
- type UDP
Constants ¶
const IDv4 = ID("v4") // the default identity scheme
const SizeLimit = 300 // maximum encoded size of a node record in bytes
Variables ¶
var (
ErrInvalidSig = errors.New("invalid Signature on node record")
)
Functions ¶
func IsNotFound ¶
IsNotFound reports whether the given error means that a key/value pair is missing from a record.
Types ¶
type Entry ¶
type Entry interface { ENRKey() string msg.MsgpMember }
Entry is implemented by known node record entry types.
To define a new entry that is to be included in a node record, create a Go type that satisfies this interface. The type should also implement rlp.Decoder if additional checks are needed on the value.
type ID ¶
type ID string
ID is the "id" key, which holds the name of the identity scheme.
func (ID) MarshalMsg ¶
MarshalMsg implements msgp.Marshaler
type IP ¶
IP is the "ip" key, which holds the IP address of the node.
func (IP) MarshalMsg ¶
EncodeRLP implements rlp.Encoder.
type IdentityScheme ¶
An IdentityScheme is capable of verifying record Signatures and deriving node addresses.
type Pair ¶
Pair is a key/value Pair in a record.
func (*Pair) MarshalMsg ¶
MarshalMsg implements msgp.Marshaler
type Record ¶
type Record struct { Seq uint64 // sequence number Signature []byte // the Signature Pairs []Pair // sorted list of all key/value Pairs // contains filtered or unexported fields }
Record represents a node record. The zero value is an empty record.
func (*Record) AppendElements ¶
func (r *Record) AppendElements(list []msg.MsgpMember) []msg.MsgpMember
AppendElements appends the sequence number and entries to the given slice.
func (*Record) IdentityScheme ¶
IdentityScheme returns the name of the identity scheme in the record.
func (*Record) Load ¶
Load retrieves the value of a key/value Pair. The given Entry must be a pointer and will be set to the value of the entry in the record.
Errors returned by Load are wrapped in KeyError. You can distinguish decoding errors from missing keys using the IsNotFound function.
func (*Record) MarshalMsg ¶
MarshalMsg implements msgp.Marshaler
func (*Record) Msgsize ¶
Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message
func (*Record) Set ¶
Set adds or updates the given entry in the record. It panics if the value can't be encoded. If the record is signed, Set increments the sequence number and invalidates the sequence number.
func (*Record) SetSeq ¶
SetSeq updates the record sequence number. This invalidates any Signature on the record. Calling SetSeq is usually not required because setting any key in a signed record increments the sequence number.
func (*Record) SetSig ¶
func (r *Record) SetSig(s IdentityScheme, sig []byte) error
SetSig sets the record Signature. It returns an error if the encoded record is larger than the size limit or if the Signature is invalid according to the passed scheme.
You can also use SetSig to remove the Signature explicitly by passing a nil scheme and Signature.
SetSig panics when either the scheme or the Signature (but not both) are nil.
func (*Record) UnmarshalMsg ¶
UnmarshalMsg implements msgp.Unmarshaler
func (*Record) VerifySignature ¶
func (r *Record) VerifySignature(s IdentityScheme) error
VerifySignature checks whether the record is signed using the given identity scheme.
type SchemeMap ¶
type SchemeMap map[string]IdentityScheme
SchemeMap is a registry of named identity schemes.
type TCP ¶
type TCP uint16
TCP is the "tcp" key, which holds the TCP port of the node.
func (TCP) MarshalMsg ¶
MarshalMsg implements msgp.Marshaler
type UDP ¶
type UDP uint16
UDP is the "udp" key, which holds the UDP port of the node.
func (UDP) MarshalMsg ¶
MarshalMsg implements msgp.Marshaler