multimerkleproof.spec.js
1 const { MerkleTree } = require('../utils/merkleTree.js'); 2 const MerkleMultiProofWrapper = require('Embark/contracts/MerkleMultiProofWrapper'); 3 4 const merkleTreeSize = 4096; 5 const leafsSize = 10; 6 const fuzzyProofChecks = 10; 7 8 const elementsA = Array.from({length: merkleTreeSize}, (v,k) => ""+k); 9 const merkleTreeA = new MerkleTree(elementsA); 10 const leafsA = merkleTreeA.getElements(Array.from({length: leafsSize}, (v,k) => ""+k)); 11 const proofA = merkleTreeA.getMultiProof(leafsA); 12 const flagsA = merkleTreeA.getProofFlags(leafsA, proofA); 13 14 const elementsB = Array.from({length: merkleTreeSize}, (v,k) => ""+k*2); 15 const merkleTreeB = new MerkleTree(elementsB); 16 const leafsB = merkleTreeB.getElements(Array.from({length: leafsSize}, (v,k) => ""+k*2)) 17 const proofB = merkleTreeB.getMultiProof(leafsB); 18 const flagsB = merkleTreeB.getProofFlags(leafsB, proofB); 19 20 config({ 21 contracts: { 22 deploy: { 23 "MerkleMultiProofWrapper": { 24 25 } 26 } 27 } 28 }, (_err, web3_accounts) => { 29 accounts = web3_accounts; 30 }); 31 32 contract('MultiMerkleProof', function () { 33 34 describe('calculateMultiMerkleRoot', function () { 35 it('display cost of deploy MerkleMultiProofWrapper', async function () { 36 await MerkleMultiProofWrapper.methods.foo().send(); 37 }); 38 39 it('calculate merkle root from leafs, proofs and flags', async function () { 40 const result = await MerkleMultiProofWrapper.methods.calculateMultiMerkleRoot( 41 leafsA, 42 proofA, 43 flagsA 44 ).call() 45 const result2 = await MerkleMultiProofWrapper.methods.calculateMultiMerkleRoot( 46 leafsB, 47 proofB, 48 flagsB 49 ).call() 50 assert(result == merkleTreeA.getHexRoot()); 51 assert(result2 == merkleTreeB.getHexRoot()); 52 }); 53 54 it('calculate wrong merkle root from wrong proofs and flags', async function () { 55 var invalid = false; 56 try { 57 invalid = merkleTreeA.getHexRoot() != await MerkleMultiProofWrapper.methods.calculateMultiMerkleRoot( 58 leafsA, 59 proofB, 60 flagsB 61 ).call() 62 } catch(e) { 63 invalid = true; 64 } 65 assert(invalid); 66 67 try { 68 invalid = merkleTreeA.getHexRoot() != await MerkleMultiProofWrapper.methods.calculateMultiMerkleRoot( 69 leafsA, 70 proofB, 71 flagsA 72 ).call() 73 } catch(e) { 74 invalid = true; 75 } 76 assert(invalid); 77 78 try { 79 invalid = merkleTreeB.getHexRoot() != await MerkleMultiProofWrapper.methods.calculateMultiMerkleRoot( 80 leafsB, 81 proofA, 82 flagsB 83 ).call(); 84 } catch(e) { 85 invalid = true; 86 } 87 88 assert(invalid); 89 try { 90 invalid = merkleTreeB.getHexRoot() != await MerkleMultiProofWrapper.methods.calculateMultiMerkleRoot( 91 leafsB, 92 proofA, 93 flagsA 94 ).call() 95 } catch(e) { 96 invalid = true; 97 } 98 assert(invalid); 99 }); 100 101 it(`cost of calculate Tree A root for ${leafsA.length} leafs using ${proofA.length} proofs and ${flagsA.length} flags`, async function () { 102 await MerkleMultiProofWrapper.methods.calculateMultiMerkleRoot( 103 leafsA, 104 proofA, 105 flagsA, 106 ).send() 107 }); 108 109 it(`cost of calculate Tree B root for ${leafsB.length} leafs using ${proofB.length} proofs and ${flagsB.length} flags`, async function () { 110 await MerkleMultiProofWrapper.methods.calculateMultiMerkleRoot( 111 leafsB, 112 proofB, 113 flagsB, 114 ).send() 115 }); 116 117 it(`calculate ${fuzzyProofChecks} merkle root from leafs, proofs and flags (fuzzy)`, async function () { 118 this.timeout(500*fuzzyProofChecks); 119 for(let j = 0; j < fuzzyProofChecks; j++){ 120 const leafsFuzzy = merkleTreeA.getElements( 121 Array.from({length: leafsSize}, () => elementsA[Math.floor(Math.random()*elementsA.length)] ).filter((value, index, self) => self.indexOf(value) === index) 122 ); 123 const proofFuzzy = merkleTreeA.getMultiProof(leafsFuzzy); 124 const flagsFuzzy = merkleTreeA.getProofFlags(leafsFuzzy, proofFuzzy); 125 const result = await MerkleMultiProofWrapper.methods.calculateMultiMerkleRoot( 126 leafsFuzzy, 127 proofFuzzy, 128 flagsFuzzy 129 ).call(); 130 assert(result == merkleTreeA.getHexRoot()); 131 } 132 }); 133 134 it(`calculate ${fuzzyProofChecks} wrong merkle root from wrong proofs and flags (fuzzy)`, async function () { 135 this.timeout(500*fuzzyProofChecks); 136 for(let j = 0; j < fuzzyProofChecks; j++){ 137 const leafsFuzzy = merkleTreeB.getElements( 138 Array.from({length: leafsSize}, () => elementsB[Math.floor(Math.random()*elementsB.length)] ).filter((value, index, self) => self.indexOf(value) === index) 139 ); 140 const proofFuzzy = merkleTreeB.getMultiProof(leafsFuzzy); 141 const flagsFuzzy = merkleTreeB.getProofFlags(leafsFuzzy, proofFuzzy); 142 var invalid = false; 143 try { 144 invalid = merkleTreeA.getHexRoot() != await MerkleMultiProofWrapper.methods.calculateMultiMerkleRoot( 145 leafsFuzzy, 146 proofFuzzy, 147 flagsFuzzy 148 ).call(); 149 } catch(e) { 150 invalid = true; 151 } 152 assert(invalid); 153 } 154 }); 155 }); 156 });