@@ -25,6 +25,9 @@ func Test_Generate(t *testing.T) {
25
25
someHash [i ] = byte (i )
26
26
}
27
27
28
+ largeValue := generateBytes (t , 40 )
29
+ assertLongEncoding (t , node.Node {Value : largeValue })
30
+
28
31
testCases := map [string ]struct {
29
32
rootHash []byte
30
33
fullKeysNibbles [][]byte
@@ -124,19 +127,26 @@ func Test_Generate(t *testing.T) {
124
127
},
125
128
databaseBuilder : func (ctrl * gomock.Controller ) Database {
126
129
mockDatabase := NewMockDatabase (ctrl )
127
- encodedRoot := encodeNode (t , node.Node {
130
+
131
+ rootNode := node.Node {
128
132
Key : []byte {1 , 2 },
129
133
Value : []byte {2 },
130
134
Children : padRightChildren ([]* node.Node {
131
135
nil , nil , nil ,
132
136
{ // full key 1, 2, 3, 4
133
137
Key : []byte {4 },
134
- Value : [] byte { 4 } ,
138
+ Value : largeValue ,
135
139
},
136
140
}),
137
- })
141
+ }
142
+
138
143
mockDatabase .EXPECT ().Get (someHash ).
139
- Return (encodedRoot , nil )
144
+ Return (encodeNode (t , rootNode ), nil )
145
+
146
+ encodedChild := encodeNode (t , * rootNode .Children [3 ])
147
+ mockDatabase .EXPECT ().Get (blake2b (t , encodedChild )).
148
+ Return (encodedChild , nil )
149
+
140
150
return mockDatabase
141
151
},
142
152
encodedProofNodes : [][]byte {
@@ -147,13 +157,13 @@ func Test_Generate(t *testing.T) {
147
157
nil , nil , nil ,
148
158
{
149
159
Key : []byte {4 },
150
- Value : [] byte { 4 } ,
160
+ Value : largeValue ,
151
161
},
152
162
}),
153
163
}),
154
164
encodeNode (t , node.Node {
155
165
Key : []byte {4 },
156
- Value : [] byte { 4 } ,
166
+ Value : largeValue ,
157
167
}),
158
168
},
159
169
},
@@ -162,31 +172,42 @@ func Test_Generate(t *testing.T) {
162
172
fullKeysNibbles : [][]byte {
163
173
{1 , 2 , 3 , 4 },
164
174
{1 , 2 , 4 , 4 },
165
- {1 , 2 , 5 , 4 },
175
+ {1 , 2 , 5 , 5 },
166
176
},
167
177
databaseBuilder : func (ctrl * gomock.Controller ) Database {
168
178
mockDatabase := NewMockDatabase (ctrl )
169
- encodedRoot := encodeNode (t , node.Node {
179
+
180
+ rootNode := node.Node {
170
181
Key : []byte {1 , 2 },
171
182
Value : []byte {2 },
172
183
Children : padRightChildren ([]* node.Node {
173
184
nil , nil , nil ,
174
185
{ // full key 1, 2, 3, 4
175
186
Key : []byte {4 },
176
- Value : [] byte { 4 } ,
187
+ Value : largeValue ,
177
188
},
178
189
{ // full key 1, 2, 4, 4
179
190
Key : []byte {4 },
180
- Value : [] byte { 4 } ,
191
+ Value : largeValue ,
181
192
},
182
- { // full key 1, 2, 5, 4
183
- Key : []byte {4 },
184
- Value : [] byte { 5 } ,
193
+ { // full key 1, 2, 5, 5
194
+ Key : []byte {5 },
195
+ Value : largeValue ,
185
196
},
186
197
}),
187
- })
198
+ }
199
+
188
200
mockDatabase .EXPECT ().Get (someHash ).
189
- Return (encodedRoot , nil )
201
+ Return (encodeNode (t , rootNode ), nil )
202
+
203
+ encodedLargeChild1 := encodeNode (t , * rootNode .Children [3 ])
204
+ mockDatabase .EXPECT ().Get (blake2b (t , encodedLargeChild1 )).
205
+ Return (encodedLargeChild1 , nil ).Times (2 )
206
+
207
+ encodedLargeChild2 := encodeNode (t , * rootNode .Children [5 ])
208
+ mockDatabase .EXPECT ().Get (blake2b (t , encodedLargeChild2 )).
209
+ Return (encodedLargeChild2 , nil )
210
+
190
211
return mockDatabase
191
212
},
192
213
encodedProofNodes : [][]byte {
@@ -197,25 +218,25 @@ func Test_Generate(t *testing.T) {
197
218
nil , nil , nil ,
198
219
{ // full key 1, 2, 3, 4
199
220
Key : []byte {4 },
200
- Value : [] byte { 4 } ,
221
+ Value : largeValue ,
201
222
},
202
223
{ // full key 1, 2, 4, 4
203
224
Key : []byte {4 },
204
- Value : [] byte { 4 } ,
225
+ Value : largeValue ,
205
226
},
206
- { // full key 1, 2, 5, 4
207
- Key : []byte {4 },
208
- Value : [] byte { 5 } ,
227
+ { // full key 1, 2, 5, 5
228
+ Key : []byte {5 },
229
+ Value : largeValue ,
209
230
},
210
231
}),
211
232
}),
212
233
encodeNode (t , node.Node {
213
234
Key : []byte {4 },
214
- Value : [] byte { 4 } ,
235
+ Value : largeValue ,
215
236
}),
216
237
encodeNode (t , node.Node {
217
- Key : []byte {4 },
218
- Value : [] byte { 5 } ,
238
+ Key : []byte {5 },
239
+ Value : largeValue ,
219
240
}),
220
241
},
221
242
},
@@ -248,9 +269,13 @@ func Test_Generate(t *testing.T) {
248
269
func Test_walk (t * testing.T ) {
249
270
t .Parallel ()
250
271
272
+ largeValue := generateBytes (t , 40 )
273
+ assertLongEncoding (t , node.Node {Value : largeValue })
274
+
251
275
testCases := map [string ]struct {
252
276
parent * node.Node
253
277
fullKey []byte // nibbles
278
+ isRoot bool
254
279
encodedProofNodes [][]byte
255
280
errWrapped error
256
281
errMessage string
@@ -268,6 +293,7 @@ func Test_walk(t *testing.T) {
268
293
Key : []byte {1 , 2 },
269
294
Value : []byte {1 },
270
295
},
296
+ isRoot : true ,
271
297
encodedProofNodes : [][]byte {encodeNode (t , node.Node {
272
298
Key : []byte {1 , 2 },
273
299
Value : []byte {1 },
@@ -311,6 +337,7 @@ func Test_walk(t *testing.T) {
311
337
},
312
338
}),
313
339
},
340
+ isRoot : true ,
314
341
encodedProofNodes : [][]byte {
315
342
encodeNode (t , node.Node {
316
343
Key : []byte {1 , 2 },
@@ -366,6 +393,7 @@ func Test_walk(t *testing.T) {
366
393
}),
367
394
},
368
395
fullKey : []byte {1 , 2 },
396
+ isRoot : true ,
369
397
encodedProofNodes : [][]byte {
370
398
encodeNode (t , node.Node {
371
399
Key : []byte {1 , 2 },
@@ -379,6 +407,64 @@ func Test_walk(t *testing.T) {
379
407
}),
380
408
},
381
409
},
410
+ "branch and matching search key for small leaf encoding" : {
411
+ parent : & node.Node {
412
+ Key : []byte {1 , 2 },
413
+ Value : []byte {3 },
414
+ Children : padRightChildren ([]* node.Node {
415
+ { // full key 1, 2, 0, 1, 2
416
+ Key : []byte {1 , 2 },
417
+ Value : []byte {3 },
418
+ },
419
+ }),
420
+ },
421
+ fullKey : []byte {1 , 2 , 0 , 1 , 2 },
422
+ isRoot : true ,
423
+ encodedProofNodes : [][]byte {
424
+ encodeNode (t , node.Node {
425
+ Key : []byte {1 , 2 },
426
+ Value : []byte {3 },
427
+ Children : padRightChildren ([]* node.Node {
428
+ { // full key 1, 2, 0, 1, 2
429
+ Key : []byte {1 , 2 },
430
+ Value : []byte {3 },
431
+ },
432
+ }),
433
+ }),
434
+ // Note the leaf encoding is not added since its encoding
435
+ // is less than 32 bytes.
436
+ },
437
+ },
438
+ "branch and matching search key for large leaf encoding" : {
439
+ parent : & node.Node {
440
+ Key : []byte {1 , 2 },
441
+ Value : []byte {3 },
442
+ Children : padRightChildren ([]* node.Node {
443
+ { // full key 1, 2, 0, 1, 2
444
+ Key : []byte {1 , 2 },
445
+ Value : largeValue ,
446
+ },
447
+ }),
448
+ },
449
+ fullKey : []byte {1 , 2 , 0 , 1 , 2 },
450
+ isRoot : true ,
451
+ encodedProofNodes : [][]byte {
452
+ encodeNode (t , node.Node {
453
+ Key : []byte {1 , 2 },
454
+ Value : []byte {3 },
455
+ Children : padRightChildren ([]* node.Node {
456
+ { // full key 1, 2, 0, 1, 2
457
+ Key : []byte {1 , 2 },
458
+ Value : largeValue ,
459
+ },
460
+ }),
461
+ }),
462
+ encodeNode (t , node.Node {
463
+ Key : []byte {1 , 2 },
464
+ Value : largeValue ,
465
+ }),
466
+ },
467
+ },
382
468
"key not found at deeper level" : {
383
469
parent : & node.Node {
384
470
Key : []byte {1 , 2 },
@@ -406,6 +492,7 @@ func Test_walk(t *testing.T) {
406
492
}),
407
493
},
408
494
fullKey : []byte {1 , 2 , 0x04 },
495
+ isRoot : true ,
409
496
encodedProofNodes : [][]byte {
410
497
encodeNode (t , node.Node {
411
498
Key : []byte {1 , 2 },
@@ -426,7 +513,7 @@ func Test_walk(t *testing.T) {
426
513
t .Run (name , func (t * testing.T ) {
427
514
t .Parallel ()
428
515
429
- encodedProofNodes , err := walk (testCase .parent , testCase .fullKey )
516
+ encodedProofNodes , err := walk (testCase .parent , testCase .fullKey , testCase . isRoot )
430
517
431
518
assert .ErrorIs (t , err , testCase .errWrapped )
432
519
if testCase .errWrapped != nil {
@@ -514,12 +601,13 @@ func Benchmark_walk(b *testing.B) {
514
601
longestKeyNibbles := codec .KeyLEToNibbles (longestKeyLE )
515
602
516
603
rootNode := trie .RootNode ()
517
- encodedProofNodes , err := walk (rootNode , longestKeyNibbles )
604
+ const isRoot = true
605
+ encodedProofNodes , err := walk (rootNode , longestKeyNibbles , isRoot )
518
606
require .NoError (b , err )
519
607
require .Equal (b , len (encodedProofNodes ), trieDepth )
520
608
521
609
b .ResetTimer ()
522
610
for i := 0 ; i < b .N ; i ++ {
523
- _ , _ = walk (rootNode , longestKeyNibbles )
611
+ _ , _ = walk (rootNode , longestKeyNibbles , isRoot )
524
612
}
525
613
}
0 commit comments