merkleTree.test.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /* global artifacts, web3, contract */
  2. require('chai').use(require('bn-chai')(web3.utils.BN)).use(require('chai-as-promised')).should()
  3. const { takeSnapshot, revertSnapshot } = require('../scripts/ganacheHelper')
  4. const { toFixedHex, randomBN } = require('../src/utils')
  5. const MerkleTree = artifacts.require('MerkleTreeWithHistoryMock')
  6. const Hasher = artifacts.require('Hasher2')
  7. const levels = 16
  8. contract('MerkleTree', () => {
  9. let tree1
  10. let tree2
  11. let snapshotId
  12. let hasher
  13. before(async () => {
  14. hasher = await Hasher.new()
  15. tree1 = await MerkleTree.new(levels, hasher.address)
  16. tree2 = await MerkleTree.new(levels, hasher.address)
  17. snapshotId = await takeSnapshot()
  18. })
  19. describe('#tree', () => {
  20. it('should bulk insert', async () => {
  21. const elements = ['123', '456', '789'].map((e) => toFixedHex(e))
  22. await tree1.bulkInsert(elements)
  23. for (const e of elements) {
  24. await tree2.insert(e)
  25. }
  26. const root1 = await tree1.getLastRoot()
  27. const root2 = await tree2.getLastRoot()
  28. root1.should.be.equal(root2)
  29. })
  30. it('almost full tree', async () => {
  31. let tree = await MerkleTree.new(3, hasher.address)
  32. let elements = ['1', '2', '3', '4', '5', '6', '7'].map((e) => toFixedHex(e))
  33. await tree.bulkInsert(elements)
  34. tree = await MerkleTree.new(3, hasher.address)
  35. elements = ['1', '2', '3', '4', '5', '6', '7', '8'].map((e) => toFixedHex(e))
  36. await tree.bulkInsert(elements)
  37. tree = await MerkleTree.new(3, hasher.address)
  38. elements = ['1', '2', '3', '4', '5', '6', '7', '8', '9'].map((e) => toFixedHex(e))
  39. // prettier-ignore
  40. await tree
  41. .bulkInsert(elements)
  42. .should.be.rejectedWith('Merkle doesn\'t have enough capacity to add specified leaves')
  43. })
  44. // it('estimate gas hasher', async () => {
  45. // const gas = await tree1.test() // hasher.contract.methods.poseidon([1, 2]).estimateGas()
  46. // console.log('gas', gas.toString())
  47. // })
  48. it('should bulk insert with initial state', async () => {
  49. const initElements = [123, 456, 789].map((e) => toFixedHex(e))
  50. const elements = [12, 34, 56, 78, 90].map((e) => toFixedHex(e))
  51. for (const e of initElements) {
  52. await tree1.insert(e)
  53. await tree2.insert(e)
  54. }
  55. await tree1.bulkInsert(elements)
  56. for (const e of elements) {
  57. await tree2.insert(e)
  58. }
  59. const root1 = await tree1.getLastRoot()
  60. const root2 = await tree2.getLastRoot()
  61. root1.should.be.equal(root2)
  62. })
  63. it.skip('should pass the stress test', async () => {
  64. const rounds = 40
  65. const elementCount = 10
  66. for (let i = 0; i < rounds; i++) {
  67. const length = 1 + Math.floor(Math.random() * elementCount)
  68. const elements = Array.from({ length }, () => randomBN()).map((e) => toFixedHex(e))
  69. await tree1.bulkInsert(elements)
  70. for (const e of elements) {
  71. await tree2.insert(e)
  72. }
  73. const root1 = await tree1.getLastRoot()
  74. const root2 = await tree2.getLastRoot()
  75. root1.should.be.equal(root2)
  76. }
  77. })
  78. })
  79. afterEach(async () => {
  80. await revertSnapshot(snapshotId.result)
  81. // eslint-disable-next-line require-atomic-updates
  82. snapshotId = await takeSnapshot()
  83. })
  84. })