mirror of
https://github.com/arnaucube/arbo.git
synced 2026-01-11 08:11:27 +01:00
Add circom test w/ circuit for CircomVerifierProof
Add circom test with circuit for CircomVerifierProofs, which allows to automatically check that the data generated from arbo matches the circom circuit of a SMTVerifierProof. Added also GHA workflow to test the circuits with the output of arbo code.
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
include "../../node_modules/circomlib/circuits/comparators.circom";
|
||||
include "../../node_modules/circomlib/circuits/poseidon.circom";
|
||||
include "../../node_modules/circomlib/circuits/smt/smtprocessor.circom";
|
||||
|
||||
template SMTProcessorTest(nLevels) {
|
||||
signal input newKey;
|
||||
signal input newValue;
|
||||
signal private input oldKey;
|
||||
signal private input oldValue;
|
||||
signal private input isOld0;
|
||||
signal private input siblings[nLevels];
|
||||
signal input oldRoot;
|
||||
signal input newRoot;
|
||||
|
||||
component smtProcessor = SMTProcessor(nLevels);
|
||||
smtProcessor.oldRoot <== oldRoot;
|
||||
smtProcessor.newRoot <== newRoot;
|
||||
for (var i=0; i<nLevels; i++) {
|
||||
smtProcessor.siblings[i] <== siblings[i];
|
||||
}
|
||||
smtProcessor.oldKey <== oldKey;
|
||||
smtProcessor.oldValue <== oldValue;
|
||||
smtProcessor.isOld0 <== isOld0;
|
||||
smtProcessor.newKey <== newKey;
|
||||
smtProcessor.newValue <== newValue;
|
||||
smtProcessor.fnc[0] <== 1;
|
||||
smtProcessor.fnc[1] <== 0;
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
include "../../node_modules/circomlib/circuits/comparators.circom";
|
||||
include "../../node_modules/circomlib/circuits/poseidon.circom";
|
||||
include "../../node_modules/circomlib/circuits/smt/smtverifier.circom";
|
||||
|
||||
template SMTVerifierTest(nLevels) {
|
||||
signal input key;
|
||||
signal input value;
|
||||
signal input fnc;
|
||||
signal private input oldKey;
|
||||
signal private input oldValue;
|
||||
signal private input isOld0;
|
||||
signal private input siblings[nLevels];
|
||||
signal input root;
|
||||
|
||||
component smtV = SMTVerifier(nLevels);
|
||||
smtV.enabled <== 1;
|
||||
smtV.fnc <== fnc;
|
||||
smtV.root <== root;
|
||||
for (var i=0; i<nLevels; i++) {
|
||||
smtV.siblings[i] <== siblings[i];
|
||||
}
|
||||
smtV.oldKey <== oldKey;
|
||||
smtV.oldValue <== oldValue;
|
||||
smtV.isOld0 <== isOld0;
|
||||
smtV.key <== key;
|
||||
smtV.value <== value;
|
||||
}
|
||||
94
testvectors/circom/test/smt.test.ts
Normal file
94
testvectors/circom/test/smt.test.ts
Normal file
@@ -0,0 +1,94 @@
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const tester = require("circom").tester;
|
||||
const assert = require('assert');
|
||||
const circomlib = require("circomlib");
|
||||
const smt = require("circomlib").smt;
|
||||
|
||||
describe("merkletreetree circom-proof-verifier", function () {
|
||||
this.timeout(0);
|
||||
const nLevels = 4;
|
||||
|
||||
let circuit;
|
||||
let circuitPath = path.join(__dirname, "circuits", "mt-proof-verifier-main.test.circom");
|
||||
before( async() => {
|
||||
const circuitCode = `
|
||||
include "smt-proof-verifier_test.circom";
|
||||
component main = SMTVerifierTest(4);
|
||||
`;
|
||||
fs.writeFileSync(circuitPath, circuitCode, "utf8");
|
||||
|
||||
circuit = await tester(circuitPath, {reduceConstraints:false});
|
||||
await circuit.loadConstraints();
|
||||
console.log("Constraints: " + circuit.constraints.length + "\n");
|
||||
});
|
||||
|
||||
after( async() => {
|
||||
fs.unlinkSync(circuitPath);
|
||||
});
|
||||
|
||||
let inputsVerifier, inputsVerifierNonExistence;
|
||||
|
||||
before("generate smt-verifier js inputs", async () => {
|
||||
let tree = await smt.newMemEmptyTrie();
|
||||
await tree.insert(1, 11);
|
||||
await tree.insert(2, 22);
|
||||
await tree.insert(3, 33);
|
||||
await tree.insert(4, 44);
|
||||
const res = await tree.find(2);
|
||||
assert(res.found);
|
||||
let root = tree.root;
|
||||
|
||||
let siblings = res.siblings;
|
||||
while (siblings.length < nLevels) {
|
||||
siblings.push("0");
|
||||
};
|
||||
|
||||
inputsVerifier = {
|
||||
"fnc": 0,
|
||||
"key": 2,
|
||||
"value": 22,
|
||||
"siblings": siblings,
|
||||
"root": root,
|
||||
};
|
||||
|
||||
const res2 = await tree.find(5);
|
||||
assert(!res2.found);
|
||||
let siblings2 = res2.siblings;
|
||||
while (siblings2.length < nLevels) {
|
||||
siblings2.push("0");
|
||||
};
|
||||
inputsVerifierNonExistence = {
|
||||
"fnc": 1,
|
||||
"oldKey": 1,
|
||||
"oldValue": 11,
|
||||
"key": 5,
|
||||
"value": 11,
|
||||
"siblings": siblings2,
|
||||
"root": root,
|
||||
};
|
||||
});
|
||||
|
||||
it("Test smt-verifier proof of existence go inputs", async () => {
|
||||
// fromGo is a json CircomVerifierProof generated from Go code using
|
||||
// https://github.com/vocdoni/arbo
|
||||
let rawdata = fs.readFileSync('go-data-generator/go-smt-verifier-inputs.json');
|
||||
let fromGo = JSON.parse(rawdata);
|
||||
inputsVerifier=fromGo;
|
||||
// console.log("smtverifier js inputs:\n", inputsVerifier);
|
||||
|
||||
const witness = await circuit.calculateWitness(inputsVerifier);
|
||||
await circuit.checkConstraints(witness);
|
||||
});
|
||||
it("Test smt-verifier proof of non-existence go inputs", async () => {
|
||||
// fromGo is a json CircomVerifierProof generated from Go code using
|
||||
// https://github.com/vocdoni/arbo
|
||||
let rawdata = fs.readFileSync('go-data-generator/go-smt-verifier-non-existence-inputs.json');
|
||||
let fromGo = JSON.parse(rawdata);
|
||||
inputsVerifierNonExistence=fromGo;
|
||||
// console.log("smtverifier js inputs:\n", inputsVerifierNonExistence);
|
||||
|
||||
const witness = await circuit.calculateWitness(inputsVerifierNonExistence);
|
||||
await circuit.checkConstraints(witness);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user