A javascript library to generate and verify zkSNARK proofs.
Go to file
Jordi Baylina 3f2f303b94
Skeleton
2018-08-09 08:16:34 +02:00
src Skeleton 2018-08-09 08:16:34 +02:00
.eslintrc.js Skeleton 2018-08-09 08:16:34 +02:00
.gitignore Skeleton 2018-08-09 08:16:34 +02:00
index.js Skeleton 2018-08-09 08:16:34 +02:00
package-lock.json Skeleton 2018-08-09 08:16:34 +02:00
package.json Skeleton 2018-08-09 08:16:34 +02:00
README Skeleton 2018-08-09 08:16:34 +02:00

# 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.m; // number of constrains
    circuit.n; // number of signals
    circuit.p; // number of public signals (nPublicInputs + nOutputs)

    // The array of signals is always sorted in this order:
    // [ outputs, publicInputs, 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");
}
```