snarkjs/test/zksnark.js
test/zksnark.jsRaw
1const chai = require("chai");
2const fs = require("fs");
3const bigInt = require("../src/bigint.js");
4
5const Circuit = require("../src/circuit.js");
6const zkSnark = require("../index.js");
7
8const assert = chai.assert;
9
10
11function stringifyBigInts(o) {
12 if ((typeof(o) == "bigint") || (o instanceof bigInt)) {
13 return o.toString(10);
14 } else if (Array.isArray(o)) {
15 return o.map(stringifyBigInts);
16 } else if (typeof o == "object") {
17 const res = {};
18 for (let k in o) {
19 res[k] = stringifyBigInts(o[k]);
20 }
21 return res;
22 } else {
23 return o;
24 }
25}
26
27function unstringifyBigInts(o) {
28 if ((typeof(o) == "string") && (/^[0-9]+$/.test(o) )) {
29 return bigInt(o);
30 } else if (Array.isArray(o)) {
31 return o.map(unstringifyBigInts);
32 } else if (typeof o == "object") {
33 const res = {};
34 for (let k in o) {
35 res[k] = unstringifyBigInts(o[k]);
36 }
37 return res;
38 } else {
39 return o;
40 }
41}
42
43describe("zkSnark", () => {
44 it("Load a circuit, create trusted setup, create a proof and validate", () => {
45
46 const cirDef = JSON.parse(fs.readFileSync("../jaz/sum.json", "utf8"));
47 const cir = new Circuit(cirDef);
48
49 const setup = zkSnark.setup(cir);
50 const strSetup = stringifyBigInts(setup);
51 fs.writeFileSync("vk_proof.json", JSON.stringify(strSetup.vk_proof), "utf-8");
52 fs.writeFileSync("vk_verifier.json", JSON.stringify(strSetup.vk_verifier), "utf-8");
53
54/*
55 const setup = {};
56 setup.vk_proof = unstringifyBigInts(JSON.parse(fs.readFileSync("vk_proof.json", "utf8")));
57 setup.vk_verifier = unstringifyBigInts(JSON.parse(fs.readFileSync("vk_verifier.json", "utf8")));
58*/
59 const witness = cir.calculateWitness({"a": "33", "b": "34"});
60
61 assert.equal(witness[cir.getSignalIdx("main.out")].toString(), "67");
62
63 const {proof, publicSignals} = zkSnark.genProof(setup.vk_proof, witness);
64
65 assert( zkSnark.isValid(setup.vk_verifier, proof, publicSignals));
66 }).timeout(10000000);
67});