/* Copyright 2018 0kims association. This file is part of snarkjs. snarkjs is a free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. snarkjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with snarkjs. If not, see . */ /* Implementation of this paper: https://eprint.iacr.org/2016/260.pdf */ const bigInt = require("./bigint.js"); const BN128 = require("./bn128.js"); const PolField = require("./polfield.js"); const ZqField = require("./zqfield.js"); const bn128 = new BN128(); const G1 = bn128.G1; const G2 = bn128.G2; const PolF = new PolField(new ZqField(bn128.r)); const F = new ZqField(bn128.r); module.exports = function setup(circuit) { const setup = { vk_proof : { protocol: "groth", nVars: circuit.nVars, nPublic: circuit.nPubInputs + circuit.nOutputs }, vk_verifier: { protocol: "groth", nPublic: circuit.nPubInputs + circuit.nOutputs }, toxic: {} }; setup.vk_proof.domainBits = PolF.log2(circuit.nConstraints + circuit.nPubInputs + circuit.nOutputs +1 -1) +1; setup.vk_proof.domainSize = 1 << setup.vk_proof.domainBits; calculatePolinomials(setup, circuit); setup.toxic.t = F.random(); calculateEncriptedValuesAtT(setup, circuit); return setup; }; function calculatePolinomials(setup, circuit) { setup.vk_proof.polsA = new Array(circuit.nVars); setup.vk_proof.polsB = new Array(circuit.nVars); setup.vk_proof.polsC = new Array(circuit.nVars); for (let i=0; i