const assert = require("assert");
|
|
|
|
const StaticMerkle = require("../src/StaticMerkle.js");
|
|
const MemDB = require("../src/dbMem.js");
|
|
const hash = require("../src/hashKeccak.js");
|
|
const buffUtils = require("../src/buffUtils.js");
|
|
const claimUtils = require("../src/claimUtils.js");
|
|
|
|
describe("static merkle", () => {
|
|
before(async () => {
|
|
|
|
});
|
|
|
|
it("Create an empty tring of 0 levels", async () => {
|
|
const dbPrv0 = await MemDB();
|
|
const SM0 = await StaticMerkle(hash, dbPrv0, 0);
|
|
const empty = SM0.root;
|
|
assert.equal(buffUtils.toHex(empty), "0x0000000000000000000000000000000000000000000000000000000000000000");
|
|
});
|
|
|
|
it("create an empty", async () => {
|
|
const dbPrv = await MemDB();
|
|
const SM140 = await StaticMerkle(hash, dbPrv, 140);
|
|
const empty = SM140.root;
|
|
assert.equal(buffUtils.toHex(empty), "0x0000000000000000000000000000000000000000000000000000000000000000");
|
|
});
|
|
|
|
it("should add and remove a claim", async() => {
|
|
const dbPrv = await MemDB();
|
|
const SM140 = await StaticMerkle(hash, dbPrv, 140);
|
|
const empty = SM140.root;
|
|
const claim = claimUtils.buildClaim("0x01", "0x02", "0x03", "0x04");
|
|
await SM140.addClaim(claim);
|
|
assert.equal(buffUtils.toHex(SM140.root), "0xd3d9ad5e3c0b38c4e3eb411e9e3114b5ed8fb5c4bc69158329feb1a62743cda1");
|
|
await SM140.removeClaim(claim);
|
|
assert.equal(buffUtils.toHex(SM140.root), buffUtils.toHex(empty));
|
|
|
|
assert.equal(SM140.tx.inserts.length, 0);
|
|
|
|
});
|
|
|
|
it("should add two claims in different order and should be the same", async () => {
|
|
const dbPrv_1 = await MemDB();
|
|
const SM140_1 = await StaticMerkle(hash, dbPrv_1, 140);
|
|
const dbPrv_2 = await MemDB();
|
|
const SM140_2 = await StaticMerkle(hash, dbPrv_2, 140);
|
|
const empty = SM140_1.root;
|
|
const claim1 = claimUtils.buildClaim("0x01", "0x02", "0x03", "0x04");
|
|
const claim2 = claimUtils.buildClaim("0x01", "0x02", "0x03", "0x05");
|
|
|
|
await SM140_1.addClaim(claim1);
|
|
await SM140_1.addClaim(claim2);
|
|
|
|
await SM140_2.addClaim(claim2);
|
|
await SM140_2.addClaim(claim1);
|
|
|
|
assert.equal(buffUtils.toHex(SM140_1.root), buffUtils.toHex(SM140_2.root));
|
|
|
|
await SM140_1.removeClaim(claim1);
|
|
await SM140_1.removeClaim(claim2);
|
|
assert.equal(buffUtils.toHex(SM140_1.root), buffUtils.toHex(empty));
|
|
|
|
await SM140_2.removeClaim(claim2);
|
|
await SM140_2.removeClaim(claim1);
|
|
assert.equal(buffUtils.toHex(SM140_2.root), buffUtils.toHex(empty));
|
|
|
|
});
|
|
|
|
it("should add 10 claims and remove them in different order", async () => {
|
|
const dbPrv = await MemDB();
|
|
const SM140 = await StaticMerkle(hash, dbPrv, 140);
|
|
const empty = SM140.root;
|
|
const claims = [];
|
|
let i;
|
|
for (i=0; i<10; i++) {
|
|
const b = Buffer.from([ i / 256, i % 256 ]);
|
|
claims[i] = claimUtils.buildClaim("0x01", "0x02", "0x03", b);
|
|
}
|
|
|
|
for (i=0;i<claims.length; i++) {
|
|
await SM140.addClaim(claims[i]);
|
|
}
|
|
|
|
assert.equal(buffUtils.toHex(SM140.root), "0xb57c288d5c018c56610a3fb783062c9b199221734c8c5617795b57cbdbd4347f");
|
|
|
|
for (i=0;i<claims.length; i++) {
|
|
await SM140.removeClaim(claims[i]);
|
|
}
|
|
|
|
assert.equal(buffUtils.toHex(SM140.root), buffUtils.toHex(empty));
|
|
assert.equal(SM140.tx.inserts.length, 0);
|
|
});
|
|
|
|
it("Should give the same root when added a repeated claim", async () => {
|
|
const dbPrv = await MemDB();
|
|
const SM140 = await StaticMerkle(hash, dbPrv, 140);
|
|
const empty = SM140.root;
|
|
const claims = [];
|
|
let i;
|
|
for (i=0; i<100; i++) {
|
|
const b = Buffer.from([ i % 10 ]);
|
|
claims[i] = claimUtils.buildClaim("0x01", "0x02", "0x03", b);
|
|
}
|
|
|
|
for (i=0;i<claims.length; i++) {
|
|
await SM140.addClaim(claims[i]);
|
|
}
|
|
|
|
assert.equal(buffUtils.toHex(SM140.root), "0xb57c288d5c018c56610a3fb783062c9b199221734c8c5617795b57cbdbd4347f");
|
|
|
|
for (i=0;i<claims.length; i++) {
|
|
await SM140.removeClaim(claims[i]);
|
|
}
|
|
|
|
assert.equal(buffUtils.toHex(SM140.root), buffUtils.toHex(empty));
|
|
assert.equal(SM140.tx.inserts.length, 0);
|
|
}).timeout(20000);
|
|
|
|
it("Should create a merkle proof and verify it ok", async () => {
|
|
const dbPrv = await MemDB();
|
|
const SM140 = await StaticMerkle(hash, dbPrv, 140);
|
|
const empty = SM140.root;
|
|
const claim1 = claimUtils.buildClaim("0x01", "0x02", "0x03", "0x04");
|
|
const claim2 = claimUtils.buildClaim("0x01", "0x02", "0x03", "0x05");
|
|
|
|
await SM140.addClaim(claim1);
|
|
await SM140.addClaim(claim2);
|
|
|
|
const mp = await SM140.getMerkeProof(claim1);
|
|
|
|
assert.equal(SM140.checkClaim(SM140.root, claim1, mp), true);
|
|
assert.equal(SM140.checkClaim(empty, claim1, mp), false);
|
|
assert.equal(SM140.checkClaim(empty, claim2, mp), false);
|
|
|
|
const mp1 = await SM140.getMerkeProof(claim1);
|
|
assert.equal(SM140.checkClaim(SM140.root, claim1, mp1), true);
|
|
const mp2 = await SM140.getMerkeProof(claim2);
|
|
assert.equal(SM140.checkClaim(SM140.root, claim2, mp2), true);
|
|
});
|
|
|
|
});
|