@@ -20,12 +20,12 @@ import (
20
20
"context"
21
21
"crypto/ecdsa"
22
22
"errors"
23
- "math/rand"
24
23
"reflect"
25
24
"testing"
26
25
"time"
27
26
28
27
"github.com/davecgh/go-spew/spew"
28
+ "github.com/ethereum/go-ethereum/common/hexutil"
29
29
"github.com/ethereum/go-ethereum/common/mclock"
30
30
"github.com/ethereum/go-ethereum/crypto"
31
31
"github.com/ethereum/go-ethereum/internal/testlog"
@@ -34,23 +34,25 @@ import (
34
34
"github.com/ethereum/go-ethereum/p2p/enr"
35
35
)
36
36
37
- const (
38
- signingKeySeed = 0x111111
39
- nodesSeed1 = 0x2945237
40
- nodesSeed2 = 0x4567299
41
- )
37
+ var signingKeyForTesting , _ = crypto .ToECDSA (hexutil .MustDecode ("0xdc599867fc513f8f5e2c2c9c489cde5e71362d1d9ec6e693e0de063236ed1240" ))
42
38
43
39
func TestClientSyncTree (t * testing.T ) {
40
+ nodes := []string {
41
+ "enr:-HW4QOFzoVLaFJnNhbgMoDXPnOvcdVuj7pDpqRvh6BRDO68aVi5ZcjB3vzQRZH2IcLBGHzo8uUN3snqmgTiE56CH3AMBgmlkgnY0iXNlY3AyNTZrMaECC2_24YYkYHEgdzxlSNKQEnHhuNAbNlMlWJxrJxbAFvA" ,
42
+ "enr:-HW4QAggRauloj2SDLtIHN1XBkvhFZ1vtf1raYQp9TBW2RD5EEawDzbtSmlXUfnaHcvwOizhVYLtr7e6vw7NAf6mTuoCgmlkgnY0iXNlY3AyNTZrMaECjrXI8TLNXU0f8cthpAMxEshUyQlK-AM0PW2wfrnacNI" ,
43
+ "enr:-HW4QLAYqmrwllBEnzWWs7I5Ev2IAs7x_dZlbYdRdMUx5EyKHDXp7AV5CkuPGUPdvbv1_Ms1CPfhcGCvSElSosZmyoqAgmlkgnY0iXNlY3AyNTZrMaECriawHKWdDRk2xeZkrOXBQ0dfMFLHY4eENZwdufn1S1o" ,
44
+ }
45
+
44
46
r := mapResolver {
45
47
"n" : "enrtree-root:v1 e=JWXYDBPXYWG6FX3GMDIBFA6CJ4 l=C7HRFPF3BLGF3YR4DY5KX3SMBE seq=1 sig=o908WmNp7LibOfPsr4btQwatZJ5URBr2ZAuxvK4UWHlsB9sUOTJQaGAlLPVAhM__XJesCHxLISo94z5Z2a463gA" ,
46
48
"C7HRFPF3BLGF3YR4DY5KX3SMBE.n" : "enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org" ,
47
49
"JWXYDBPXYWG6FX3GMDIBFA6CJ4.n" : "enrtree-branch:2XS2367YHAXJFGLZHVAWLQD4ZY,H4FHT4B454P6UXFD7JCYQ5PWDY,MHTDO6TMUBRIA2XWG5LUDACK24" ,
48
- "2XS2367YHAXJFGLZHVAWLQD4ZY.n" : "enr:-HW4QOFzoVLaFJnNhbgMoDXPnOvcdVuj7pDpqRvh6BRDO68aVi5ZcjB3vzQRZH2IcLBGHzo8uUN3snqmgTiE56CH3AMBgmlkgnY0iXNlY3AyNTZrMaECC2_24YYkYHEgdzxlSNKQEnHhuNAbNlMlWJxrJxbAFvA" ,
49
- "H4FHT4B454P6UXFD7JCYQ5PWDY.n" : "enr:-HW4QAggRauloj2SDLtIHN1XBkvhFZ1vtf1raYQp9TBW2RD5EEawDzbtSmlXUfnaHcvwOizhVYLtr7e6vw7NAf6mTuoCgmlkgnY0iXNlY3AyNTZrMaECjrXI8TLNXU0f8cthpAMxEshUyQlK-AM0PW2wfrnacNI" ,
50
- "MHTDO6TMUBRIA2XWG5LUDACK24.n" : "enr:-HW4QLAYqmrwllBEnzWWs7I5Ev2IAs7x_dZlbYdRdMUx5EyKHDXp7AV5CkuPGUPdvbv1_Ms1CPfhcGCvSElSosZmyoqAgmlkgnY0iXNlY3AyNTZrMaECriawHKWdDRk2xeZkrOXBQ0dfMFLHY4eENZwdufn1S1o" ,
50
+ "2XS2367YHAXJFGLZHVAWLQD4ZY.n" : nodes [ 0 ] ,
51
+ "H4FHT4B454P6UXFD7JCYQ5PWDY.n" : nodes [ 1 ] ,
52
+ "MHTDO6TMUBRIA2XWG5LUDACK24.n" : nodes [ 2 ] ,
51
53
}
52
54
var (
53
- wantNodes = testNodes ( 0x29452 , 3 )
55
+ wantNodes = sortByID ( parseNodes ( nodes ) )
54
56
wantLinks = []string {"enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org" }
55
57
wantSeq = uint (1 )
56
58
)
@@ -60,7 +62,7 @@ func TestClientSyncTree(t *testing.T) {
60
62
if err != nil {
61
63
t .Fatal ("sync error:" , err )
62
64
}
63
- if ! reflect .DeepEqual (sortByID (stree .Nodes ()), sortByID ( wantNodes ) ) {
65
+ if ! reflect .DeepEqual (sortByID (stree .Nodes ()), wantNodes ) {
64
66
t .Errorf ("wrong nodes in synced tree:\n have %v\n want %v" , spew .Sdump (stree .Nodes ()), spew .Sdump (wantNodes ))
65
67
}
66
68
if ! reflect .DeepEqual (stree .Links (), wantLinks ) {
@@ -80,7 +82,7 @@ func TestClientSyncTreeBadNode(t *testing.T) {
80
82
// tree, _ := MakeTree(3, nil, []string{"enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org"})
81
83
// tree.entries[badHash] = &b
82
84
// tree.root.eroot = badHash
83
- // url, _ := tree.Sign(testKey(signingKeySeed) , "n")
85
+ // url, _ := tree.Sign(signingKeyForTesting , "n")
84
86
// fmt.Println(url)
85
87
// fmt.Printf("%#v\n", tree.ToTXT("n"))
86
88
@@ -99,9 +101,13 @@ func TestClientSyncTreeBadNode(t *testing.T) {
99
101
100
102
// This test checks that randomIterator finds all entries.
101
103
func TestIterator (t * testing.T ) {
102
- nodes := testNodes (nodesSeed1 , 30 )
103
- tree , url := makeTestTree ("n" , nodes , nil )
104
- r := mapResolver (tree .ToTXT ("n" ))
104
+ var (
105
+ keys = testKeys (30 )
106
+ nodes = testNodes (keys )
107
+ tree , url = makeTestTree ("n" , nodes , nil )
108
+ r = mapResolver (tree .ToTXT ("n" ))
109
+ )
110
+
105
111
c := NewClient (Config {
106
112
Resolver : r ,
107
113
Logger : testlog .Logger (t , log .LvlTrace ),
@@ -117,8 +123,12 @@ func TestIterator(t *testing.T) {
117
123
118
124
// This test checks if closing randomIterator races.
119
125
func TestIteratorClose (t * testing.T ) {
120
- nodes := testNodes (nodesSeed1 , 500 )
121
- tree1 , url1 := makeTestTree ("t1" , nodes , nil )
126
+ var (
127
+ keys = testKeys (500 )
128
+ nodes = testNodes (keys )
129
+ tree1 , url1 = makeTestTree ("t1" , nodes , nil )
130
+ )
131
+
122
132
c := NewClient (Config {Resolver : newMapResolver (tree1 .ToTXT ("t1" ))})
123
133
it , err := c .NewIterator (url1 )
124
134
if err != nil {
@@ -140,9 +150,13 @@ func TestIteratorClose(t *testing.T) {
140
150
141
151
// This test checks that randomIterator traverses linked trees as well as explicitly added trees.
142
152
func TestIteratorLinks (t * testing.T ) {
143
- nodes := testNodes (nodesSeed1 , 40 )
144
- tree1 , url1 := makeTestTree ("t1" , nodes [:10 ], nil )
145
- tree2 , url2 := makeTestTree ("t2" , nodes [10 :], []string {url1 })
153
+ var (
154
+ keys = testKeys (40 )
155
+ nodes = testNodes (keys )
156
+ tree1 , url1 = makeTestTree ("t1" , nodes [:10 ], nil )
157
+ tree2 , url2 = makeTestTree ("t2" , nodes [10 :], []string {url1 })
158
+ )
159
+
146
160
c := NewClient (Config {
147
161
Resolver : newMapResolver (tree1 .ToTXT ("t1" ), tree2 .ToTXT ("t2" )),
148
162
Logger : testlog .Logger (t , log .LvlTrace ),
@@ -161,7 +175,8 @@ func TestIteratorLinks(t *testing.T) {
161
175
func TestIteratorNodeUpdates (t * testing.T ) {
162
176
var (
163
177
clock = new (mclock.Simulated )
164
- nodes = testNodes (nodesSeed1 , 30 )
178
+ keys = testKeys (30 )
179
+ nodes = testNodes (keys )
165
180
resolver = newMapResolver ()
166
181
c = NewClient (Config {
167
182
Resolver : resolver ,
@@ -182,7 +197,7 @@ func TestIteratorNodeUpdates(t *testing.T) {
182
197
checkIterator (t , it , nodes [:25 ])
183
198
184
199
// Ensure RandomNode returns the new nodes after the tree is updated.
185
- updateSomeNodes (nodesSeed1 , nodes )
200
+ updateSomeNodes (keys , nodes )
186
201
tree2 , _ := makeTestTree ("n" , nodes , nil )
187
202
resolver .clear ()
188
203
resolver .add (tree2 .ToTXT ("n" ))
@@ -198,7 +213,8 @@ func TestIteratorNodeUpdates(t *testing.T) {
198
213
func TestIteratorRootRecheckOnFail (t * testing.T ) {
199
214
var (
200
215
clock = new (mclock.Simulated )
201
- nodes = testNodes (nodesSeed1 , 30 )
216
+ keys = testKeys (30 )
217
+ nodes = testNodes (keys )
202
218
resolver = newMapResolver ()
203
219
c = NewClient (Config {
204
220
Resolver : resolver ,
@@ -222,7 +238,7 @@ func TestIteratorRootRecheckOnFail(t *testing.T) {
222
238
checkIterator (t , it , nodes [:25 ])
223
239
224
240
// Ensure RandomNode returns the new nodes after the tree is updated.
225
- updateSomeNodes (nodesSeed1 , nodes )
241
+ updateSomeNodes (keys , nodes )
226
242
tree2 , _ := makeTestTree ("n" , nodes , nil )
227
243
resolver .clear ()
228
244
resolver .add (tree2 .ToTXT ("n" ))
@@ -235,7 +251,8 @@ func TestIteratorRootRecheckOnFail(t *testing.T) {
235
251
func TestIteratorEmptyTree (t * testing.T ) {
236
252
var (
237
253
clock = new (mclock.Simulated )
238
- nodes = testNodes (nodesSeed1 , 1 )
254
+ keys = testKeys (1 )
255
+ nodes = testNodes (keys )
239
256
resolver = newMapResolver ()
240
257
c = NewClient (Config {
241
258
Resolver : resolver ,
@@ -279,8 +296,7 @@ func TestIteratorEmptyTree(t *testing.T) {
279
296
}
280
297
281
298
// updateSomeNodes applies ENR updates to some of the given nodes.
282
- func updateSomeNodes (keySeed int64 , nodes []* enode.Node ) {
283
- keys := testKeys (nodesSeed1 , len (nodes ))
299
+ func updateSomeNodes (keys []* ecdsa.PrivateKey , nodes []* enode.Node ) {
284
300
for i , n := range nodes [:len (nodes )/ 2 ] {
285
301
r := n .Record ()
286
302
r .Set (enr.IP {127 , 0 , 0 , 1 })
@@ -296,7 +312,8 @@ func updateSomeNodes(keySeed int64, nodes []*enode.Node) {
296
312
func TestIteratorLinkUpdates (t * testing.T ) {
297
313
var (
298
314
clock = new (mclock.Simulated )
299
- nodes = testNodes (nodesSeed1 , 30 )
315
+ keys = testKeys (30 )
316
+ nodes = testNodes (keys )
300
317
resolver = newMapResolver ()
301
318
c = NewClient (Config {
302
319
Resolver : resolver ,
@@ -369,19 +386,18 @@ func makeTestTree(domain string, nodes []*enode.Node, links []string) (*Tree, st
369
386
if err != nil {
370
387
panic (err )
371
388
}
372
- url , err := tree .Sign (testKey ( signingKeySeed ) , domain )
389
+ url , err := tree .Sign (signingKeyForTesting , domain )
373
390
if err != nil {
374
391
panic (err )
375
392
}
376
393
return tree , url
377
394
}
378
395
379
396
// testKeys creates deterministic private keys for testing.
380
- func testKeys (seed int64 , n int ) []* ecdsa.PrivateKey {
381
- rand := rand .New (rand .NewSource (seed ))
397
+ func testKeys (n int ) []* ecdsa.PrivateKey {
382
398
keys := make ([]* ecdsa.PrivateKey , n )
383
399
for i := 0 ; i < n ; i ++ {
384
- key , err := ecdsa .GenerateKey (crypto . S256 (), rand )
400
+ key , err := crypto .GenerateKey ()
385
401
if err != nil {
386
402
panic ("can't generate key: " + err .Error ())
387
403
}
@@ -390,13 +406,8 @@ func testKeys(seed int64, n int) []*ecdsa.PrivateKey {
390
406
return keys
391
407
}
392
408
393
- func testKey (seed int64 ) * ecdsa.PrivateKey {
394
- return testKeys (seed , 1 )[0 ]
395
- }
396
-
397
- func testNodes (seed int64 , n int ) []* enode.Node {
398
- keys := testKeys (seed , n )
399
- nodes := make ([]* enode.Node , n )
409
+ func testNodes (keys []* ecdsa.PrivateKey ) []* enode.Node {
410
+ nodes := make ([]* enode.Node , len (keys ))
400
411
for i , key := range keys {
401
412
record := new (enr.Record )
402
413
record .SetSeq (uint64 (i ))
@@ -410,10 +421,6 @@ func testNodes(seed int64, n int) []*enode.Node {
410
421
return nodes
411
422
}
412
423
413
- func testNode (seed int64 ) * enode.Node {
414
- return testNodes (seed , 1 )[0 ]
415
- }
416
-
417
424
type mapResolver map [string ]string
418
425
419
426
func newMapResolver (maps ... map [string ]string ) mapResolver {
@@ -442,3 +449,15 @@ func (mr mapResolver) LookupTXT(ctx context.Context, name string) ([]string, err
442
449
}
443
450
return nil , errors .New ("not found" )
444
451
}
452
+
453
+ func parseNodes (rec []string ) []* enode.Node {
454
+ var ns []* enode.Node
455
+ for _ , r := range rec {
456
+ var n enode.Node
457
+ if err := n .UnmarshalText ([]byte (r )); err != nil {
458
+ panic (err )
459
+ }
460
+ ns = append (ns , & n )
461
+ }
462
+ return ns
463
+ }
0 commit comments