You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
Jordi Baylina f7ac040b3b
Use BigInt if available
5 years ago
src Use BigInt if available 5 years ago
test Use BigInt if available 5 years ago
.eslintrc.js Skeleton 5 years ago
.gitignore Skeleton 5 years ago
README.md Force 1 in the verifier 5 years ago
index.js Skeleton 5 years ago
package-lock.json refactor curve and add tests 5 years ago
package.json refactor curve and add tests 5 years ago

README.md

javascript implementation of zkSnark

This is a javascript implementation of zkSnarks.

This library allows to do the trusted setup, generate proofs and verify the proofs.

This library uses the compiled circuits generated by the jaz compiler.

Install

npm install zkSnark

Usage

import

const zkSnark = require("zksnark");

Load a circuit.

// "myCircuit.cir" is the output of the jaz compiler

const circuitDef = JSON.parse(fs.readFileSync("myCircuit.cir", "utf8"));
const circuit = new zkSnark.Circuit(circuitDef);

Inspect the circuit.

    // `signalId` can always be a number or an alias string

    circuit.nConstrains; // number of constrains
    circuit.nSignals; // number of signals
    circuit.nPublic; // number of public signals (nOutputs + nPublicInputs)

    // The array of signals is always sorted in this order:
    // [ outputs, publicInputs, 1, privedInputs, internalSignals, constants]

    // returns a,b and c coeficients of the `signalId` on a given `constrain`
    circuit.a(constrain, signalId)
    circuit.b(constrain, signalId)
    circuit.c(constrain, signalId)

    circuit.nOutputs           // number of public outputs
    circuit.nPublicInputs      // number of public inputs
    circuit.nPrivateInputs     // number of private inputs
    circuit.nInputs            // number of inputs ( nPublicInputs + nPrivateInputs)

    circuit.outputIdx(i)       // returns the index of the i'th output
    circuit.inputIdx(i)        // returns the index of the i'th input
    circuit.inputPublicIdx(i)  // returns the index of the i'th public input
    circuit.inputPrivateIdx(i) // returns the index of the i'th private input

    // returns signal Idx given a signalId
    // if the idx >= n , it is a constant
    // if the idx == -1, the signal does not exist
    circuit.signalId2idx(signalId);

    // returns an array aliases names for a given signalId
    circuit.signalNames(signalId)

    // input is a key value object where keys are the signal names
    //   of all the inputs (public and private)
    // returns an array of values that represent the witness
    circuit.generateWitness(input)

Trusted setup

const setup = zkSnark.setup(circuit);
fs.writeFileSink("myCircuit.vk_proof", JSON.stringify(setup.vk_proof), "utf8");
fs.writeFileSink("myCircuit.vk_verifier", JSON.stringify(setup.vk_verifier), "utf8");
setup.toxic  // Must be discarded.

Generate proof

const circuitDef = JSON.parse(fs.readFileSync("myCircuit.cir", "utf8"));
const circuit = new zkSnark.Circuit(circuitDef);
const input = {
    "main.pubIn1": "123",
    "main.out1": "456"
}
const witness = circuit.generateWitness(input);
const vk_proof = JSON.parse(fs.readFileSync("myCircuit.vk_proof", "utf8"));

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

Verifier

const vk_verifier = JSON.parse(fs.readFileSync("myCircuit.vk_verifier", "utf8"));

if (zkSnark.isValid(vk_verifier, proof, publicSignals)) {
    console.log("The proof is valid");
} else {
    console.log("The proof is not valid");
}