go-merkletree-iden3/merkletree_test.go
merkletree_test.goRaw
1package merkletree
2
3import (
4 "bytes"
5 "encoding/hex"
6 "encoding/json"
7 "fmt"
8 "math/big"
9 "testing"
10
11 "github.com/iden3/go-iden3-crypto/constants"
12 cryptoUtils "github.com/iden3/go-iden3-crypto/utils"
13 "github.com/iden3/go-merkletree/db/memory"
14 "github.com/stretchr/testify/assert"
15 "github.com/stretchr/testify/require"
16)
17
18var debug = false
19
20type Fatalable interface {
21 Fatal(args ...interface{})
22}
23
24func newTestingMerkle(f Fatalable, numLevels int) *MerkleTree {
25 mt, err := NewMerkleTree(memory.NewMemoryStorage(), numLevels)
26 if err != nil {
27 f.Fatal(err)
28 return nil
29 }
30 return mt
31}
32
33func TestHashParsers(t *testing.T) {
34 h0 := NewHashFromBigInt(big.NewInt(0))
35 assert.Equal(t, "0", h0.String())
36 h1 := NewHashFromBigInt(big.NewInt(1))
37 assert.Equal(t, "1", h1.String())
38 h10 := NewHashFromBigInt(big.NewInt(10))
39 assert.Equal(t, "10", h10.String())
40
41 h7l := NewHashFromBigInt(big.NewInt(1234567))
42 assert.Equal(t, "1234567", h7l.String())
43 h8l := NewHashFromBigInt(big.NewInt(12345678))
44 assert.Equal(t, "12345678...", h8l.String())
45
46 b, ok := new(big.Int).SetString("4932297968297298434239270129193057052722409868268166443802652458940273154854", 10) //nolint:lll
47 assert.True(t, ok)
48 h := NewHashFromBigInt(b)
49 assert.Equal(t, "4932297968297298434239270129193057052722409868268166443802652458940273154854", h.BigInt().String()) //nolint:lll
50 assert.Equal(t, "49322979...", h.String())
51 assert.Equal(t, "265baaf161e875c372d08e50f52abddc01d32efc93e90290bb8b3d9ceb94e70a", h.Hex())
52
53 b1, err := NewBigIntFromHashBytes(b.Bytes())
54 assert.Nil(t, err)
55 assert.Equal(t, new(big.Int).SetBytes(b.Bytes()).String(), b1.String())
56
57 b2, err := NewHashFromBytes(b.Bytes())
58 assert.Nil(t, err)
59 assert.Equal(t, b.String(), b2.BigInt().String())
60
61 h2, err := NewHashFromHex(h.Hex())
62 assert.Nil(t, err)
63 assert.Equal(t, h, h2)
64 _, err = NewHashFromHex("0x12")
65 assert.NotNil(t, err)
66
67 // check limits
68 a := new(big.Int).Sub(constants.Q, big.NewInt(1))
69 testHashParsers(t, a)
70 a = big.NewInt(int64(1))
71 testHashParsers(t, a)
72}
73
74func testHashParsers(t *testing.T, a *big.Int) {
75 require.True(t, cryptoUtils.CheckBigIntInField(a))
76 h := NewHashFromBigInt(a)
77 assert.Equal(t, a, h.BigInt())
78 hFromBytes, err := NewHashFromBytes(h.Bytes())
79 assert.Nil(t, err)
80 assert.Equal(t, h, hFromBytes)
81 assert.Equal(t, a, hFromBytes.BigInt())
82 assert.Equal(t, a.String(), hFromBytes.BigInt().String())
83 hFromHex, err := NewHashFromHex(h.Hex())
84 assert.Nil(t, err)
85 assert.Equal(t, h, hFromHex)
86
87 aBIFromHBytes, err := NewBigIntFromHashBytes(h.Bytes())
88 assert.Nil(t, err)
89 assert.Equal(t, a, aBIFromHBytes)
90 assert.Equal(t, new(big.Int).SetBytes(a.Bytes()).String(), aBIFromHBytes.String())
91}
92
93func TestNewTree(t *testing.T) {
94 mt, err := NewMerkleTree(memory.NewMemoryStorage(), 10)
95 assert.Nil(t, err)
96 assert.Equal(t, "0", mt.Root().String())
97
98 // test vectors generated using https://github.com/iden3/circomlib smt.js
99 err = mt.Add(big.NewInt(1), big.NewInt(2))
100 assert.Nil(t, err)
101 assert.Equal(t, "6449712043256457369579901840927028403950625973089336675272087704159094984964", mt.Root().BigInt().String()) //nolint:lll
102
103 err = mt.Add(big.NewInt(33), big.NewInt(44))
104 assert.Nil(t, err)
105 assert.Equal(t, "11404118908468506234838877883514126008995570353394659302846433035311596046064", mt.Root().BigInt().String()) //nolint:lll
106
107 err = mt.Add(big.NewInt(1234), big.NewInt(9876))
108 assert.Nil(t, err)
109 assert.Equal(t, "12841932325181810040554102151615400973767747666110051836366805309524360490677", mt.Root().BigInt().String()) //nolint:lll
110
111 dbRoot, err := mt.dbGetRoot()
112 require.Nil(t, err)
113 assert.Equal(t, mt.Root(), dbRoot)
114
115 proof, v, err := mt.GenerateProof(big.NewInt(33), nil)
116 assert.Nil(t, err)
117 assert.Equal(t, big.NewInt(44), v)
118
119 assert.True(t, VerifyProof(mt.Root(), proof, big.NewInt(33), big.NewInt(44)))
120 assert.True(t, !VerifyProof(mt.Root(), proof, big.NewInt(33), big.NewInt(45)))
121}
122
123func TestAddDifferentOrder(t *testing.T) {
124 mt1 := newTestingMerkle(t, 140)
125 defer mt1.db.Close()
126 for i := 0; i < 16; i++ {
127 k := big.NewInt(int64(i))
128 v := big.NewInt(0)
129 if err := mt1.Add(k, v); err != nil {
130 t.Fatal(err)
131 }
132 }
133
134 mt2 := newTestingMerkle(t, 140)
135 defer mt2.db.Close()
136 for i := 16 - 1; i >= 0; i-- {
137 k := big.NewInt(int64(i))
138 v := big.NewInt(0)
139 if err := mt2.Add(k, v); err != nil {
140 t.Fatal(err)
141 }
142 }
143
144 assert.Equal(t, mt1.Root().Hex(), mt2.Root().Hex())
145 assert.Equal(t, "268e25964aa9d6ba42d66ae9eb44b5528540acb19a3644d1367d8c6f7cb23006", mt1.Root().Hex()) //nolint:lll
146}
147
148func TestAddRepeatedIndex(t *testing.T) {
149 mt := newTestingMerkle(t, 140)
150 defer mt.db.Close()
151 k := big.NewInt(int64(3))
152 v := big.NewInt(int64(12))
153 if err := mt.Add(k, v); err != nil {
154 t.Fatal(err)
155 }
156 err := mt.Add(k, v)
157 assert.NotNil(t, err)
158 assert.Equal(t, err, ErrEntryIndexAlreadyExists)
159}
160
161func TestGet(t *testing.T) {
162 mt := newTestingMerkle(t, 140)
163 defer mt.db.Close()
164
165 for i := 0; i < 16; i++ {
166 k := big.NewInt(int64(i))
167 v := big.NewInt(int64(i * 2))
168 if err := mt.Add(k, v); err != nil {
169 t.Fatal(err)
170 }
171 }
172 k, v, _, err := mt.Get(big.NewInt(10))
173 assert.Nil(t, err)
174 assert.Equal(t, big.NewInt(10), k)
175 assert.Equal(t, big.NewInt(20), v)
176
177 k, v, _, err = mt.Get(big.NewInt(15))
178 assert.Nil(t, err)
179 assert.Equal(t, big.NewInt(15), k)
180 assert.Equal(t, big.NewInt(30), v)
181
182 k, v, _, err = mt.Get(big.NewInt(16))
183 assert.NotNil(t, err)
184 assert.Equal(t, ErrKeyNotFound, err)
185 assert.Equal(t, "0", k.String())
186 assert.Equal(t, "0", v.String())
187}
188
189func TestUpdate(t *testing.T) {
190 mt := newTestingMerkle(t, 140)
191 defer mt.db.Close()
192
193 for i := 0; i < 16; i++ {
194 k := big.NewInt(int64(i))
195 v := big.NewInt(int64(i * 2))
196 if err := mt.Add(k, v); err != nil {
197 t.Fatal(err)
198 }
199 }
200 _, v, _, err := mt.Get(big.NewInt(10))
201 assert.Nil(t, err)
202 assert.Equal(t, big.NewInt(20), v)
203
204 _, err = mt.Update(big.NewInt(10), big.NewInt(1024))
205 assert.Nil(t, err)
206 _, v, _, err = mt.Get(big.NewInt(10))
207 assert.Nil(t, err)
208 assert.Equal(t, big.NewInt(1024), v)
209
210 _, err = mt.Update(big.NewInt(1000), big.NewInt(1024))
211 assert.Equal(t, ErrKeyNotFound, err)
212
213 dbRoot, err := mt.dbGetRoot()
214 require.Nil(t, err)
215 assert.Equal(t, mt.Root(), dbRoot)
216}
217
218func TestUpdate2(t *testing.T) {
219 mt1 := newTestingMerkle(t, 140)
220 defer mt1.db.Close()
221 mt2 := newTestingMerkle(t, 140)
222 defer mt2.db.Close()
223
224 err := mt1.Add(big.NewInt(1), big.NewInt(119))
225 assert.Nil(t, err)
226 err = mt1.Add(big.NewInt(2), big.NewInt(229))
227 assert.Nil(t, err)
228 err = mt1.Add(big.NewInt(9876), big.NewInt(6789))
229 assert.Nil(t, err)
230
231 err = mt2.Add(big.NewInt(1), big.NewInt(11))
232 assert.Nil(t, err)
233 err = mt2.Add(big.NewInt(2), big.NewInt(22))
234 assert.Nil(t, err)
235 err = mt2.Add(big.NewInt(9876), big.NewInt(10))
236 assert.Nil(t, err)
237
238 _, err = mt1.Update(big.NewInt(1), big.NewInt(11))
239 assert.Nil(t, err)
240 _, err = mt1.Update(big.NewInt(2), big.NewInt(22))
241 assert.Nil(t, err)
242 _, err = mt2.Update(big.NewInt(9876), big.NewInt(6789))
243 assert.Nil(t, err)
244
245 assert.Equal(t, mt1.Root(), mt2.Root())
246}
247
248func TestGenerateAndVerifyProof128(t *testing.T) {
249 mt, err := NewMerkleTree(memory.NewMemoryStorage(), 140)
250 require.Nil(t, err)
251 defer mt.db.Close()
252
253 for i := 0; i < 128; i++ {
254 k := big.NewInt(int64(i))
255 v := big.NewInt(0)
256 if err := mt.Add(k, v); err != nil {
257 t.Fatal(err)
258 }
259 }
260 proof, v, err := mt.GenerateProof(big.NewInt(42), nil)
261 assert.Nil(t, err)
262 assert.Equal(t, "0", v.String())
263 assert.True(t, VerifyProof(mt.Root(), proof, big.NewInt(42), big.NewInt(0)))
264}
265
266func TestTreeLimit(t *testing.T) {
267 mt, err := NewMerkleTree(memory.NewMemoryStorage(), 5)
268 require.Nil(t, err)
269 defer mt.db.Close()
270
271 for i := 0; i < 16; i++ {
272 err = mt.Add(big.NewInt(int64(i)), big.NewInt(int64(i)))
273 assert.Nil(t, err)
274 }
275
276 // here the tree is full, should not allow to add more data as reaches the maximum number of levels
277 err = mt.Add(big.NewInt(int64(16)), big.NewInt(int64(16)))
278 assert.NotNil(t, err)
279 assert.Equal(t, ErrReachedMaxLevel, err)
280}
281
282func TestSiblingsFromProof(t *testing.T) {
283 mt, err := NewMerkleTree(memory.NewMemoryStorage(), 140)
284 require.Nil(t, err)
285 defer mt.db.Close()
286
287 for i := 0; i < 64; i++ {
288 k := big.NewInt(int64(i))
289 v := big.NewInt(0)
290 if err := mt.Add(k, v); err != nil {
291 t.Fatal(err)
292 }
293 }
294
295 proof, _, err := mt.GenerateProof(big.NewInt(4), nil)
296 if err != nil {
297 t.Fatal(err)
298 }
299
300 siblings := SiblingsFromProof(proof)
301 assert.Equal(t, 6, len(siblings))
302 assert.Equal(t,
303 "5b478bdd58595ead03ebf494a74014cbb576ba0d9456aa0916885b9eefae592f",
304 siblings[0].Hex())
305 assert.Equal(t,
306 "c1e8ab120a4e475ea1bf00633228bfb9d248f7ddec2aa6367f98d0defb9fb22e",
307 siblings[1].Hex())
308 assert.Equal(t,
309 "f4dafd8ac2b9165adc3f6d125af67d5a4d8a7a263dcc90a373d0338929e16e0c",
310 siblings[2].Hex())
311 assert.Equal(t,
312 "a94aa346bd85f96aba2e85b67920e44fe6ed767b0e13bea602784e0b8b897515",
313 siblings[3].Hex())
314 assert.Equal(t,
315 "54791d7514030ded79301dbf221f5bf186facbc5800912411852fdc101b7151d",
316 siblings[4].Hex())
317 assert.Equal(t,
318 "435d28bc0511f8feb93b5f1649a049b460947702ce0baaefcf596175370fe01e",
319 siblings[5].Hex())
320}
321
322func TestVerifyProofCases(t *testing.T) {
323 mt := newTestingMerkle(t, 140)
324 defer mt.DB().Close()
325
326 for i := 0; i < 8; i++ {
327 if err := mt.Add(big.NewInt(int64(i)), big.NewInt(0)); err != nil {
328 t.Fatal(err)
329 }
330 }
331
332 // Existence proof
333 proof, _, err := mt.GenerateProof(big.NewInt(4), nil)
334 if err != nil {
335 t.Fatal(err)
336 }
337 assert.Equal(t, proof.Existence, true)
338 assert.True(t, VerifyProof(mt.Root(), proof, big.NewInt(4), big.NewInt(0)))
339 assert.Equal(t, "0003000000000000000000000000000000000000000000000000000000000007a6d6b46fefe213a6b579844a1bb7ab5c2db4a13f8662d9c5e729c36728f42730211ddfcc8d30ebd157d1d6912769b8e4abdca41e5dc2b57b026a361c091a8c14c748530e61bf8ea80c987657c3d24b134ece1ef8e2d4bd3f74437bf4392a6b1e", hex.EncodeToString(proof.Bytes())) //nolint:lll
340
341 for i := 8; i < 32; i++ {
342 proof, _, err = mt.GenerateProof(big.NewInt(int64(i)), nil)
343 assert.Nil(t, err)
344 if debug {
345 fmt.Println(i, proof)
346 }
347 }
348 // Non-existence proof, empty aux
349 proof, _, err = mt.GenerateProof(big.NewInt(12), nil)
350 if err != nil {
351 t.Fatal(err)
352 }
353 assert.Equal(t, proof.Existence, false)
354 // assert.True(t, proof.nodeAux == nil)
355 assert.True(t, VerifyProof(mt.Root(), proof, big.NewInt(12), big.NewInt(0)))
356 assert.Equal(t, "0303000000000000000000000000000000000000000000000000000000000007a6d6b46fefe213a6b579844a1bb7ab5c2db4a13f8662d9c5e729c36728f42730211ddfcc8d30ebd157d1d6912769b8e4abdca41e5dc2b57b026a361c091a8c14c748530e61bf8ea80c987657c3d24b134ece1ef8e2d4bd3f74437bf4392a6b1e04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", hex.EncodeToString(proof.Bytes())) //nolint:lll
357
358 // Non-existence proof, diff. node aux
359 proof, _, err = mt.GenerateProof(big.NewInt(10), nil)
360 if err != nil {
361 t.Fatal(err)
362 }
363 assert.Equal(t, proof.Existence, false)
364 assert.True(t, proof.NodeAux != nil)
365 assert.True(t, VerifyProof(mt.Root(), proof, big.NewInt(10), big.NewInt(0)))
366 assert.Equal(t, "0303000000000000000000000000000000000000000000000000000000000007a6d6b46fefe213a6b579844a1bb7ab5c2db4a13f8662d9c5e729c36728f42730e667e2ca15909c4a23beff18e3cc74348fbd3c1a4c765a5bbbca126c9607a42b77e008a73926f1280f8531b139dc1cacf8d83fcec31d405f5c51b7cbddfe152902000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", hex.EncodeToString(proof.Bytes())) //nolint:lll
367}
368
369func TestVerifyProofFalse(t *testing.T) {
370 mt := newTestingMerkle(t, 140)
371 defer mt.DB().Close()
372
373 for i := 0; i < 8; i++ {
374 if err := mt.Add(big.NewInt(int64(i)), big.NewInt(0)); err != nil {
375 t.Fatal(err)
376 }
377 }
378
379 // Invalid existence proof (node used for verification doesn't
380 // correspond to node in the proof)
381 proof, _, err := mt.GenerateProof(big.NewInt(int64(4)), nil)
382 if err != nil {
383 t.Fatal(err)
384 }
385 assert.Equal(t, proof.Existence, true)
386 assert.True(t, !VerifyProof(mt.Root(), proof, big.NewInt(int64(5)), big.NewInt(int64(5))))
387
388 // Invalid non-existence proof (Non-existence proof, diff. node aux)
389 proof, _, err = mt.GenerateProof(big.NewInt(int64(4)), nil)
390 if err != nil {
391 t.Fatal(err)
392 }
393 assert.Equal(t, proof.Existence, true)
394 // Now we change the proof from existence to non-existence, and add e's
395 // data as auxiliary node.
396 proof.Existence = false
397 proof.NodeAux = &NodeAux{Key: NewHashFromBigInt(big.NewInt(int64(4))),
398 Value: NewHashFromBigInt(big.NewInt(4))}
399 assert.True(t, !VerifyProof(mt.Root(), proof, big.NewInt(int64(4)), big.NewInt(0)))
400}
401
402func TestGraphViz(t *testing.T) {
403 mt, err := NewMerkleTree(memory.NewMemoryStorage(), 10)
404 assert.Nil(t, err)
405
406 _ = mt.Add(big.NewInt(1), big.NewInt(0))
407 _ = mt.Add(big.NewInt(2), big.NewInt(0))
408 _ = mt.Add(big.NewInt(3), big.NewInt(0))
409 _ = mt.Add(big.NewInt(4), big.NewInt(0))
410 _ = mt.Add(big.NewInt(5), big.NewInt(0))
411 _ = mt.Add(big.NewInt(100), big.NewInt(0))
412
413 // mt.PrintGraphViz(nil)
414
415 expected := `digraph hierarchy {
416node [fontname=Monospace,fontsize=10,shape=box]
417"16053348..." -> {"19137630..." "14119616..."}
418"19137630..." -> {"19543983..." "19746229..."}
419"19543983..." -> {"empty0" "65773153..."}
420"empty0" [style=dashed,label=0];
421"65773153..." -> {"73498412..." "empty1"}
422"empty1" [style=dashed,label=0];
423"73498412..." -> {"53169236..." "empty2"}
424"empty2" [style=dashed,label=0];
425"53169236..." -> {"73522717..." "34811870..."}
426"73522717..." [style=filled];
427"34811870..." [style=filled];
428"19746229..." [style=filled];
429"14119616..." -> {"19419204..." "15569531..."}
430"19419204..." -> {"78154875..." "34589916..."}
431"78154875..." [style=filled];
432"34589916..." [style=filled];
433"15569531..." [style=filled];
434}
435`
436 w := bytes.NewBufferString("")
437 err = mt.GraphViz(w, nil)
438 assert.Nil(t, err)
439 assert.Equal(t, []byte(expected), w.Bytes())
440}
441
442func TestDelete(t *testing.T) {
443 mt, err := NewMerkleTree(memory.NewMemoryStorage(), 10)
444 assert.Nil(t, err)
445 assert.Equal(t, "0", mt.Root().String())
446
447 // test vectors generated using https://github.com/iden3/circomlib smt.js
448 err = mt.Add(big.NewInt(1), big.NewInt(2))
449 assert.Nil(t, err)
450 assert.Equal(t, "6449712043256457369579901840927028403950625973089336675272087704159094984964", mt.Root().BigInt().String()) //nolint:lll
451
452 err = mt.Add(big.NewInt(33), big.NewInt(44))
453 assert.Nil(t, err)
454 assert.Equal(t, "11404118908468506234838877883514126008995570353394659302846433035311596046064", mt.Root().BigInt().String()) //nolint:lll
455
456 err = mt.Add(big.NewInt(1234), big.NewInt(9876))
457 assert.Nil(t, err)
458 assert.Equal(t, "12841932325181810040554102151615400973767747666110051836366805309524360490677", mt.Root().BigInt().String()) //nolint:lll
459
460 // mt.PrintGraphViz(nil)
461
462 err = mt.Delete(big.NewInt(33))
463 // mt.PrintGraphViz(nil)
464 assert.Nil(t, err)
465 assert.Equal(t, "16195585003843604118922861401064871511855368913846540536604351220077317790615", mt.Root().BigInt().String()) //nolint:lll
466
467 err = mt.Delete(big.NewInt(1234))
468 assert.Nil(t, err)
469 err = mt.Delete(big.NewInt(1))
470 assert.Nil(t, err)
471 assert.Equal(t, "0", mt.Root().String())
472
473 dbRoot, err := mt.dbGetRoot()
474 require.Nil(t, err)
475 assert.Equal(t, mt.Root(), dbRoot)
476}
477
478func TestDelete2(t *testing.T) {
479 mt := newTestingMerkle(t, 140)
480 defer mt.db.Close()
481 for i := 0; i < 8; i++ {
482 k := big.NewInt(int64(i))
483 v := big.NewInt(0)
484 if err := mt.Add(k, v); err != nil {
485 t.Fatal(err)
486 }
487 }
488
489 expectedRoot := mt.Root()
490
491 k := big.NewInt(8)
492 v := big.NewInt(0)
493 err := mt.Add(k, v)
494 require.Nil(t, err)
495
496 err = mt.Delete(big.NewInt(8))
497 assert.Nil(t, err)
498 assert.Equal(t, expectedRoot, mt.Root())
499
500 mt2 := newTestingMerkle(t, 140)
501 defer mt2.db.Close()
502 for i := 0; i < 8; i++ {
503 k := big.NewInt(int64(i))
504 v := big.NewInt(0)
505 if err := mt2.Add(k, v); err != nil {
506 t.Fatal(err)
507 }
508 }
509 assert.Equal(t, mt2.Root(), mt.Root())
510}
511
512func TestDelete3(t *testing.T) {
513 mt := newTestingMerkle(t, 140)
514 defer mt.db.Close()
515
516 err := mt.Add(big.NewInt(1), big.NewInt(1))
517 assert.Nil(t, err)
518
519 err = mt.Add(big.NewInt(2), big.NewInt(2))
520 assert.Nil(t, err)
521
522 assert.Equal(t, "6701939280963330813043570145125351311131831356446202146710280245621673558344", mt.Root().BigInt().String()) //nolint:lll
523 err = mt.Delete(big.NewInt(1))
524 assert.Nil(t, err)
525 assert.Equal(t, "10304354743004778619823249005484018655542356856535590307973732141291410579841", mt.Root().BigInt().String()) //nolint:lll
526
527 mt2 := newTestingMerkle(t, 140)
528 defer mt2.db.Close()
529 err = mt2.Add(big.NewInt(2), big.NewInt(2))
530 assert.Nil(t, err)
531 assert.Equal(t, mt2.Root(), mt.Root())
532}
533
534func TestDelete4(t *testing.T) {
535 mt := newTestingMerkle(t, 140)
536 defer mt.db.Close()
537
538 err := mt.Add(big.NewInt(1), big.NewInt(1))
539 assert.Nil(t, err)
540
541 err = mt.Add(big.NewInt(2), big.NewInt(2))
542 assert.Nil(t, err)
543
544 err = mt.Add(big.NewInt(3), big.NewInt(3))
545 assert.Nil(t, err)
546
547 assert.Equal(t, "6989694633650442615746486460134957295274675622748484439660143938730686550248", mt.Root().BigInt().String()) //nolint:lll
548 err = mt.Delete(big.NewInt(1))
549 assert.Nil(t, err)
550 assert.Equal(t, "1192610901536912535888866440319084773171371421781091005185759505381507049136", mt.Root().BigInt().String()) //nolint:lll
551
552 mt2 := newTestingMerkle(t, 140)
553 defer mt2.db.Close()
554 err = mt2.Add(big.NewInt(2), big.NewInt(2))
555 assert.Nil(t, err)
556 err = mt2.Add(big.NewInt(3), big.NewInt(3))
557 assert.Nil(t, err)
558 assert.Equal(t, mt2.Root(), mt.Root())
559}
560
561func TestDelete5(t *testing.T) {
562 mt, err := NewMerkleTree(memory.NewMemoryStorage(), 10)
563 assert.Nil(t, err)
564
565 err = mt.Add(big.NewInt(1), big.NewInt(2))
566 assert.Nil(t, err)
567 err = mt.Add(big.NewInt(33), big.NewInt(44))
568 assert.Nil(t, err)
569 assert.Equal(t, "11404118908468506234838877883514126008995570353394659302846433035311596046064", mt.Root().BigInt().String()) //nolint:lll
570
571 err = mt.Delete(big.NewInt(1))
572 assert.Nil(t, err)
573 assert.Equal(t, "12802904154263054831102426711825443668153853847661287611768065280921698471037", mt.Root().BigInt().String()) //nolint:lll
574
575 mt2 := newTestingMerkle(t, 140)
576 defer mt2.db.Close()
577 err = mt2.Add(big.NewInt(33), big.NewInt(44))
578 assert.Nil(t, err)
579 assert.Equal(t, mt2.Root(), mt.Root())
580}
581
582func TestDeleteNonExistingKeys(t *testing.T) {
583 mt, err := NewMerkleTree(memory.NewMemoryStorage(), 10)
584 assert.Nil(t, err)
585
586 err = mt.Add(big.NewInt(1), big.NewInt(2))
587 assert.Nil(t, err)
588 err = mt.Add(big.NewInt(33), big.NewInt(44))
589 assert.Nil(t, err)
590
591 err = mt.Delete(big.NewInt(33))
592 assert.Nil(t, err)
593 err = mt.Delete(big.NewInt(33))
594 assert.Equal(t, ErrKeyNotFound, err)
595
596 err = mt.Delete(big.NewInt(1))
597 assert.Nil(t, err)
598
599 assert.Equal(t, "0", mt.Root().String())
600
601 err = mt.Delete(big.NewInt(33))
602 assert.Equal(t, ErrKeyNotFound, err)
603}
604
605func TestDumpLeafsImportLeafs(t *testing.T) {
606 mt, err := NewMerkleTree(memory.NewMemoryStorage(), 140)
607 require.Nil(t, err)
608 defer mt.db.Close()
609
610 q1 := new(big.Int).Sub(constants.Q, big.NewInt(1))
611 for i := 0; i < 10; i++ {
612 // use numbers near under Q
613 k := new(big.Int).Sub(q1, big.NewInt(int64(i)))
614 v := big.NewInt(0)
615 err = mt.Add(k, v)
616 require.Nil(t, err)
617
618 // use numbers near above 0
619 k = big.NewInt(int64(i))
620 err = mt.Add(k, v)
621 require.Nil(t, err)
622 }
623
624 d, err := mt.DumpLeafs(nil)
625 assert.Nil(t, err)
626
627 mt2, err := NewMerkleTree(memory.NewMemoryStorage(), 140)
628 require.Nil(t, err)
629 defer mt2.db.Close()
630 err = mt2.ImportDumpedLeafs(d)
631 assert.Nil(t, err)
632
633 assert.Equal(t, mt.Root(), mt2.Root())
634}
635
636func TestAddAndGetCircomProof(t *testing.T) {
637 mt, err := NewMerkleTree(memory.NewMemoryStorage(), 10)
638 assert.Nil(t, err)
639 assert.Equal(t, "0", mt.Root().String())
640
641 // test vectors generated using https://github.com/iden3/circomlib smt.js
642 cpp, err := mt.AddAndGetCircomProof(big.NewInt(1), big.NewInt(2))
643 assert.Nil(t, err)
644 assert.Equal(t, "0", cpp.OldRoot.String())
645 assert.Equal(t, "64497120...", cpp.NewRoot.String())
646 assert.Equal(t, "0", cpp.OldKey.String())
647 assert.Equal(t, "0", cpp.OldValue.String())
648 assert.Equal(t, "1", cpp.NewKey.String())
649 assert.Equal(t, "2", cpp.NewValue.String())
650 assert.Equal(t, true, cpp.IsOld0)
651 assert.Equal(t, "[0 0 0 0 0 0 0 0 0 0 0]", fmt.Sprintf("%v", cpp.Siblings))
652 assert.Equal(t, mt.maxLevels+1, len(cpp.Siblings))
653
654 cpp, err = mt.AddAndGetCircomProof(big.NewInt(33), big.NewInt(44))
655 assert.Nil(t, err)
656 assert.Equal(t, "64497120...", cpp.OldRoot.String())
657 assert.Equal(t, "11404118...", cpp.NewRoot.String())
658 assert.Equal(t, "1", cpp.OldKey.String())
659 assert.Equal(t, "2", cpp.OldValue.String())
660 assert.Equal(t, "33", cpp.NewKey.String())
661 assert.Equal(t, "44", cpp.NewValue.String())
662 assert.Equal(t, false, cpp.IsOld0)
663 assert.Equal(t, "[0 0 0 0 0 0 0 0 0 0 0]", fmt.Sprintf("%v", cpp.Siblings))
664 assert.Equal(t, mt.maxLevels+1, len(cpp.Siblings))
665
666 cpp, err = mt.AddAndGetCircomProof(big.NewInt(55), big.NewInt(66))
667 assert.Nil(t, err)
668 assert.Equal(t, "11404118...", cpp.OldRoot.String())
669 assert.Equal(t, "18284203...", cpp.NewRoot.String())
670 assert.Equal(t, "0", cpp.OldKey.String())
671 assert.Equal(t, "0", cpp.OldValue.String())
672 assert.Equal(t, "55", cpp.NewKey.String())
673 assert.Equal(t, "66", cpp.NewValue.String())
674 assert.Equal(t, true, cpp.IsOld0)
675 assert.Equal(t, "[0 42948778... 0 0 0 0 0 0 0 0 0]", fmt.Sprintf("%v", cpp.Siblings))
676 assert.Equal(t, mt.maxLevels+1, len(cpp.Siblings))
677}
678
679func TestUpdateCircomProcessorProof(t *testing.T) {
680 mt := newTestingMerkle(t, 10)
681 defer mt.db.Close()
682
683 for i := 0; i < 16; i++ {
684 k := big.NewInt(int64(i))
685 v := big.NewInt(int64(i * 2))
686 if err := mt.Add(k, v); err != nil {
687 t.Fatal(err)
688 }
689 }
690 _, v, _, err := mt.Get(big.NewInt(10))
691 assert.Nil(t, err)
692 assert.Equal(t, big.NewInt(20), v)
693
694 // test vectors generated using https://github.com/iden3/circomlib smt.js
695 cpp, err := mt.Update(big.NewInt(10), big.NewInt(1024))
696 assert.Nil(t, err)
697 assert.Equal(t, "14895645...", cpp.OldRoot.String())
698 assert.Equal(t, "75223641...", cpp.NewRoot.String())
699 assert.Equal(t, "10", cpp.OldKey.String())
700 assert.Equal(t, "20", cpp.OldValue.String())
701 assert.Equal(t, "10", cpp.NewKey.String())
702 assert.Equal(t, "1024", cpp.NewValue.String())
703 assert.Equal(t, false, cpp.IsOld0)
704 assert.Equal(t,
705 "[19625419... 46910949... 18399594... 20473908... 0 0 0 0 0 0 0]",
706 fmt.Sprintf("%v", cpp.Siblings))
707}
708
709func TestSmtVerifier(t *testing.T) {
710 mt, err := NewMerkleTree(memory.NewMemoryStorage(), 4)
711 assert.Nil(t, err)
712
713 err = mt.Add(big.NewInt(1), big.NewInt(11))
714 assert.Nil(t, err)
715
716 cvp, err := mt.GenerateSCVerifierProof(big.NewInt(1), nil)
717 assert.Nil(t, err)
718 jCvp, err := json.Marshal(cvp)
719 assert.Nil(t, err)
720 // expect siblings to be '[]', instead of 'null'
721 expected := `{"root":"14137057030252181222327992235694793580963111268072013054745223667806564674729","siblings":[],"oldKey":"0","oldValue":"0","isOld0":false,"key":"1","value":"11","fnc":0}` //nolint:lll
722
723 assert.Equal(t, expected, string(jCvp))
724 err = mt.Add(big.NewInt(2), big.NewInt(22))
725 assert.Nil(t, err)
726 err = mt.Add(big.NewInt(3), big.NewInt(33))
727 assert.Nil(t, err)
728 err = mt.Add(big.NewInt(4), big.NewInt(44))
729 assert.Nil(t, err)
730
731 cvp, err = mt.GenerateCircomVerifierProof(big.NewInt(2), nil)
732 assert.Nil(t, err)
733
734 jCvp, err = json.Marshal(cvp)
735 assert.Nil(t, err)
736 // Test vectors generated using https://github.com/iden3/circomlib smt.js
737 // Expect siblings with the extra 0 that the circom circuits need
738 expected = `{"root":"10171140035965439966839815283432442651152991056297946102647688349369299124493","siblings":["12422661758472400223401299094238820777063458096110016599986781158438915645129","4330149052063565277182642012557086942088176847773467265587998154672740895682","0","0","0"],"oldKey":"0","oldValue":"0","isOld0":false,"key":"2","value":"22","fnc":0}` //nolint:lll
739 assert.Equal(t, expected, string(jCvp))
740
741 cvp, err = mt.GenerateSCVerifierProof(big.NewInt(2), nil)
742 assert.Nil(t, err)
743
744 jCvp, err = json.Marshal(cvp)
745 assert.Nil(t, err)
746 // Test vectors generated using https://github.com/iden3/circomlib smt.js
747 // Without the extra 0 that the circom circuits need, but that are not
748 // needed at a smart contract verification
749 expected = `{"root":"10171140035965439966839815283432442651152991056297946102647688349369299124493","siblings":["12422661758472400223401299094238820777063458096110016599986781158438915645129","4330149052063565277182642012557086942088176847773467265587998154672740895682"],"oldKey":"0","oldValue":"0","isOld0":false,"key":"2","value":"22","fnc":0}` //nolint:lll
750 assert.Equal(t, expected, string(jCvp))
751}
752
753func TestTypesMarshalers(t *testing.T) {
754 // test Hash marshalers
755 h, err := NewHashFromString("42")
756 assert.Nil(t, err)
757 s, err := json.Marshal(h)
758 assert.Nil(t, err)
759 var h2 *Hash
760 err = json.Unmarshal(s, &h2)
761 assert.Nil(t, err)
762 assert.Equal(t, h, h2)
763
764 // create CircomProcessorProof
765 mt := newTestingMerkle(t, 10)
766 defer mt.db.Close()
767 for i := 0; i < 16; i++ {
768 k := big.NewInt(int64(i))
769 v := big.NewInt(int64(i * 2))
770 if err := mt.Add(k, v); err != nil {
771 t.Fatal(err)
772 }
773 }
774 _, v, _, err := mt.Get(big.NewInt(10))
775 assert.Nil(t, err)
776 assert.Equal(t, big.NewInt(20), v)
777 cpp, err := mt.Update(big.NewInt(10), big.NewInt(1024))
778 assert.Nil(t, err)
779
780 // test CircomProcessorProof marshalers
781 b, err := json.Marshal(&cpp)
782 assert.Nil(t, err)
783
784 var cpp2 *CircomProcessorProof
785 err = json.Unmarshal(b, &cpp2)
786 assert.Nil(t, err)
787 assert.Equal(t, cpp, cpp2)
788}