snarkjs/README
READMERaw
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```