iden3 / snarkjs

zkSNARK implementation in JavaScript & WASM
GNU General Public License v3.0
1.71k stars 413 forks source link

Getting TypeError: a.affine is not a function when using snarksjs #9

Closed pranavkirtani88 closed 5 years ago

pranavkirtani88 commented 5 years ago

I am experimenting with Snarks.js, I tried using it https://github.com/iden3/circom I use the code as so

const zkSnark = require("snarkjs"); const fs=require("fs") const circuitDef = JSON.parse(fs.readFileSync("mycircuit.json", "utf8")); const circuit = new zkSnark.Circuit(circuitDef); const setup = zkSnark.original.setup(circuit); fs.writeFileSync("myCircuit.vk_proof", JSON.stringify(setup.vk_proof), "utf8"); fs.writeFileSync("myCircuit.vk_verifier", JSON.stringify(setup.vk_verifier), "utf8"); setup.toxic // Must be discarded.

const input = { "in": 30, } const witness = circuit.calculateWitness(input);

const vk_proof = JSON.parse(fs.readFileSync("myCircuit.vk_proof", "utf8")); console.log(vk_proof) const {proof, publicSignals} = zkSnark.original.genProof(vk_proof, witness) console.log(proof, publicSignals)

eddieoz commented 5 years ago

Try to add below to your snarkjs require

const zkSnark = require("snarkjs");
const {stringifyBigInts, unstringifyBigInts} = require("./node_modules/snarkjs/src/stringifybigint.js");

and use stringifyBigInts(v) in every local you have JSON.stringify(v). Examples:

fs.writeFileSync("myCircuit.vk_proof", JSON.stringify(stringifyBigInts(setup.vk_proof)), "utf8");
fs.writeFileSync("myCircuit.vk_verifier", JSON.stringify(stringifyBigInts(setup.vk_verifier)), "utf8");

Use unstringifyBigInts(v) on genProof and isValid:

const {proof, publicSignals} = zkSnark.original.genProof(unstringifyBigInts(vk_proof), unstringifyBigInts(witness));

if (zkSnark.original.isValid(unstringifyBigInts(vk_verifier), unstringifyBigInts(proof), unstringifyBigInts(publicSignals)))
pranavkirtani88 commented 5 years ago

Yes, This worked thanks