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.

175 lines
6.1 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. package merkletree
  2. /*
  3. This is just an example of basic tests for the (old) iden3-merkletree-specification.
  4. The methods and variables names can be different.
  5. */
  6. import (
  7. "strconv"
  8. "testing"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. type testBytesLeaf struct {
  12. data []byte
  13. indexLength uint32
  14. }
  15. func (c testBytesLeaf) Bytes() (b []byte) {
  16. return c.data
  17. }
  18. func (c testBytesLeaf) IndexLength() uint32 {
  19. return c.indexLength
  20. }
  21. func (c testBytesLeaf) Hi() Hash {
  22. h := HashBytes(c.Bytes()[:c.IndexLength()])
  23. return h
  24. }
  25. func newTestBytesLeaf(data string, indexLength uint32) testBytesLeaf {
  26. return testBytesLeaf{
  27. data: []byte(data),
  28. indexLength: indexLength,
  29. }
  30. }
  31. // Test to check the iden3-merkletree-specification
  32. func TestIden3MerkletreeSpecification(t *testing.T) {
  33. h := HashBytes([]byte("test")).Hex()
  34. assert.Equal(t, "0x9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658", h)
  35. h = HashBytes([]byte("authorizeksign")).Hex()
  36. assert.Equal(t, "0x353f867ef725411de05e3d4b0a01c37cf7ad24bcc213141a05ed7726d7932a1f", h)
  37. mt := newTestingMerkle(t, 140)
  38. defer mt.storage.Close()
  39. // empty tree
  40. assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000000", mt.Root().Hex())
  41. leafN := testBytesLeaf{
  42. data: []byte{1, 2, 3, 4, 5},
  43. indexLength: 3,
  44. }
  45. assert.Nil(t, mt.Add(leafN))
  46. assert.Equal(t, "0xa0e72cc948119fcb71b413cf5ada12b2b825d5133299b20a6d9325ffc3e2fbf1", mt.Root().Hex())
  47. mt = newTestingMerkle(t, 140)
  48. defer mt.storage.Close()
  49. // add leaf
  50. leaf := testBytesLeaf{
  51. data: []byte("this is a test leaf"),
  52. indexLength: 15,
  53. }
  54. assert.Nil(t, mt.Add(leaf))
  55. assert.Equal(t, "0xb4fdf8a653198f0e179ccb3af7e4fc09d76247f479d6cfc95cd92d6fda589f27", mt.Root().Hex())
  56. // proof with only one leaf in the MerkleTree
  57. proof, err := mt.GenerateProof(leaf.Hi())
  58. assert.Nil(t, err)
  59. assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000000", BytesToHex(proof))
  60. // add a second leaf
  61. leaf2 := testBytesLeaf{
  62. data: []byte("this is a second test leaf"),
  63. indexLength: 15,
  64. }
  65. err = mt.Add(leaf2)
  66. assert.Nil(t, err)
  67. assert.Equal(t, "0x8ac95e9c8a6fbd40bb21de7895ee35f9c8f30ca029dbb0972c02344f49462e82", mt.Root().Hex())
  68. // proof of the second leaf, with two leafs in the MerkleTree
  69. proof2, err := mt.GenerateProof(leaf2.Hi())
  70. assert.Nil(t, err)
  71. assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000001fd8e1a60cdb23c0c7b2cf8462c99fafd905054dccb0ed75e7c8a7d6806749b6b", BytesToHex(proof2))
  72. // proof of emptyLeaf
  73. leaf3 := testBytesLeaf{
  74. data: []byte("this is a third test leaf"),
  75. indexLength: 15,
  76. }
  77. proof3, err := mt.GenerateProof(leaf3.Hi())
  78. assert.Nil(t, err)
  79. assert.Equal(t, "0x000000000000000000000000000000000000000000000000000000000000000389741fa23da77c259781ad8f4331a5a7d793eef1db7e5200ddfc8e5f5ca7ce2bfd8e1a60cdb23c0c7b2cf8462c99fafd905054dccb0ed75e7c8a7d6806749b6b", BytesToHex(proof3))
  80. // getLeafByHi/GetValueInPos
  81. bytesInHi, err := mt.GetValueInPos(leaf2.Hi())
  82. assert.Nil(t, err)
  83. assert.Equal(t, leaf2.Bytes(), bytesInHi)
  84. // check proof
  85. rootBytes, err := HexToBytes("0x7d7c5e8f4b3bf434f3d9d223359c4415e2764dd38de2e025fbf986e976a7ed3d")
  86. assert.Nil(t, err)
  87. mp, err := HexToBytes("0x0000000000000000000000000000000000000000000000000000000000000002d45aada6eec346222eaa6b5d3a9260e08c9b62fcf63c72bc05df284de07e6a52")
  88. assert.Nil(t, err)
  89. hiBytes, err := HexToBytes("0x786677808ba77bdd9090a969f1ef2cbd1ac5aecd9e654f340500159219106878")
  90. assert.Nil(t, err)
  91. htBytes, err := HexToBytes("0x786677808ba77bdd9090a969f1ef2cbd1ac5aecd9e654f340500159219106878")
  92. assert.Nil(t, err)
  93. var root, hi, ht Hash
  94. copy(root[:], rootBytes)
  95. copy(hi[:], hiBytes)
  96. copy(ht[:], htBytes)
  97. verified := CheckProof(root, mp, hi, ht, 140)
  98. assert.True(t, verified)
  99. // check proof of empty
  100. rootBytes, err = HexToBytes("0x8f021d00c39dcd768974ddfe0d21f5d13f7215bea28db1f1cb29842b111332e7")
  101. assert.Nil(t, err)
  102. mp, err = HexToBytes("0x0000000000000000000000000000000000000000000000000000000000000004bf8e980d2ed328ae97f65c30c25520aeb53ff837579e392ea1464934c7c1feb9")
  103. assert.Nil(t, err)
  104. hiBytes, err = HexToBytes("0xa69792a4cff51f40b7a1f7ae596c6ded4aba241646a47538898f17f2a8dff647")
  105. assert.Nil(t, err)
  106. htBytes, err = HexToBytes("0x0000000000000000000000000000000000000000000000000000000000000000")
  107. assert.Nil(t, err)
  108. copy(root[:], rootBytes)
  109. copy(hi[:], hiBytes)
  110. copy(ht[:], htBytes)
  111. verified = CheckProof(root, mp, hi, ht, 140)
  112. assert.True(t, verified)
  113. // check the proof generated in the previous steps
  114. verified = CheckProof(mt.Root(), proof2, leaf2.Hi(), HashBytes(leaf2.Bytes()), 140)
  115. assert.True(t, verified)
  116. // check proof of no existence (emptyLeaf), as we are prooving an empty leaf, the Ht is an empty value (0x000...0)
  117. verified = CheckProof(mt.Root(), proof3, leaf3.Hi(), EmptyNodeValue, 140)
  118. assert.True(t, verified)
  119. // add leafs in different orders
  120. mt1 := newTestingMerkle(t, 140)
  121. defer mt1.storage.Close()
  122. mt1.Add(newTestBytesLeaf("0 this is a test leaf", 15))
  123. mt1.Add(newTestBytesLeaf("1 this is a test leaf", 15))
  124. mt1.Add(newTestBytesLeaf("2 this is a test leaf", 15))
  125. mt1.Add(newTestBytesLeaf("3 this is a test leaf", 15))
  126. mt1.Add(newTestBytesLeaf("4 this is a test leaf", 15))
  127. mt1.Add(newTestBytesLeaf("5 this is a test leaf", 15))
  128. // mt1.PrintFullMT()
  129. mt2 := newTestingMerkle(t, 140)
  130. defer mt2.storage.Close()
  131. mt2.Add(newTestBytesLeaf("2 this is a test leaf", 15))
  132. mt2.Add(newTestBytesLeaf("1 this is a test leaf", 15))
  133. mt2.Add(newTestBytesLeaf("0 this is a test leaf", 15))
  134. mt2.Add(newTestBytesLeaf("5 this is a test leaf", 15))
  135. mt2.Add(newTestBytesLeaf("3 this is a test leaf", 15))
  136. mt2.Add(newTestBytesLeaf("4 this is a test leaf", 15))
  137. assert.Equal(t, mt1.Root().Hex(), mt2.Root().Hex())
  138. assert.Equal(t, mt1.Root().Hex(), "0x264397f84da141b3134dcde1d7540d27a2bf0d787bbe8365d9ad5c9c18d3c621")
  139. // adding 1000 leafs
  140. mt1000 := newTestingMerkle(t, 140)
  141. defer mt.storage.Close()
  142. numToAdd := 1000
  143. for i := 0; i < numToAdd; i++ {
  144. leaf := newTestBytesLeaf(strconv.Itoa(i)+" this is a test leaf", 15)
  145. mt1000.Add(leaf)
  146. }
  147. assert.Equal(t, "0x6e2da580b2920cd78ed8d4e4bf41e209dfc99ef28bc19560042f0ac803e0d6f7", mt1000.Root().Hex())
  148. }