arnaucube
arnaucube/snarkjsPublic Self-hosted repository
snarkjs/README.md
README.mdRaw
  1# javascript implementation of zkSnark
  2
  3This is a javascript implementation of zkSnarks.
  4
  5This library allows to do the trusted setup,  generate proofs and verify the proofs.
  6
  7This library uses the compiled circuits generated by the jaz compiler.
  8
  9## Install
 10
 11```
 12npm install zkSnark
 13```
 14
 15## Usage
 16
 17### import
 18
 19```
 20const zkSnark = require("zksnark");
 21```
 22
 23### Load a circuit.
 24
 25```
 26// "myCircuit.cir" is the output of the jaz compiler
 27
 28const circuitDef = JSON.parse(fs.readFileSync("myCircuit.cir", "utf8"));
 29const circuit = new zkSnark.Circuit(circuitDef);
 30```
 31
 32### Inspect the circuit.
 33
 34```
 35    // `signalId` can always be a number or an alias string
 36
 37    circuit.m; // number of constrains
 38    circuit.n; // number of signals
 39    circuit.p; // number of public signals (nPublicInputs + nOutputs)
 40
 41    // The array of signals is always sorted in this order:
 42    // [ outputs, publicInputs, privedInputs, internalSignals, constants]
 43
 44    // returns a,b and c coeficients of the `signalId` on a given `constrain`
 45    circuit.a(constrain, signalId)
 46    circuit.b(constrain, signalId)
 47    circuit.c(constrain, signalId)
 48
 49    circuit.nOutputs           // number of public outputs
 50    circuit.nPublicInputs      // number of public inputs
 51    circuit.nPrivateInputs     // number of private inputs
 52    circuit.nInputs            // number of inputs ( nPublicInputs + nPrivateInputs)
 53
 54    circuit.outputIdx(i)       // returns the index of the i'th output
 55    circuit.inputIdx(i)        // returns the index of the i'th input
 56    circuit.inputPublicIdx(i)  // returns the index of the i'th public input
 57    circuit.inputPrivateIdx(i) // returns the index of the i'th private input
 58
 59    // returns signal Idx given a signalId
 60    // if the idx >= n , it is a constant
 61    // if the idx == -1, the signal does not exist
 62    circuit.signalId2idx(signalId);
 63
 64    // returns an array aliases names for a given signalId
 65    circuit.signalNames(signalId)
 66
 67    // input is a key value object where keys are the signal names
 68    //   of all the inputs (public and private)
 69    // returns an array of values that represent the witness
 70    circuit.generateWitness(input)
 71```
 72
 73### Trusted setup
 74
 75```
 76const setup = zkSnark.setup(circuit);
 77fs.writeFileSink("myCircuit.vk_proof", JSON.stringify(setup.vk_proof), "utf8");
 78fs.writeFileSink("myCircuit.vk_verifier", JSON.stringify(setup.vk_verifier), "utf8");
 79setup.toxic  // Must be discarded.
 80```
 81
 82### Generate proof
 83
 84```
 85const circuitDef = JSON.parse(fs.readFileSync("myCircuit.cir", "utf8"));
 86const circuit = new zkSnark.Circuit(circuitDef);
 87const input = {
 88    "main.pubIn1": "123",
 89    "main.out1": "456"
 90}
 91const witness = circuit.generateWitness(input);
 92const vk_proof = JSON.parse(fs.readFileSync("myCircuit.vk_proof", "utf8"));
 93
 94const {proof, publicSignals} = zkSnark.genProof(vk_proof, witness);
 95```
 96
 97### Verifier
 98
 99```
100const vk_verifier = JSON.parse(fs.readFileSync("myCircuit.vk_verifier", "utf8"));
101
102if (zkSnark.isValid(vk_verifier, proof, publicSignals)) {
103    console.log("The proof is valid");
104} else {
105    console.log("The proof is not valid");
106}
107```