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.

161 lines
5.6 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
  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. // add leaf
  42. leaf := testBytesLeaf{
  43. data: []byte("this is a test leaf"),
  44. indexLength: 15,
  45. }
  46. assert.Nil(t, mt.Add(leaf))
  47. assert.Equal(t, "0xb4fdf8a653198f0e179ccb3af7e4fc09d76247f479d6cfc95cd92d6fda589f27", mt.Root().Hex())
  48. // proof with only one leaf in the MerkleTree
  49. proof, err := mt.GenerateProof(leaf.Hi())
  50. assert.Nil(t, err)
  51. assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000000", BytesToHex(proof))
  52. // add a second leaf
  53. leaf2 := testBytesLeaf{
  54. data: []byte("this is a second test leaf"),
  55. indexLength: 15,
  56. }
  57. err = mt.Add(leaf2)
  58. assert.Nil(t, err)
  59. assert.Equal(t, "0x8ac95e9c8a6fbd40bb21de7895ee35f9c8f30ca029dbb0972c02344f49462e82", mt.Root().Hex())
  60. // proof of the second leaf, with two leafs in the MerkleTree
  61. proof2, err := mt.GenerateProof(leaf2.Hi())
  62. assert.Nil(t, err)
  63. assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000001fd8e1a60cdb23c0c7b2cf8462c99fafd905054dccb0ed75e7c8a7d6806749b6b", BytesToHex(proof2))
  64. // proof of emptyLeaf
  65. leaf3 := testBytesLeaf{
  66. data: []byte("this is a third test leaf"),
  67. indexLength: 15,
  68. }
  69. proof3, err := mt.GenerateProof(leaf3.Hi())
  70. assert.Nil(t, err)
  71. assert.Equal(t, "0x000000000000000000000000000000000000000000000000000000000000000389741fa23da77c259781ad8f4331a5a7d793eef1db7e5200ddfc8e5f5ca7ce2bfd8e1a60cdb23c0c7b2cf8462c99fafd905054dccb0ed75e7c8a7d6806749b6b", BytesToHex(proof3))
  72. // getLeafByHi/GetValueInPos
  73. bytesInHi, err := mt.GetValueInPos(leaf2.Hi())
  74. assert.Nil(t, err)
  75. assert.Equal(t, leaf2.Bytes(), bytesInHi)
  76. // check proof
  77. rootBytes, err := HexToBytes("0x7d7c5e8f4b3bf434f3d9d223359c4415e2764dd38de2e025fbf986e976a7ed3d")
  78. assert.Nil(t, err)
  79. mp, err := HexToBytes("0x0000000000000000000000000000000000000000000000000000000000000002d45aada6eec346222eaa6b5d3a9260e08c9b62fcf63c72bc05df284de07e6a52")
  80. assert.Nil(t, err)
  81. hiBytes, err := HexToBytes("0x786677808ba77bdd9090a969f1ef2cbd1ac5aecd9e654f340500159219106878")
  82. assert.Nil(t, err)
  83. htBytes, err := HexToBytes("0x786677808ba77bdd9090a969f1ef2cbd1ac5aecd9e654f340500159219106878")
  84. assert.Nil(t, err)
  85. var root, hi, ht Hash
  86. copy(root[:], rootBytes)
  87. copy(hi[:], hiBytes)
  88. copy(ht[:], htBytes)
  89. verified := CheckProof(root, mp, hi, ht, 140)
  90. assert.True(t, verified)
  91. // check proof of empty
  92. rootBytes, err = HexToBytes("0x8f021d00c39dcd768974ddfe0d21f5d13f7215bea28db1f1cb29842b111332e7")
  93. assert.Nil(t, err)
  94. mp, err = HexToBytes("0x0000000000000000000000000000000000000000000000000000000000000004bf8e980d2ed328ae97f65c30c25520aeb53ff837579e392ea1464934c7c1feb9")
  95. assert.Nil(t, err)
  96. hiBytes, err = HexToBytes("0xa69792a4cff51f40b7a1f7ae596c6ded4aba241646a47538898f17f2a8dff647")
  97. assert.Nil(t, err)
  98. htBytes, err = HexToBytes("0x0000000000000000000000000000000000000000000000000000000000000000")
  99. assert.Nil(t, err)
  100. copy(root[:], rootBytes)
  101. copy(hi[:], hiBytes)
  102. copy(ht[:], htBytes)
  103. verified = CheckProof(root, mp, hi, ht, 140)
  104. assert.True(t, verified)
  105. // check the proof generated in the previous steps
  106. verified = CheckProof(mt.Root(), proof2, leaf2.Hi(), HashBytes(leaf2.Bytes()), 140)
  107. assert.True(t, verified)
  108. // check proof of no existence (emptyLeaf), as we are prooving an empty leaf, the Ht is an empty value (0x000...0)
  109. verified = CheckProof(mt.Root(), proof3, leaf3.Hi(), EmptyNodeValue, 140)
  110. assert.True(t, verified)
  111. // add leafs in different orders
  112. mt1 := newTestingMerkle(t, 140)
  113. defer mt.storage.Close()
  114. mt1.Add(newTestBytesLeaf("0 this is a test leaf", 15))
  115. mt1.Add(newTestBytesLeaf("1 this is a test leaf", 15))
  116. mt1.Add(newTestBytesLeaf("2 this is a test leaf", 15))
  117. mt1.Add(newTestBytesLeaf("3 this is a test leaf", 15))
  118. mt1.Add(newTestBytesLeaf("4 this is a test leaf", 15))
  119. mt2 := newTestingMerkle(t, 140)
  120. defer mt.storage.Close()
  121. mt2.Add(newTestBytesLeaf("2 this is a test leaf", 15))
  122. mt2.Add(newTestBytesLeaf("1 this is a test leaf", 15))
  123. mt2.Add(newTestBytesLeaf("0 this is a test leaf", 15))
  124. mt2.Add(newTestBytesLeaf("3 this is a test leaf", 15))
  125. mt2.Add(newTestBytesLeaf("4 this is a test leaf", 15))
  126. assert.Equal(t, mt1.Root().Hex(), mt2.Root().Hex())
  127. // adding 1000 leafs
  128. mt1000 := newTestingMerkle(t, 140)
  129. defer mt.storage.Close()
  130. numToAdd := 1000
  131. for i := 0; i < numToAdd; i++ {
  132. leaf := newTestBytesLeaf(strconv.Itoa(i)+" this is a test leaf", 15)
  133. mt1000.Add(leaf)
  134. }
  135. assert.Equal(t, "0x6e2da580b2920cd78ed8d4e4bf41e209dfc99ef28bc19560042f0ac803e0d6f7", mt1000.Root().Hex())
  136. }