Skip to content

Commit 27aa486

Browse files
committed
p2p/dnsdisc: update to latest EIP-1459 spec
This updates the DNS TXT record format to the latest changes in ethereum/EIPs#2313.
1 parent a73f3f4 commit 27aa486

File tree

5 files changed

+91
-80
lines changed

5 files changed

+91
-80
lines changed

p2p/dnsdisc/client.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func NewClient(cfg Config, urls ...string) (*Client, error) {
107107
// SyncTree downloads the entire node tree at the given URL. This doesn't add the tree for
108108
// later use, but any previously-synced entries are reused.
109109
func (c *Client) SyncTree(url string) (*Tree, error) {
110-
le, err := parseURL(url)
110+
le, err := parseLink(url)
111111
if err != nil {
112112
return nil, fmt.Errorf("invalid enrtree URL: %v", err)
113113
}
@@ -122,7 +122,7 @@ func (c *Client) SyncTree(url string) (*Tree, error) {
122122

123123
// AddTree adds a enrtree:// URL to crawl.
124124
func (c *Client) AddTree(url string) error {
125-
le, err := parseURL(url)
125+
le, err := parseLink(url)
126126
if err != nil {
127127
return fmt.Errorf("invalid enrtree URL: %v", err)
128128
}

p2p/dnsdisc/client_test.go

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ const (
4141

4242
func TestClientSyncTree(t *testing.T) {
4343
r := mapResolver{
44-
"3CA2MBMUQ55ZCT74YEEQLANJDI.n": "enr=-HW4QAggRauloj2SDLtIHN1XBkvhFZ1vtf1raYQp9TBW2RD5EEawDzbtSmlXUfnaHcvwOizhVYLtr7e6vw7NAf6mTuoCgmlkgnY0iXNlY3AyNTZrMaECjrXI8TLNXU0f8cthpAMxEshUyQlK-AM0PW2wfrnacNI=",
45-
"53HBTPGGZ4I76UEPCNQGZWIPTQ.n": "enr=-HW4QOFzoVLaFJnNhbgMoDXPnOvcdVuj7pDpqRvh6BRDO68aVi5ZcjB3vzQRZH2IcLBGHzo8uUN3snqmgTiE56CH3AMBgmlkgnY0iXNlY3AyNTZrMaECC2_24YYkYHEgdzxlSNKQEnHhuNAbNlMlWJxrJxbAFvA=",
46-
"BG7SVUBUAJ3UAWD2ATEBLMRNEE.n": "enrtree=53HBTPGGZ4I76UEPCNQGZWIPTQ,3CA2MBMUQ55ZCT74YEEQLANJDI,HNHR6UTVZF5TJKK3FV27ZI76P4",
47-
"HNHR6UTVZF5TJKK3FV27ZI76P4.n": "enr=-HW4QLAYqmrwllBEnzWWs7I5Ev2IAs7x_dZlbYdRdMUx5EyKHDXp7AV5CkuPGUPdvbv1_Ms1CPfhcGCvSElSosZmyoqAgmlkgnY0iXNlY3AyNTZrMaECriawHKWdDRk2xeZkrOXBQ0dfMFLHY4eENZwdufn1S1o=",
48-
"JGUFMSAGI7KZYB3P7IZW4S5Y3A.n": "enrtree-link=AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org",
49-
"n": "enrtree-root=v1 e=BG7SVUBUAJ3UAWD2ATEBLMRNEE l=JGUFMSAGI7KZYB3P7IZW4S5Y3A seq=1 sig=gacuU0nTy9duIdu1IFDyF5Lv9CFHqHiNcj91n0frw70tZo3tZZsCVkE3j1ILYyVOHRLWGBmawo_SEkThZ9PgcQE=",
44+
"n": "enrtree-root:v1 e=JWXYDBPXYWG6FX3GMDIBFA6CJ4 l=C7HRFPF3BLGF3YR4DY5KX3SMBE seq=1 sig=o908WmNp7LibOfPsr4btQwatZJ5URBr2ZAuxvK4UWHlsB9sUOTJQaGAlLPVAhM__XJesCHxLISo94z5Z2a463gA",
45+
"C7HRFPF3BLGF3YR4DY5KX3SMBE.n": "enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org",
46+
"JWXYDBPXYWG6FX3GMDIBFA6CJ4.n": "enrtree-branch:2XS2367YHAXJFGLZHVAWLQD4ZY,H4FHT4B454P6UXFD7JCYQ5PWDY,MHTDO6TMUBRIA2XWG5LUDACK24",
47+
"2XS2367YHAXJFGLZHVAWLQD4ZY.n": "enr:-HW4QOFzoVLaFJnNhbgMoDXPnOvcdVuj7pDpqRvh6BRDO68aVi5ZcjB3vzQRZH2IcLBGHzo8uUN3snqmgTiE56CH3AMBgmlkgnY0iXNlY3AyNTZrMaECC2_24YYkYHEgdzxlSNKQEnHhuNAbNlMlWJxrJxbAFvA",
48+
"H4FHT4B454P6UXFD7JCYQ5PWDY.n": "enr:-HW4QAggRauloj2SDLtIHN1XBkvhFZ1vtf1raYQp9TBW2RD5EEawDzbtSmlXUfnaHcvwOizhVYLtr7e6vw7NAf6mTuoCgmlkgnY0iXNlY3AyNTZrMaECjrXI8TLNXU0f8cthpAMxEshUyQlK-AM0PW2wfrnacNI",
49+
"MHTDO6TMUBRIA2XWG5LUDACK24.n": "enr:-HW4QLAYqmrwllBEnzWWs7I5Ev2IAs7x_dZlbYdRdMUx5EyKHDXp7AV5CkuPGUPdvbv1_Ms1CPfhcGCvSElSosZmyoqAgmlkgnY0iXNlY3AyNTZrMaECriawHKWdDRk2xeZkrOXBQ0dfMFLHY4eENZwdufn1S1o",
5050
}
5151
var (
5252
wantNodes = testNodes(0x29452, 3)
@@ -75,15 +75,25 @@ func TestClientSyncTree(t *testing.T) {
7575

7676
// In this test, syncing the tree fails because it contains an invalid ENR entry.
7777
func TestClientSyncTreeBadNode(t *testing.T) {
78+
// var b strings.Builder
79+
// b.WriteString(enrPrefix)
80+
// b.WriteString("-----")
81+
// badHash := subdomain(&b)
82+
// tree, _ := MakeTree(3, nil, []string{"enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org"})
83+
// tree.entries[badHash] = &b
84+
// tree.root.eroot = badHash
85+
// url, _ := tree.Sign(testKey(signingKeySeed), "n")
86+
// fmt.Println(url)
87+
// fmt.Printf("%#v\n", tree.ToTXT("n"))
88+
7889
r := mapResolver{
79-
"n": "enrtree-root=v1 e=ZFJZDQKSOMJRYYQSZKJZC54HCF l=JGUFMSAGI7KZYB3P7IZW4S5Y3A seq=3 sig=WEy8JTZ2dHmXM2qeBZ7D2ECK7SGbnurl1ge_S_5GQBAqnADk0gLTcg8Lm5QNqLHZjJKGAb443p996idlMcBqEQA=",
80-
"JGUFMSAGI7KZYB3P7IZW4S5Y3A.n": "enrtree-link=AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org",
81-
"ZFJZDQKSOMJRYYQSZKJZC54HCF.n": "enr=gggggggggggggg=",
90+
"n": "enrtree-root:v1 e=INDMVBZEEQ4ESVYAKGIYU74EAA l=C7HRFPF3BLGF3YR4DY5KX3SMBE seq=3 sig=Vl3AmunLur0JZ3sIyJPSH6A3Vvdp4F40jWQeCmkIhmcgwE4VC5U9wpK8C_uL_CMY29fd6FAhspRvq2z_VysTLAA",
91+
"C7HRFPF3BLGF3YR4DY5KX3SMBE.n": "enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org",
92+
"INDMVBZEEQ4ESVYAKGIYU74EAA.n": "enr:-----",
8293
}
83-
8494
c, _ := NewClient(Config{Resolver: r, Logger: testlog.Logger(t, log.LvlTrace)})
85-
_, err := c.SyncTree("enrtree://APFGGTFOBVE2ZNAB3CSMNNX6RRK3ODIRLP2AA5U4YFAA6MSYZUYTQ@n")
86-
wantErr := nameError{name: "ZFJZDQKSOMJRYYQSZKJZC54HCF.n", err: entryError{typ: "enr", err: errInvalidENR}}
95+
_, err := c.SyncTree("enrtree://AKPYQIUQIL7PSIACI32J7FGZW56E5FKHEFCCOFHILBIMW3M6LWXS2@n")
96+
wantErr := nameError{name: "INDMVBZEEQ4ESVYAKGIYU74EAA.n", err: entryError{typ: "enr", err: errInvalidENR}}
8797
if err != wantErr {
8898
t.Fatalf("expected sync error %q, got %q", wantErr, err)
8999
}

p2p/dnsdisc/sync.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func (ct *clientTree) syncNextRandomENR(ctx context.Context) (*enode.Node, error
120120
}
121121

122122
func (ct *clientTree) String() string {
123-
return ct.loc.url()
123+
return ct.loc.String()
124124
}
125125

126126
// removeHash removes the element at index from h.
@@ -209,7 +209,7 @@ func (ts *subtreeSync) resolveNext(ctx context.Context, hash string) (entry, err
209209
if !ts.link {
210210
return nil, errLinkInENRTree
211211
}
212-
case *subtreeEntry:
212+
case *branchEntry:
213213
ts.missing = append(ts.missing, e.children...)
214214
}
215215
return e, nil

p2p/dnsdisc/tree.go

Lines changed: 46 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func (t *Tree) Sign(key *ecdsa.PrivateKey, domain string) (url string, err error
4949
root.sig = sig
5050
t.root = &root
5151
link := &linkEntry{domain, &key.PublicKey}
52-
return link.url(), nil
52+
return link.String(), nil
5353
}
5454

5555
// SetSignature verifies the given signature and assigns it as the tree's current
@@ -96,7 +96,7 @@ func (t *Tree) Links() []string {
9696
var links []string
9797
for _, e := range t.entries {
9898
if le, ok := e.(*linkEntry); ok {
99-
links = append(links, le.url())
99+
links = append(links, le.String())
100100
}
101101
}
102102
return links
@@ -115,15 +115,15 @@ func (t *Tree) Nodes() []*enode.Node {
115115

116116
const (
117117
hashAbbrev = 16
118-
maxChildren = 300 / (hashAbbrev * (13 / 8))
118+
maxChildren = 300 / hashAbbrev * (13 / 8)
119119
minHashLength = 12
120-
rootPrefix = "enrtree-root=v1"
121120
)
122121

123122
// MakeTree creates a tree containing the given nodes and links.
124123
func MakeTree(seq uint, nodes []*enode.Node, links []string) (*Tree, error) {
125124
// Sort records by ID and ensure all nodes have a valid record.
126125
records := make([]*enode.Node, len(nodes))
126+
127127
copy(records, nodes)
128128
sortByID(records)
129129
for _, n := range records {
@@ -139,7 +139,7 @@ func MakeTree(seq uint, nodes []*enode.Node, links []string) (*Tree, error) {
139139
}
140140
linkEntries := make([]entry, len(links))
141141
for i, l := range links {
142-
le, err := parseURL(l)
142+
le, err := parseLink(l)
143143
if err != nil {
144144
return nil, err
145145
}
@@ -166,7 +166,7 @@ func (t *Tree) build(entries []entry) entry {
166166
hashes[i] = subdomain(e)
167167
t.entries[hashes[i]] = e
168168
}
169-
return &subtreeEntry{hashes}
169+
return &branchEntry{hashes}
170170
}
171171
var subtrees []entry
172172
for len(entries) > 0 {
@@ -202,7 +202,7 @@ type (
202202
seq uint
203203
sig []byte
204204
}
205-
subtreeEntry struct {
205+
branchEntry struct {
206206
children []string
207207
}
208208
enrEntry struct {
@@ -218,7 +218,14 @@ type (
218218

219219
var (
220220
b32format = base32.StdEncoding.WithPadding(base32.NoPadding)
221-
b64format = base64.URLEncoding
221+
b64format = base64.RawURLEncoding
222+
)
223+
224+
const (
225+
rootPrefix = "enrtree-root:v1"
226+
linkPrefix = "enrtree://"
227+
branchPrefix = "enrtree-branch:"
228+
enrPrefix = "enr:"
222229
)
223230

224231
func subdomain(e entry) string {
@@ -242,37 +249,29 @@ func (e *rootEntry) verifySignature(pubkey *ecdsa.PublicKey) bool {
242249
return crypto.VerifySignature(crypto.FromECDSAPub(pubkey), e.sigHash(), sig)
243250
}
244251

245-
func (e *subtreeEntry) String() string {
246-
return "enrtree=" + strings.Join(e.children, ",")
252+
func (e *branchEntry) String() string {
253+
return branchPrefix + strings.Join(e.children, ",")
247254
}
248255

249256
func (e *enrEntry) String() string {
250-
enc, _ := rlp.EncodeToBytes(e.node.Record())
251-
return "enr=" + b64format.EncodeToString(enc)
257+
return e.node.String()
252258
}
253259

254260
func (e *linkEntry) String() string {
255-
return "enrtree-link=" + e.link()
256-
}
257-
258-
func (e *linkEntry) url() string {
259-
return "enrtree://" + e.link()
260-
}
261-
262-
func (e *linkEntry) link() string {
263-
return fmt.Sprintf("%s@%s", b32format.EncodeToString(crypto.CompressPubkey(e.pubkey)), e.domain)
261+
pubkey := b32format.EncodeToString(crypto.CompressPubkey(e.pubkey))
262+
return fmt.Sprintf("%s%s@%s", linkPrefix, pubkey, e.domain)
264263
}
265264

266265
// Entry Parsing
267266

268267
func parseEntry(e string, validSchemes enr.IdentityScheme) (entry, error) {
269268
switch {
270-
case strings.HasPrefix(e, "enrtree-link="):
271-
return parseLink(e[13:])
272-
case strings.HasPrefix(e, "enrtree="):
273-
return parseSubtree(e[8:])
274-
case strings.HasPrefix(e, "enr="):
275-
return parseENR(e[4:], validSchemes)
269+
case strings.HasPrefix(e, linkPrefix):
270+
return parseLinkEntry(e)
271+
case strings.HasPrefix(e, branchPrefix):
272+
return parseBranch(e)
273+
case strings.HasPrefix(e, enrPrefix):
274+
return parseENR(e, validSchemes)
276275
default:
277276
return nil, errUnknownEntry
278277
}
@@ -294,7 +293,19 @@ func parseRoot(e string) (rootEntry, error) {
294293
return rootEntry{eroot, lroot, seq, sigb}, nil
295294
}
296295

297-
func parseLink(e string) (entry, error) {
296+
func parseLinkEntry(e string) (entry, error) {
297+
le, err := parseLink(e)
298+
if err != nil {
299+
return nil, err
300+
}
301+
return le, nil
302+
}
303+
304+
func parseLink(e string) (*linkEntry, error) {
305+
if !strings.HasPrefix(e, linkPrefix) {
306+
return nil, fmt.Errorf("wrong/missing scheme 'enrtree' in URL")
307+
}
308+
e = e[len(linkPrefix):]
298309
pos := strings.IndexByte(e, '@')
299310
if pos == -1 {
300311
return nil, entryError{"link", errNoPubkey}
@@ -311,21 +322,23 @@ func parseLink(e string) (entry, error) {
311322
return &linkEntry{domain, key}, nil
312323
}
313324

314-
func parseSubtree(e string) (entry, error) {
325+
func parseBranch(e string) (entry, error) {
326+
e = e[len(branchPrefix):]
315327
if e == "" {
316-
return &subtreeEntry{}, nil // empty entry is OK
328+
return &branchEntry{}, nil // empty entry is OK
317329
}
318330
hashes := make([]string, 0, strings.Count(e, ","))
319331
for _, c := range strings.Split(e, ",") {
320332
if !isValidHash(c) {
321-
return nil, entryError{"subtree", errInvalidChild}
333+
return nil, entryError{"branch", errInvalidChild}
322334
}
323335
hashes = append(hashes, c)
324336
}
325-
return &subtreeEntry{hashes}, nil
337+
return &branchEntry{hashes}, nil
326338
}
327339

328340
func parseENR(e string, validSchemes enr.IdentityScheme) (entry, error) {
341+
e = e[len(enrPrefix):]
329342
enc, err := b64format.DecodeString(e)
330343
if err != nil {
331344
return nil, entryError{"enr", errInvalidENR}
@@ -364,21 +377,9 @@ func truncateHash(hash string) string {
364377

365378
// ParseURL parses an enrtree:// URL and returns its components.
366379
func ParseURL(url string) (domain string, pubkey *ecdsa.PublicKey, err error) {
367-
le, err := parseURL(url)
380+
le, err := parseLink(url)
368381
if err != nil {
369382
return "", nil, err
370383
}
371384
return le.domain, le.pubkey, nil
372385
}
373-
374-
func parseURL(url string) (*linkEntry, error) {
375-
const scheme = "enrtree://"
376-
if !strings.HasPrefix(url, scheme) {
377-
return nil, fmt.Errorf("wrong/missing scheme 'enrtree' in URL")
378-
}
379-
le, err := parseLink(url[len(scheme):])
380-
if err != nil {
381-
return nil, err.(entryError).err
382-
}
383-
return le.(*linkEntry), nil
384-
}

p2p/dnsdisc/tree_test.go

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@ func TestParseRoot(t *testing.T) {
3232
err error
3333
}{
3434
{
35-
input: "enrtree-root=v1 e=TO4Q75OQ2N7DX4EOOR7X66A6OM seq=3 sig=N-YY6UB9xD0hFx1Gmnt7v0RfSxch5tKyry2SRDoLx7B4GfPXagwLxQqyf7gAMvApFn_ORwZQekMWa_pXrcGCtw=",
35+
input: "enrtree-root:v1 e=TO4Q75OQ2N7DX4EOOR7X66A6OM seq=3 sig=N-YY6UB9xD0hFx1Gmnt7v0RfSxch5tKyry2SRDoLx7B4GfPXagwLxQqyf7gAMvApFn_ORwZQekMWa_pXrcGCtw",
3636
err: entryError{"root", errSyntax},
3737
},
3838
{
39-
input: "enrtree-root=v1 e=TO4Q75OQ2N7DX4EOOR7X66A6OM l=TO4Q75OQ2N7DX4EOOR7X66A6OM seq=3 sig=N-YY6UB9xD0hFx1Gmnt7v0RfSxch5tKyry2SRDoLx7B4GfPXagwLxQqyf7gAMvApFn_ORwZQekMWa_pXrcGCtw=",
39+
input: "enrtree-root:v1 e=TO4Q75OQ2N7DX4EOOR7X66A6OM l=TO4Q75OQ2N7DX4EOOR7X66A6OM seq=3 sig=N-YY6UB9xD0hFx1Gmnt7v0RfSxch5tKyry2SRDoLx7B4GfPXagwLxQqyf7gAMvApFn_ORwZQekMWa_pXrcGCtw",
4040
err: entryError{"root", errInvalidSig},
4141
},
4242
{
43-
input: "enrtree-root=v1 e=QFT4PBCRX4XQCV3VUYJ6BTCEPU l=JGUFMSAGI7KZYB3P7IZW4S5Y3A seq=3 sig=3FmXuVwpa8Y7OstZTx9PIb1mt8FrW7VpDOFv4AaGCsZ2EIHmhraWhe4NxYhQDlw5MjeFXYMbJjsPeKlHzmJREQE=",
43+
input: "enrtree-root:v1 e=QFT4PBCRX4XQCV3VUYJ6BTCEPU l=JGUFMSAGI7KZYB3P7IZW4S5Y3A seq=3 sig=3FmXuVwpa8Y7OstZTx9PIb1mt8FrW7VpDOFv4AaGCsZ2EIHmhraWhe4NxYhQDlw5MjeFXYMbJjsPeKlHzmJREQE",
4444
e: rootEntry{
4545
eroot: "QFT4PBCRX4XQCV3VUYJ6BTCEPU",
4646
lroot: "JGUFMSAGI7KZYB3P7IZW4S5Y3A",
@@ -69,49 +69,49 @@ func TestParseEntry(t *testing.T) {
6969
}{
7070
// Subtrees:
7171
{
72-
input: "enrtree=1,2",
73-
err: entryError{"subtree", errInvalidChild},
72+
input: "enrtree-branch:1,2",
73+
err: entryError{"branch", errInvalidChild},
7474
},
7575
{
76-
input: "enrtree=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
77-
err: entryError{"subtree", errInvalidChild},
76+
input: "enrtree-branch:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
77+
err: entryError{"branch", errInvalidChild},
7878
},
7979
{
80-
input: "enrtree=",
81-
e: &subtreeEntry{},
80+
input: "enrtree-branch:",
81+
e: &branchEntry{},
8282
},
8383
{
84-
input: "enrtree=AAAAAAAAAAAAAAAAAAAA",
85-
e: &subtreeEntry{[]string{"AAAAAAAAAAAAAAAAAAAA"}},
84+
input: "enrtree-branch:AAAAAAAAAAAAAAAAAAAA",
85+
e: &branchEntry{[]string{"AAAAAAAAAAAAAAAAAAAA"}},
8686
},
8787
{
88-
input: "enrtree=AAAAAAAAAAAAAAAAAAAA,BBBBBBBBBBBBBBBBBBBB",
89-
e: &subtreeEntry{[]string{"AAAAAAAAAAAAAAAAAAAA", "BBBBBBBBBBBBBBBBBBBB"}},
88+
input: "enrtree-branch:AAAAAAAAAAAAAAAAAAAA,BBBBBBBBBBBBBBBBBBBB",
89+
e: &branchEntry{[]string{"AAAAAAAAAAAAAAAAAAAA", "BBBBBBBBBBBBBBBBBBBB"}},
9090
},
9191
// Links
9292
{
93-
input: "enrtree-link=AKPYQIUQIL7PSIACI32J7FGZW56E5FKHEFCCOFHILBIMW3M6LWXS2@nodes.example.org",
93+
input: "enrtree://AKPYQIUQIL7PSIACI32J7FGZW56E5FKHEFCCOFHILBIMW3M6LWXS2@nodes.example.org",
9494
e: &linkEntry{"nodes.example.org", &testkey.PublicKey},
9595
},
9696
{
97-
input: "enrtree-link=nodes.example.org",
97+
input: "enrtree://nodes.example.org",
9898
err: entryError{"link", errNoPubkey},
9999
},
100100
{
101-
input: "enrtree-link=AP62DT7WOTEQZGQZOU474PP3KMEGVTTE7A7NPRXKX3DUD57@nodes.example.org",
101+
input: "enrtree://AP62DT7WOTEQZGQZOU474PP3KMEGVTTE7A7NPRXKX3DUD57@nodes.example.org",
102102
err: entryError{"link", errBadPubkey},
103103
},
104104
{
105-
input: "enrtree-link=AP62DT7WONEQZGQZOU474PP3KMEGVTTE7A7NPRXKX3DUD57TQHGIA@nodes.example.org",
105+
input: "enrtree://AP62DT7WONEQZGQZOU474PP3KMEGVTTE7A7NPRXKX3DUD57TQHGIA@nodes.example.org",
106106
err: entryError{"link", errBadPubkey},
107107
},
108108
// ENRs
109109
{
110-
input: "enr=-HW4QES8QIeXTYlDzbfr1WEzE-XKY4f8gJFJzjJL-9D7TC9lJb4Z3JPRRz1lP4pL_N_QpT6rGQjAU9Apnc-C1iMP36OAgmlkgnY0iXNlY3AyNTZrMaED5IdwfMxdmR8W37HqSFdQLjDkIwBd4Q_MjxgZifgKSdM=",
110+
input: "enr:-HW4QES8QIeXTYlDzbfr1WEzE-XKY4f8gJFJzjJL-9D7TC9lJb4Z3JPRRz1lP4pL_N_QpT6rGQjAU9Apnc-C1iMP36OAgmlkgnY0iXNlY3AyNTZrMaED5IdwfMxdmR8W37HqSFdQLjDkIwBd4Q_MjxgZifgKSdM",
111111
e: &enrEntry{node: testNode(nodesSeed1)},
112112
},
113113
{
114-
input: "enr=-HW4QLZHjM4vZXkbp-5xJoHsKSbE7W39FPC8283X-y8oHcHPTnDDlIlzL5ArvDUlHZVDPgmFASrh7cWgLOLxj4wprRkHgmlkgnY0iXNlY3AyNTZrMaEC3t2jLMhDpCDX5mbSEwDn4L3iUfyXzoO8G28XvjGRkrAg=",
114+
input: "enr:-HW4QLZHjM4vZXkbp-5xJoHsKSbE7W39FPC8283X-y8oHcHPTnDDlIlzL5ArvDUlHZVDPgmFASrh7cWgLOLxj4wprRkHgmlkgnY0iXNlY3AyNTZrMaEC3t2jLMhDpCDX5mbSEwDn4L3iUfyXzoO8G28XvjGRkrAg=",
115115
err: entryError{"enr", errInvalidENR},
116116
},
117117
// Invalid:

0 commit comments

Comments
 (0)