@ -0,0 +1 @@ |
|||
node_modules |
@ -0,0 +1,5 @@ |
|||
# circomlib-testvectors |
|||
Test vectors to check compatible implementations of the [circomlib](https://github.com/iden3/circomlib), such as: |
|||
- merkletree ([go](https://github.com/iden3/go-merkletree)) |
|||
- poseidon ([go](https://github.com/iden3/go-iden3-crypto/tree/master/poseidon), [rust](https://github.com/arnaucube/poseidon-rs)) |
|||
- babyjubjub ([go](https://github.com/iden3/go-iden3-crypto/tree/master/babyjub), [rust](https://github.com/arnaucube/babyjubjub-rs)) |
@ -0,0 +1,18 @@ |
|||
{ |
|||
"name": "circomlib-testvectors", |
|||
"version": "0.0.1", |
|||
"description": "", |
|||
"main": "index.js", |
|||
"scripts": { |
|||
"test": "mocha" |
|||
}, |
|||
"author": "", |
|||
"license": "GPLv3.0", |
|||
"dependencies": { |
|||
"circomlib": "^0.2.3", |
|||
"ffjavascript": "^0.1.3" |
|||
}, |
|||
"devDependencies": { |
|||
"mocha": "^7.1.1" |
|||
} |
|||
} |
@ -0,0 +1,147 @@ |
|||
const chai = require("chai"); |
|||
|
|||
const Fr = require("ffjavascript").bn128.Fr; |
|||
|
|||
const smt = require("circomlib").smt; |
|||
|
|||
const assert = chai.assert; |
|||
|
|||
describe("SMT javascript testvectors", function () { |
|||
this.timeout(100000); |
|||
before( async () => { |
|||
}); |
|||
|
|||
it("Should insert 2 elements and empty them", async () => { |
|||
const tree = await smt.newMemEmptyTrie(); |
|||
console.log(tree); |
|||
|
|||
let k = Fr.e(1); |
|||
let v = Fr.e(2); |
|||
await tree.insert(k,v); |
|||
console.log(tree.root); |
|||
|
|||
k = Fr.e(33); |
|||
v = Fr.e(44); |
|||
await tree.insert(k,v); |
|||
console.log(tree.root); |
|||
|
|||
k = Fr.e(1234); |
|||
v = Fr.e(9876); |
|||
await tree.insert(k,v); |
|||
console.log(tree.root); |
|||
|
|||
await tree.delete(Fr.e(33)); |
|||
console.log(tree.root); |
|||
|
|||
await tree.delete(Fr.e(1234)); |
|||
await tree.delete(Fr.e(1)); |
|||
console.log(tree.root); |
|||
|
|||
assert(Fr.isZero(tree.root)); |
|||
}); |
|||
it("TestDelete3", async () => { |
|||
const tree = await smt.newMemEmptyTrie(); |
|||
console.log(tree); |
|||
|
|||
let k = Fr.e(1); |
|||
let v = Fr.e(1); |
|||
await tree.insert(k,v); |
|||
|
|||
k = Fr.e(2); |
|||
v = Fr.e(2); |
|||
await tree.insert(k,v); |
|||
console.log(tree.root); |
|||
|
|||
console.log("TestDelete3", tree.root); |
|||
await tree.delete(Fr.e(1)); |
|||
console.log("TestDelete3", tree.root); |
|||
}); |
|||
it("TestDelete4", async () => { |
|||
const tree = await smt.newMemEmptyTrie(); |
|||
console.log(tree); |
|||
|
|||
let k = Fr.e(1); |
|||
let v = Fr.e(1); |
|||
await tree.insert(k,v); |
|||
|
|||
k = Fr.e(2); |
|||
v = Fr.e(2); |
|||
await tree.insert(k,v); |
|||
console.log(tree.root); |
|||
|
|||
k = Fr.e(3); |
|||
v = Fr.e(3); |
|||
await tree.insert(k,v); |
|||
console.log(tree.root); |
|||
|
|||
console.log("TestDelete4", tree.root); |
|||
await tree.delete(Fr.e(1)); |
|||
console.log("TestDelete4", tree.root); |
|||
}); |
|||
it("TestDelete5", async () => { |
|||
const tree = await smt.newMemEmptyTrie(); |
|||
console.log(tree); |
|||
|
|||
let k = Fr.e(1); |
|||
let v = Fr.e(2); |
|||
await tree.insert(k,v); |
|||
|
|||
k = Fr.e(33); |
|||
v = Fr.e(44); |
|||
await tree.insert(k,v); |
|||
console.log(tree.root); |
|||
|
|||
|
|||
console.log("TestDelete5", tree.root); |
|||
await tree.delete(Fr.e(1)); |
|||
console.log("TestDelete5", tree.root); |
|||
}); |
|||
|
|||
it("TestAddAndGetCircomProof", async () => { |
|||
const tree = await smt.newMemEmptyTrie(); |
|||
|
|||
let key = Fr.e(1); |
|||
let value = Fr.e(2); |
|||
|
|||
let res = await tree.insert(key,value); |
|||
res = fixRes(res); |
|||
console.log(res); |
|||
|
|||
key = Fr.e(33); |
|||
value = Fr.e(44); |
|||
res = await tree.insert(key,value); |
|||
res = fixRes(res); |
|||
console.log(res); |
|||
|
|||
key = Fr.e(55); |
|||
value = Fr.e(66); |
|||
res = await tree.insert(key,value); |
|||
res = fixRes(res); |
|||
console.log(res); |
|||
}); |
|||
|
|||
it("TestUpdateAndCircomProcessorProof", async () => { |
|||
const tree = await smt.newMemEmptyTrie(); |
|||
console.log(tree); |
|||
|
|||
for (let i=0; i<16; i++) { |
|||
let k = Fr.e(i); |
|||
let v = Fr.e(i*2); |
|||
await tree.insert(k,v); |
|||
} |
|||
console.log(tree.root); |
|||
k = Fr.e(10); |
|||
v = Fr.e(1024); |
|||
let res = await tree.update(k, v) |
|||
console.log(res); |
|||
|
|||
}); |
|||
}) |
|||
|
|||
function fixRes(res) { |
|||
while (res.siblings.length<10) res.siblings.push(Fr.e(0)); |
|||
res.oldKey = res.isOld0 ? 0 : res.oldKey; |
|||
res.oldValue = res.isOld0 ? 0 : res.oldValue; |
|||
res.isOld0 = res.isOld0 ? 1 : 0; |
|||
return res; |
|||
} |