@ -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; |
||||
|
} |