You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

645 lines
20 KiB

3 years ago
  1. package merkletree
  2. import (
  3. "bytes"
  4. "encoding/hex"
  5. "fmt"
  6. "math/big"
  7. "testing"
  8. "github.com/iden3/go-iden3-core/common"
  9. "github.com/iden3/go-merkletree/db/memory"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/stretchr/testify/require"
  12. )
  13. var debug = false
  14. type Fatalable interface {
  15. Fatal(args ...interface{})
  16. }
  17. func newTestingMerkle(f Fatalable, numLevels int) *MerkleTree {
  18. mt, err := NewMerkleTree(memory.NewMemoryStorage(), numLevels)
  19. if err != nil {
  20. f.Fatal(err)
  21. return nil
  22. }
  23. return mt
  24. }
  25. func TestHashParsers(t *testing.T) {
  26. h0 := NewHashFromBigInt(big.NewInt(0))
  27. assert.Equal(t, "0", h0.String())
  28. h1 := NewHashFromBigInt(big.NewInt(1))
  29. assert.Equal(t, "1", h1.String())
  30. h10 := NewHashFromBigInt(big.NewInt(10))
  31. assert.Equal(t, "10", h10.String())
  32. h7l := NewHashFromBigInt(big.NewInt(1234567))
  33. assert.Equal(t, "1234567", h7l.String())
  34. h8l := NewHashFromBigInt(big.NewInt(12345678))
  35. assert.Equal(t, "12345678...", h8l.String())
  36. b, ok := new(big.Int).SetString("4932297968297298434239270129193057052722409868268166443802652458940273154854", 10)
  37. assert.True(t, ok)
  38. h := NewHashFromBigInt(b)
  39. assert.Equal(t, "4932297968297298434239270129193057052722409868268166443802652458940273154854", h.BigInt().String())
  40. assert.Equal(t, "49322979...", h.String())
  41. assert.Equal(t, "0ae794eb9c3d8bbb9002e993fc2ed301dcbd2af5508ed072c375e861f1aa5b26", h.Hex())
  42. b1, err := NewBigIntFromBytes(b.Bytes())
  43. assert.Nil(t, err)
  44. assert.Equal(t, new(big.Int).SetBytes(common.SwapEndianness(b.Bytes())).String(), b1.String())
  45. b2, err := NewHashFromBytes(b.Bytes())
  46. assert.Nil(t, err)
  47. assert.Equal(t, b.String(), b2.BigInt().String())
  48. h2, err := NewHashFromHex(h.Hex())
  49. assert.Nil(t, err)
  50. assert.Equal(t, h, h2)
  51. _, err = NewHashFromHex("0x12")
  52. assert.NotNil(t, err)
  53. }
  54. func TestNewTree(t *testing.T) {
  55. mt, err := NewMerkleTree(memory.NewMemoryStorage(), 10)
  56. assert.Nil(t, err)
  57. assert.Equal(t, "0", mt.Root().String())
  58. // test vectors generated using https://github.com/iden3/circomlib smt.js
  59. err = mt.Add(big.NewInt(1), big.NewInt(2))
  60. assert.Nil(t, err)
  61. assert.Equal(t, "6449712043256457369579901840927028403950625973089336675272087704159094984964", mt.Root().BigInt().String())
  62. err = mt.Add(big.NewInt(33), big.NewInt(44))
  63. assert.Nil(t, err)
  64. assert.Equal(t, "11404118908468506234838877883514126008995570353394659302846433035311596046064", mt.Root().BigInt().String())
  65. err = mt.Add(big.NewInt(1234), big.NewInt(9876))
  66. assert.Nil(t, err)
  67. assert.Equal(t, "12841932325181810040554102151615400973767747666110051836366805309524360490677", mt.Root().BigInt().String())
  68. proof, v, err := mt.GenerateProof(big.NewInt(33), nil)
  69. assert.Nil(t, err)
  70. assert.Equal(t, big.NewInt(44), v)
  71. assert.True(t, VerifyProof(mt.Root(), proof, big.NewInt(33), big.NewInt(44)))
  72. assert.True(t, !VerifyProof(mt.Root(), proof, big.NewInt(33), big.NewInt(45)))
  73. }
  74. func TestAddDifferentOrder(t *testing.T) {
  75. mt1 := newTestingMerkle(t, 140)
  76. defer mt1.db.Close()
  77. for i := 0; i < 16; i++ {
  78. k := big.NewInt(int64(i))
  79. v := big.NewInt(0)
  80. if err := mt1.Add(k, v); err != nil {
  81. t.Fatal(err)
  82. }
  83. }
  84. mt2 := newTestingMerkle(t, 140)
  85. defer mt2.db.Close()
  86. for i := 16 - 1; i >= 0; i-- {
  87. k := big.NewInt(int64(i))
  88. v := big.NewInt(0)
  89. if err := mt2.Add(k, v); err != nil {
  90. t.Fatal(err)
  91. }
  92. }
  93. assert.Equal(t, mt1.Root().Hex(), mt2.Root().Hex())
  94. assert.Equal(t, "0630b27c6f8c7d36d144369ab1ac408552b544ebe96ad642bad6a94a96258e26", mt1.Root().Hex())
  95. }
  96. func TestAddRepeatedIndex(t *testing.T) {
  97. mt := newTestingMerkle(t, 140)
  98. defer mt.db.Close()
  99. k := big.NewInt(int64(3))
  100. v := big.NewInt(int64(12))
  101. if err := mt.Add(k, v); err != nil {
  102. t.Fatal(err)
  103. }
  104. err := mt.Add(k, v)
  105. assert.NotNil(t, err)
  106. assert.Equal(t, err, ErrEntryIndexAlreadyExists)
  107. }
  108. func TestGet(t *testing.T) {
  109. mt := newTestingMerkle(t, 140)
  110. defer mt.db.Close()
  111. for i := 0; i < 16; i++ {
  112. k := big.NewInt(int64(i))
  113. v := big.NewInt(int64(i * 2))
  114. if err := mt.Add(k, v); err != nil {
  115. t.Fatal(err)
  116. }
  117. }
  118. k, v, _, err := mt.Get(big.NewInt(10))
  119. assert.Nil(t, err)
  120. assert.Equal(t, big.NewInt(10), k)
  121. assert.Equal(t, big.NewInt(20), v)
  122. k, v, _, err = mt.Get(big.NewInt(15))
  123. assert.Nil(t, err)
  124. assert.Equal(t, big.NewInt(15), k)
  125. assert.Equal(t, big.NewInt(30), v)
  126. k, v, _, err = mt.Get(big.NewInt(16))
  127. assert.NotNil(t, err)
  128. assert.Equal(t, ErrKeyNotFound, err)
  129. assert.Equal(t, "0", k.String())
  130. assert.Equal(t, "0", v.String())
  131. }
  132. func TestUpdate(t *testing.T) {
  133. mt := newTestingMerkle(t, 140)
  134. defer mt.db.Close()
  135. for i := 0; i < 16; i++ {
  136. k := big.NewInt(int64(i))
  137. v := big.NewInt(int64(i * 2))
  138. if err := mt.Add(k, v); err != nil {
  139. t.Fatal(err)
  140. }
  141. }
  142. _, v, _, err := mt.Get(big.NewInt(10))
  143. assert.Nil(t, err)
  144. assert.Equal(t, big.NewInt(20), v)
  145. _, err = mt.Update(big.NewInt(10), big.NewInt(1024))
  146. assert.Nil(t, err)
  147. _, v, _, err = mt.Get(big.NewInt(10))
  148. assert.Nil(t, err)
  149. assert.Equal(t, big.NewInt(1024), v)
  150. _, err = mt.Update(big.NewInt(1000), big.NewInt(1024))
  151. assert.Equal(t, ErrKeyNotFound, err)
  152. }
  153. func TestUpdate2(t *testing.T) {
  154. mt1 := newTestingMerkle(t, 140)
  155. defer mt1.db.Close()
  156. mt2 := newTestingMerkle(t, 140)
  157. defer mt2.db.Close()
  158. err := mt1.Add(big.NewInt(1), big.NewInt(119))
  159. assert.Nil(t, err)
  160. err = mt1.Add(big.NewInt(2), big.NewInt(229))
  161. assert.Nil(t, err)
  162. err = mt1.Add(big.NewInt(9876), big.NewInt(6789))
  163. assert.Nil(t, err)
  164. err = mt2.Add(big.NewInt(1), big.NewInt(11))
  165. assert.Nil(t, err)
  166. err = mt2.Add(big.NewInt(2), big.NewInt(22))
  167. assert.Nil(t, err)
  168. err = mt2.Add(big.NewInt(9876), big.NewInt(10))
  169. assert.Nil(t, err)
  170. _, err = mt1.Update(big.NewInt(1), big.NewInt(11))
  171. assert.Nil(t, err)
  172. _, err = mt1.Update(big.NewInt(2), big.NewInt(22))
  173. assert.Nil(t, err)
  174. _, err = mt2.Update(big.NewInt(9876), big.NewInt(6789))
  175. assert.Nil(t, err)
  176. assert.Equal(t, mt1.Root(), mt2.Root())
  177. }
  178. func TestGenerateAndVerifyProof128(t *testing.T) {
  179. mt, err := NewMerkleTree(memory.NewMemoryStorage(), 140)
  180. require.Nil(t, err)
  181. defer mt.db.Close()
  182. for i := 0; i < 128; i++ {
  183. k := big.NewInt(int64(i))
  184. v := big.NewInt(0)
  185. if err := mt.Add(k, v); err != nil {
  186. t.Fatal(err)
  187. }
  188. }
  189. proof, v, err := mt.GenerateProof(big.NewInt(42), nil)
  190. assert.Nil(t, err)
  191. assert.Equal(t, "0", v.String())
  192. assert.True(t, VerifyProof(mt.Root(), proof, big.NewInt(42), big.NewInt(0)))
  193. }
  194. func TestTreeLimit(t *testing.T) {
  195. mt, err := NewMerkleTree(memory.NewMemoryStorage(), 5)
  196. require.Nil(t, err)
  197. defer mt.db.Close()
  198. for i := 0; i < 16; i++ {
  199. err = mt.Add(big.NewInt(int64(i)), big.NewInt(int64(i)))
  200. assert.Nil(t, err)
  201. }
  202. // here the tree is full, should not allow to add more data as reaches the maximum number of levels
  203. err = mt.Add(big.NewInt(int64(16)), big.NewInt(int64(16)))
  204. assert.NotNil(t, err)
  205. assert.Equal(t, ErrReachedMaxLevel, err)
  206. }
  207. func TestSiblingsFromProof(t *testing.T) {
  208. mt, err := NewMerkleTree(memory.NewMemoryStorage(), 140)
  209. require.Nil(t, err)
  210. defer mt.db.Close()
  211. for i := 0; i < 64; i++ {
  212. k := big.NewInt(int64(i))
  213. v := big.NewInt(0)
  214. if err := mt.Add(k, v); err != nil {
  215. t.Fatal(err)
  216. }
  217. }
  218. proof, _, err := mt.GenerateProof(big.NewInt(4), nil)
  219. if err != nil {
  220. t.Fatal(err)
  221. }
  222. siblings := SiblingsFromProof(proof)
  223. assert.Equal(t, 6, len(siblings))
  224. assert.Equal(t, "2f59aeef9e5b881609aa56940dba76b5cb1440a794f4eb03ad5e5958dd8b475b", siblings[0].Hex())
  225. assert.Equal(t, "2eb29ffbded0987f36a62aecddf748d2b9bf28326300bfa15e474e0a12abe8c1", siblings[1].Hex())
  226. assert.Equal(t, "0c6ee1298933d073a390cc3d267a8a4d5a7df65a126d3fdc5a16b9c28afddaf4", siblings[2].Hex())
  227. assert.Equal(t, "1575898b0b4e7802a6be130e7b76ede64fe42079b6852eba6af985bd46a34aa9", siblings[3].Hex())
  228. assert.Equal(t, "1d15b701c1fd521841120980c5cbfa86f15b1f22bf1d3079ed0d0314751d7954", siblings[4].Hex())
  229. assert.Equal(t, "1ee00f37756159cfefaa0bce02779460b449a049165f3bb9fef81105bc285d43", siblings[5].Hex())
  230. }
  231. func TestVerifyProofCases(t *testing.T) {
  232. mt := newTestingMerkle(t, 140)
  233. defer mt.DB().Close()
  234. for i := 0; i < 8; i++ {
  235. if err := mt.Add(big.NewInt(int64(i)), big.NewInt(0)); err != nil {
  236. t.Fatal(err)
  237. }
  238. }
  239. // Existence proof
  240. proof, _, err := mt.GenerateProof(big.NewInt(4), nil)
  241. if err != nil {
  242. t.Fatal(err)
  243. }
  244. assert.Equal(t, proof.Existence, true)
  245. assert.True(t, VerifyProof(mt.Root(), proof, big.NewInt(4), big.NewInt(0)))
  246. assert.Equal(t, "0003000000000000000000000000000000000000000000000000000000000007a6d6b46fefe213a6b579844a1bb7ab5c2db4a13f8662d9c5e729c36728f42730211ddfcc8d30ebd157d1d6912769b8e4abdca41e5dc2b57b026a361c091a8c14c748530e61bf8ea80c987657c3d24b134ece1ef8e2d4bd3f74437bf4392a6b1e", hex.EncodeToString(proof.Bytes()))
  247. for i := 8; i < 32; i++ {
  248. proof, _, err = mt.GenerateProof(big.NewInt(int64(i)), nil)
  249. assert.Nil(t, err)
  250. if debug {
  251. fmt.Println(i, proof)
  252. }
  253. }
  254. // Non-existence proof, empty aux
  255. proof, _, err = mt.GenerateProof(big.NewInt(12), nil)
  256. if err != nil {
  257. t.Fatal(err)
  258. }
  259. assert.Equal(t, proof.Existence, false)
  260. // assert.True(t, proof.nodeAux == nil)
  261. assert.True(t, VerifyProof(mt.Root(), proof, big.NewInt(12), big.NewInt(0)))
  262. assert.Equal(t, "0303000000000000000000000000000000000000000000000000000000000007a6d6b46fefe213a6b579844a1bb7ab5c2db4a13f8662d9c5e729c36728f42730211ddfcc8d30ebd157d1d6912769b8e4abdca41e5dc2b57b026a361c091a8c14c748530e61bf8ea80c987657c3d24b134ece1ef8e2d4bd3f74437bf4392a6b1e04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", hex.EncodeToString(proof.Bytes()))
  263. // Non-existence proof, diff. node aux
  264. proof, _, err = mt.GenerateProof(big.NewInt(10), nil)
  265. if err != nil {
  266. t.Fatal(err)
  267. }
  268. assert.Equal(t, proof.Existence, false)
  269. assert.True(t, proof.NodeAux != nil)
  270. assert.True(t, VerifyProof(mt.Root(), proof, big.NewInt(10), big.NewInt(0)))
  271. assert.Equal(t, "0303000000000000000000000000000000000000000000000000000000000007a6d6b46fefe213a6b579844a1bb7ab5c2db4a13f8662d9c5e729c36728f42730e667e2ca15909c4a23beff18e3cc74348fbd3c1a4c765a5bbbca126c9607a42b77e008a73926f1280f8531b139dc1cacf8d83fcec31d405f5c51b7cbddfe152902000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", hex.EncodeToString(proof.Bytes()))
  272. }
  273. func TestVerifyProofFalse(t *testing.T) {
  274. mt := newTestingMerkle(t, 140)
  275. defer mt.DB().Close()
  276. for i := 0; i < 8; i++ {
  277. if err := mt.Add(big.NewInt(int64(i)), big.NewInt(0)); err != nil {
  278. t.Fatal(err)
  279. }
  280. }
  281. // Invalid existence proof (node used for verification doesn't
  282. // correspond to node in the proof)
  283. proof, _, err := mt.GenerateProof(big.NewInt(int64(4)), nil)
  284. if err != nil {
  285. t.Fatal(err)
  286. }
  287. assert.Equal(t, proof.Existence, true)
  288. assert.True(t, !VerifyProof(mt.Root(), proof, big.NewInt(int64(5)), big.NewInt(int64(5))))
  289. // Invalid non-existence proof (Non-existence proof, diff. node aux)
  290. proof, _, err = mt.GenerateProof(big.NewInt(int64(4)), nil)
  291. if err != nil {
  292. t.Fatal(err)
  293. }
  294. assert.Equal(t, proof.Existence, true)
  295. // Now we change the proof from existence to non-existence, and add e's
  296. // data as auxiliary node.
  297. proof.Existence = false
  298. proof.NodeAux = &NodeAux{Key: NewHashFromBigInt(big.NewInt(int64(4))), Value: NewHashFromBigInt(big.NewInt(4))}
  299. assert.True(t, !VerifyProof(mt.Root(), proof, big.NewInt(int64(4)), big.NewInt(0)))
  300. }
  301. func TestGraphViz(t *testing.T) {
  302. mt, err := NewMerkleTree(memory.NewMemoryStorage(), 10)
  303. assert.Nil(t, err)
  304. _ = mt.Add(big.NewInt(1), big.NewInt(0))
  305. _ = mt.Add(big.NewInt(2), big.NewInt(0))
  306. _ = mt.Add(big.NewInt(3), big.NewInt(0))
  307. _ = mt.Add(big.NewInt(4), big.NewInt(0))
  308. _ = mt.Add(big.NewInt(5), big.NewInt(0))
  309. _ = mt.Add(big.NewInt(100), big.NewInt(0))
  310. // mt.PrintGraphViz(nil)
  311. expected := `digraph hierarchy {
  312. node [fontname=Monospace,fontsize=10,shape=box]
  313. "16053348..." -> {"19137630..." "14119616..."}
  314. "19137630..." -> {"19543983..." "19746229..."}
  315. "19543983..." -> {"empty0" "65773153..."}
  316. "empty0" [style=dashed,label=0];
  317. "65773153..." -> {"73498412..." "empty1"}
  318. "empty1" [style=dashed,label=0];
  319. "73498412..." -> {"53169236..." "empty2"}
  320. "empty2" [style=dashed,label=0];
  321. "53169236..." -> {"73522717..." "34811870..."}
  322. "73522717..." [style=filled];
  323. "34811870..." [style=filled];
  324. "19746229..." [style=filled];
  325. "14119616..." -> {"19419204..." "15569531..."}
  326. "19419204..." -> {"78154875..." "34589916..."}
  327. "78154875..." [style=filled];
  328. "34589916..." [style=filled];
  329. "15569531..." [style=filled];
  330. }
  331. `
  332. w := bytes.NewBufferString("")
  333. err = mt.GraphViz(w, nil)
  334. assert.Nil(t, err)
  335. assert.Equal(t, []byte(expected), w.Bytes())
  336. }
  337. func TestDelete(t *testing.T) {
  338. mt, err := NewMerkleTree(memory.NewMemoryStorage(), 10)
  339. assert.Nil(t, err)
  340. assert.Equal(t, "0", mt.Root().String())
  341. // test vectors generated using https://github.com/iden3/circomlib smt.js
  342. err = mt.Add(big.NewInt(1), big.NewInt(2))
  343. assert.Nil(t, err)
  344. assert.Equal(t, "6449712043256457369579901840927028403950625973089336675272087704159094984964", mt.Root().BigInt().String())
  345. err = mt.Add(big.NewInt(33), big.NewInt(44))
  346. assert.Nil(t, err)
  347. assert.Equal(t, "11404118908468506234838877883514126008995570353394659302846433035311596046064", mt.Root().BigInt().String())
  348. err = mt.Add(big.NewInt(1234), big.NewInt(9876))
  349. assert.Nil(t, err)
  350. assert.Equal(t, "12841932325181810040554102151615400973767747666110051836366805309524360490677", mt.Root().BigInt().String())
  351. // mt.PrintGraphViz(nil)
  352. err = mt.Delete(big.NewInt(33))
  353. // mt.PrintGraphViz(nil)
  354. assert.Nil(t, err)
  355. assert.Equal(t, "16195585003843604118922861401064871511855368913846540536604351220077317790615", mt.Root().BigInt().String())
  356. err = mt.Delete(big.NewInt(1234))
  357. assert.Nil(t, err)
  358. err = mt.Delete(big.NewInt(1))
  359. assert.Nil(t, err)
  360. assert.Equal(t, "0", mt.Root().String())
  361. }
  362. func TestDelete2(t *testing.T) {
  363. mt := newTestingMerkle(t, 140)
  364. defer mt.db.Close()
  365. for i := 0; i < 8; i++ {
  366. k := big.NewInt(int64(i))
  367. v := big.NewInt(0)
  368. if err := mt.Add(k, v); err != nil {
  369. t.Fatal(err)
  370. }
  371. }
  372. expectedRoot := mt.Root()
  373. k := big.NewInt(8)
  374. v := big.NewInt(0)
  375. err := mt.Add(k, v)
  376. require.Nil(t, err)
  377. err = mt.Delete(big.NewInt(8))
  378. assert.Nil(t, err)
  379. assert.Equal(t, expectedRoot, mt.Root())
  380. mt2 := newTestingMerkle(t, 140)
  381. defer mt2.db.Close()
  382. for i := 0; i < 8; i++ {
  383. k := big.NewInt(int64(i))
  384. v := big.NewInt(0)
  385. if err := mt2.Add(k, v); err != nil {
  386. t.Fatal(err)
  387. }
  388. }
  389. assert.Equal(t, mt2.Root(), mt.Root())
  390. }
  391. func TestDelete3(t *testing.T) {
  392. mt := newTestingMerkle(t, 140)
  393. defer mt.db.Close()
  394. err := mt.Add(big.NewInt(1), big.NewInt(1))
  395. assert.Nil(t, err)
  396. err = mt.Add(big.NewInt(2), big.NewInt(2))
  397. assert.Nil(t, err)
  398. assert.Equal(t, "6701939280963330813043570145125351311131831356446202146710280245621673558344", mt.Root().BigInt().String())
  399. err = mt.Delete(big.NewInt(1))
  400. assert.Nil(t, err)
  401. assert.Equal(t, "10304354743004778619823249005484018655542356856535590307973732141291410579841", mt.Root().BigInt().String())
  402. mt2 := newTestingMerkle(t, 140)
  403. defer mt2.db.Close()
  404. err = mt2.Add(big.NewInt(2), big.NewInt(2))
  405. assert.Nil(t, err)
  406. assert.Equal(t, mt2.Root(), mt.Root())
  407. }
  408. func TestDelete4(t *testing.T) {
  409. mt := newTestingMerkle(t, 140)
  410. defer mt.db.Close()
  411. err := mt.Add(big.NewInt(1), big.NewInt(1))
  412. assert.Nil(t, err)
  413. err = mt.Add(big.NewInt(2), big.NewInt(2))
  414. assert.Nil(t, err)
  415. err = mt.Add(big.NewInt(3), big.NewInt(3))
  416. assert.Nil(t, err)
  417. assert.Equal(t, "6989694633650442615746486460134957295274675622748484439660143938730686550248", mt.Root().BigInt().String())
  418. err = mt.Delete(big.NewInt(1))
  419. assert.Nil(t, err)
  420. assert.Equal(t, "1192610901536912535888866440319084773171371421781091005185759505381507049136", mt.Root().BigInt().String())
  421. mt2 := newTestingMerkle(t, 140)
  422. defer mt2.db.Close()
  423. err = mt2.Add(big.NewInt(2), big.NewInt(2))
  424. assert.Nil(t, err)
  425. err = mt2.Add(big.NewInt(3), big.NewInt(3))
  426. assert.Nil(t, err)
  427. assert.Equal(t, mt2.Root(), mt.Root())
  428. }
  429. func TestDelete5(t *testing.T) {
  430. mt, err := NewMerkleTree(memory.NewMemoryStorage(), 10)
  431. assert.Nil(t, err)
  432. err = mt.Add(big.NewInt(1), big.NewInt(2))
  433. assert.Nil(t, err)
  434. err = mt.Add(big.NewInt(33), big.NewInt(44))
  435. assert.Nil(t, err)
  436. assert.Equal(t, "11404118908468506234838877883514126008995570353394659302846433035311596046064", mt.Root().BigInt().String())
  437. err = mt.Delete(big.NewInt(1))
  438. assert.Nil(t, err)
  439. assert.Equal(t, "12802904154263054831102426711825443668153853847661287611768065280921698471037", mt.Root().BigInt().String())
  440. mt2 := newTestingMerkle(t, 140)
  441. defer mt2.db.Close()
  442. err = mt2.Add(big.NewInt(33), big.NewInt(44))
  443. assert.Nil(t, err)
  444. assert.Equal(t, mt2.Root(), mt.Root())
  445. }
  446. func TestDeleteNonExistingKeys(t *testing.T) {
  447. mt, err := NewMerkleTree(memory.NewMemoryStorage(), 10)
  448. assert.Nil(t, err)
  449. err = mt.Add(big.NewInt(1), big.NewInt(2))
  450. assert.Nil(t, err)
  451. err = mt.Add(big.NewInt(33), big.NewInt(44))
  452. assert.Nil(t, err)
  453. err = mt.Delete(big.NewInt(33))
  454. assert.Nil(t, err)
  455. err = mt.Delete(big.NewInt(33))
  456. assert.Equal(t, ErrKeyNotFound, err)
  457. err = mt.Delete(big.NewInt(1))
  458. assert.Nil(t, err)
  459. assert.Equal(t, "0", mt.Root().String())
  460. err = mt.Delete(big.NewInt(33))
  461. assert.Equal(t, ErrKeyNotFound, err)
  462. }
  463. func TestDumpLeafsImportLeafs(t *testing.T) {
  464. mt, err := NewMerkleTree(memory.NewMemoryStorage(), 140)
  465. require.Nil(t, err)
  466. defer mt.db.Close()
  467. for i := 0; i < 10; i++ {
  468. k := big.NewInt(int64(i))
  469. v := big.NewInt(0)
  470. err = mt.Add(k, v)
  471. require.Nil(t, err)
  472. }
  473. d, err := mt.DumpLeafs(nil)
  474. assert.Nil(t, err)
  475. mt2, err := NewMerkleTree(memory.NewMemoryStorage(), 140)
  476. require.Nil(t, err)
  477. defer mt2.db.Close()
  478. err = mt2.ImportDumpedLeafs(d)
  479. assert.Nil(t, err)
  480. assert.Equal(t, mt.Root(), mt2.Root())
  481. }
  482. func TestAddAndGetCircomProof(t *testing.T) {
  483. mt, err := NewMerkleTree(memory.NewMemoryStorage(), 10)
  484. assert.Nil(t, err)
  485. assert.Equal(t, "0", mt.Root().String())
  486. // test vectors generated using https://github.com/iden3/circomlib smt.js
  487. cpp, err := mt.AddAndGetCircomProof(big.NewInt(1), big.NewInt(2))
  488. assert.Nil(t, err)
  489. assert.Equal(t, "0", cpp.OldRoot.String())
  490. assert.Equal(t, "64497120...", cpp.NewRoot.String())
  491. assert.Equal(t, "0", cpp.OldKey.String())
  492. assert.Equal(t, "0", cpp.OldValue.String())
  493. assert.Equal(t, "1", cpp.NewKey.String())
  494. assert.Equal(t, "2", cpp.NewValue.String())
  495. assert.Equal(t, true, cpp.IsOld0)
  496. assert.Equal(t, "[0 0 0 0 0 0 0 0 0 0 0]", fmt.Sprintf("%v", cpp.Siblings))
  497. cpp, err = mt.AddAndGetCircomProof(big.NewInt(33), big.NewInt(44))
  498. assert.Nil(t, err)
  499. assert.Equal(t, "64497120...", cpp.OldRoot.String())
  500. assert.Equal(t, "11404118...", cpp.NewRoot.String())
  501. assert.Equal(t, "1", cpp.OldKey.String())
  502. assert.Equal(t, "2", cpp.OldValue.String())
  503. assert.Equal(t, "33", cpp.NewKey.String())
  504. assert.Equal(t, "44", cpp.NewValue.String())
  505. assert.Equal(t, false, cpp.IsOld0)
  506. assert.Equal(t, "[0 0 0 0 0 0 0 0 0 0 0]", fmt.Sprintf("%v", cpp.Siblings))
  507. cpp, err = mt.AddAndGetCircomProof(big.NewInt(55), big.NewInt(66))
  508. assert.Nil(t, err)
  509. assert.Equal(t, "11404118...", cpp.OldRoot.String())
  510. assert.Equal(t, "18284203...", cpp.NewRoot.String())
  511. assert.Equal(t, "0", cpp.OldKey.String())
  512. assert.Equal(t, "0", cpp.OldValue.String())
  513. assert.Equal(t, "55", cpp.NewKey.String())
  514. assert.Equal(t, "66", cpp.NewValue.String())
  515. assert.Equal(t, true, cpp.IsOld0)
  516. assert.Equal(t, "[0 42948778... 0 0 0 0 0 0 0 0 0]", fmt.Sprintf("%v", cpp.Siblings))
  517. // fmt.Println(cpp)
  518. }
  519. func TestUpdateCircomProcessorProof(t *testing.T) {
  520. mt := newTestingMerkle(t, 10)
  521. defer mt.db.Close()
  522. for i := 0; i < 16; i++ {
  523. k := big.NewInt(int64(i))
  524. v := big.NewInt(int64(i * 2))
  525. if err := mt.Add(k, v); err != nil {
  526. t.Fatal(err)
  527. }
  528. }
  529. _, v, _, err := mt.Get(big.NewInt(10))
  530. assert.Nil(t, err)
  531. assert.Equal(t, big.NewInt(20), v)
  532. // test vectors generated using https://github.com/iden3/circomlib smt.js
  533. cpp, err := mt.Update(big.NewInt(10), big.NewInt(1024))
  534. assert.Nil(t, err)
  535. assert.Equal(t, "14895645...", cpp.OldRoot.String())
  536. assert.Equal(t, "75223641...", cpp.NewRoot.String())
  537. assert.Equal(t, "10", cpp.OldKey.String())
  538. assert.Equal(t, "20", cpp.OldValue.String())
  539. assert.Equal(t, "10", cpp.NewKey.String())
  540. assert.Equal(t, "1024", cpp.NewValue.String())
  541. assert.Equal(t, false, cpp.IsOld0)
  542. assert.Equal(t, "[19625419... 46910949... 18399594... 20473908... 0 0 0 0 0 0 0]", fmt.Sprintf("%v", cpp.Siblings))
  543. }