tutorial and many fixes

This commit is contained in:
Jordi Baylina 2020-07-13 07:21:03 +02:00
parent e739634579
commit 4fcc0a3398
No known key found for this signature in database
GPG Key ID: 7480C80C1BE43112
17 changed files with 6077 additions and 15580 deletions

399
README.md

@ -1,133 +1,360 @@
# snarkjs: JavaScript implementation of zkSNARKs. # snarkjs: JavaScript implementation of zkSNARKs.
This is a JavaScript implementation of zkSNARK schemes. It allows the original 8points protocol This is a JavaScript and Pure Web Assembly implementation of zkSNARK schemes. It uses the Groth16 Protocol (3 point only and 3 pairings)
and the Groth Protocol (3 point only and 3 pairings)
This library allows to do the trusted setup, generate proofs and verify the proofs. This library includes all the tools for the Trusted setup multiparty ceremony.
This includes the universal ceremony "powers of tau".
And the per circuit phase 2 ceremony.
This library uses the compiled circuits generated by the jaz compiler. The formats used in this library for the multipary computation are compatible with the ones used in other (implementations in rust)[].
### Tutorial. This library uses the compiled circuits generated by the circom compiler.
A good starting point [is this tutorial](https://github.com/iden3/circom/blob/master/TUTORIAL.md) The library works in nodejs and browser.
Also this [video](https://www.youtube.com/watch?v=-9TJa1hVsKA) is a good starting point. It's a ESM module, so it can be directly imported from bigger projects using rollup or webpack.
## Install. The low level criptography is done directly in wasm. And it uses working threads to parallelize the computations. The result is a high performance library with benchmarks comparable with implementations running in the host.
## Usage / Tutorial.
### Install snarkjs and circom
```sh ```sh
npm install snarkjs npm install -g circom
npm install -g snarkjs
``` ```
## Usage from command line. ### Help
```sh ```sh
snarkjs --help snarkjs --help
``` ```
Will show all the info in how to use the cli. In commands that takes long time, you can add the -v or --verbose option to see the progress.
## Usage from javascript The help for specific command:
Example
### Import. ```sh
snarkjs groth16 prove --help
```js
const zkSnark = require("snarkjs");
``` ```
### Load a circuit. Most of the commands have a shor alias.
```js For example, the previos command can also be invoked as:
// "myCircuit.cir" is the output of the jaz compiler
const circuitDef = JSON.parse(fs.readFileSync("myCircuit.cir", "utf8")); ```sh
const circuit = new zkSnark.Circuit(circuitDef); snarkjs g16p --help
``` ```
### Inspect the circuit.
```js ### Start a new ceremony.
// `signalId` can always be a number or an alias string
circuit.nConstraints; // number of constraints ```sh
circuit.nSignals; // number of signals snarkjs powersoftau new bn128 12 pot12_0000.ptau
circuit.nPublic; // number of public signals (nOutputs + nPublicInputs)
// The array of signals is always sorted in this order:
// [ 1, outputs, publicInputs, privateInputs, internalSignals, constants]
// returns a,b and c coeficients of the `signalId` on a given `constraint`
circuit.a(constraint, signalId)
circuit.b(constraint, signalId)
circuit.c(constraint, signalId)
circuit.nOutputs // number of public outputs
circuit.pubInputs // number of public inputs
circuit.nPrvInputs // number of private inputs
circuit.nInputs // number of inputs ( nPublicInputs + nPrivateInputs)
circuit.nVars // number of variables ( not including constants (one is a variable) )
circuit.nSignals // number of signals ( including constants )
circuit.outputIdx(i) // returns the index of the i'th output
circuit.inputIdx(i) // returns the index of the i'th input
circuit.pubInputIdx(i) // returns the index of the i'th public input
circuit.prvInputIdx(i) // returns the index of the i'th private input
circuit.varIdx(i) // returns the index of the i'th variable
circuit.constantIdx(i) // returns the index of the i'th constant
circuit.signalIdx(i) // returns the index of the i'th signal
// returns signal Idx given a signalId
// if the idx >= n , it is a constant
// if the idx == -1, the signal does not exist
circuit.getSignalIdx(name);
// returns an array aliases names of the i'th signal
circuit.signalNames(i)
// input is a key value object where keys are the signal names
// of all the inputs (public and private)
// returns an array of values representing the witness
circuit.calculateWitness(input)
``` ```
### Trusted setup. You can also use bls12-381 as the curve.
```js The secons parameter is the power of two of the maximum number of contraints that can accept this ceremony.
const setup = zkSnark.setup(circuit);
fs.writeFileSync("myCircuit.vk_proof", JSON.stringify(setup.vk_proof), "utf8"); In this case 12 means that the maximum constraints will be 2**12 = 4096
fs.writeFileSync("myCircuit.vk_verifier", JSON.stringify(setup.vk_verifier), "utf8");
setup.toxic // Must be discarded. ### Contribute in the ceremony
```sh
snarkjs powersoftau contribute pot12_0000.ptau pot12_0001.ptau --name="Example Name" -v
``` ```
### Generate proof. The name is a random name and it's include for reference. It's printed in the verification.
```js ### Do a second contribution
const circuitDef = JSON.parse(fs.readFileSync("myCircuit.cir", "utf8")); ```sh
const circuit = new zkSnark.Circuit(circuitDef); snarkjs powersoftau contribute pot12_0001.ptau pot12_0002.ptau --name="Second contribution Name" -v -e="some random text"
const input = { ```
"main.pubIn1": "123",
"main.out1": "456" the -e parameter allows the comman to be non interactive and use this text as an extra source of entropy for the random generation.
### Verify the file
```sh
snarkjs powersoftau verify pot12_0002.ptau
```
This command checks all the contributions of the Multiparty Computation (MPC) and list the hashes of the
intermediary results.
### Contribute using ther party software.
```sh
snarkjs powersoftau export challange pot12_0002.ptau challange_0003
snarkjs powersoftau challange contribute bn128 challange_0003 response_0003
snarkjs powersoftau import response pot12_0002.ptau response_0003 pot12_0003.ptau -n="Third contribution name"
```
### Add a beacon
```sh
snarkjs powersoftau beacon pot12_0003.ptau pot12_beacon.ptau 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f 10 -n="Final Beacon"
```
### Prepare phase2
```sh
powersoftau prepare phase2 pot12_beacon.ptau pot12_final.ptau -v
```
### Verify the last file
```sh
snarkjs powersoftau verify pot12_final.ptau
```
### Create a circuit
```sh
mkdir mycircuit
cd my mycircuit
cat <<EOT > circuit.circom
template Multiplier(n) {
signal private input a;
signal private input b;
signal output c;
signal int[n];
int[0] <== a*a + b;
for (var i=1; i<n; i++) {
int[i] <== int[i-1]*int[i-1] + b;
} }
const witness = circuit.calculateWitness(input);
const vk_proof = JSON.parse(fs.readFileSync("myCircuit.vk_proof", "utf8"));
const {proof, publicSignals} = zkSnark.genProof(vk_proof, witness); c <== int[n-1];
}
component main = Multiplier(1000);
EOT
``` ```
### Verifier. This is an example circom fille that allows to test the system with different number of contraints.
In this case 1000, but it can be changed to any nomber of constraints.
### compile the circuit
```sh
circom circuit.circom -r -w -s -v
```
-r to generate the .r1cs file
-w to generate the .wasm file that computes the witness from an input.
-s to generate the .sym file that contains the human readable names of all signals. (Important to debug the circuit)
-v Verbose. To see the progress of the compilation.
### info of a circuit
```sh
snarkjs r1cs info circuit.r1cs
```
### Print the constraints
```sh
snarkjs r1cs print circuit.r1cs
```
### export r1cs to json
```sh
snarkjs r1cs export json circuit.r1cs circuit.r1cs.json
```
### Generate the reference zKey without contributions from the circuit.
```sh
snarkjs zkey new circuit.r1cs pot12_final.ptau circuit_0000.zkey
```
circuit_0000.zkey does not include any contribution yet, so it cannot be used in a final circuit.
### Contribute in the phase2 ceremony
```sh
snarkjs zkey contribute circuit_0000.zkey circuit_0001.zkey --name="1st Contributor Name" -v
```
### Do a second phase2 contribution
```sh
snarkjs zkey contribute circuit_0001.zkey circuit_0002.zkey --name="Second contribution Name" -v -e="Another random entropy"
```
### Verify the zkey file
```sh
snarkjs zkey verify circuit.r1cs pot12_final.ptau circuit_0002.zkey
```
### Contribute using third party software.
```sh
snarkjs zkey export bellman circuit_0002.zkey challange_phase2_0003
snarkjs zkey bellman contribute bn128 challange_phase2_0003 response_phase2_0003
snarkjs zkey import bellman circuit_0002.zkey response_phase2_0003 circuit_0003.zkey -n="Third contribution name"
```
### Add a beacon
```sh
snarkjs zkey beacon circuit_0003.zkey circuit_final.zkey 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f 10 -n="Final Beacon phase2"
```
### Verify the final file
```sh
snarkjs zkey verify circuit.r1cs pot12_final.ptau circuit_final.zkey
```
### Export the verification key
```sh
snarkjs zkey export verificationkey circuit_final.zkey verification_key.json
```
### Calculat witess
```sh
cat <<EOT > input.json
{"a": 3, "b": 11}
EOT
snarkjs wtns calculate circuit.wasm input.json witness.wtns
```
### Debug witness calculation
In general, when you are developing a new circuit you will want to check for some errors in the witness calculation process.
You can do it by doing
```sh
snarkjs wtns debug circuit.wasm input.json witness.wtns circuit.sym --trigger --get --set
```
This will log every time a new component is started/ended ( --trigger ) when a signal is set (--set) and when it's get (--get)
### Proof calculation
```sh
snarkjs groth16 prove circuit_final.zkey witness.wtns proof.json public.json
```
It is possible also to do the calculate witness and the prove calculation in the same command:
```sh
snarkjs groth16 fullprove input.json circuit.wasm circuit_final.zkey proof.json public.json
```
### Verify
```sh
snarkjs groth16 verify verification_key.json public.json proof.json
```
### Export Solidity Verifier
```sh
snarkjs zkey export solidityverifier circuit_final.zkey verifier.sol
```
You can deploy th "Verifier" smartcontract using remix for example.
In order to simulate a verification call, you can do:
```sh
zkey export soliditycalldata public.json proof.json
```
And cut and paste the resolt directlly in the "verifyProof" field in the deployed smart contract.
This call will return true if the proof and the public data is valid.
## Use in node
```sh
npm install snarkjs
```
```js ```js
const vk_verifier = JSON.parse(fs.readFileSync("myCircuit.vk_verifier", "utf8")); const snarkjs = require("snarkjs");
const fs = require("fs");
if (zkSnark.isValid(vk_verifier, proof, publicSignals)) { async function run() {
console.log("The proof is valid"); const { proof, publicSignals } = await snarkjs.groth16.fullProve({a: 10, b: 21}, "circuit.wasm", "circuit_final.zkey");
console.log("Proof: ");
console.log(JSON.stringify(proof, null, 1));
const vKey = JSON.parse(fs.readFileSync("verification_key.json"));
const res = await snarkjs.groth16.verify(vKey, publicSignals, proof);
if (res === true) {
console.log("Verification OK");
} else { } else {
console.log("The proof is not valid"); console.log("Invalid proof");
} }
}
run().then(() => {
process.exit(0);
});
``` ```
## Use in the web
load snarkjs.min.js and start using it normally.
```html
<!doctype html>
<html>
<head>
<title>Snarkjs client example</title>
</head>
<body>
<h1>Snarkjs client example</h1>
<button id="bGenProof"> Create proof </button>
<!-- JS-generated output will be added here. -->
<pre class="proof"> Proof: <code id="proof"></code></pre>
<pre class="proof"> Result: <code id="result"></code></pre>
<script src="snarkjs.min.js"> </script>
<!-- This is the bundle generated by rollup.js -->
<script>
const proofCompnent = document.getElementById('proof');
const resultComponent = document.getElementById('result');
const bGenProof = document.getElementById("bGenProof");
bGenProof.addEventListener("click", calculateProof);
async function calculateProof() {
const { proof, publicSignals } =
await snarkjs.groth16.fullProve( { a: 3, b: 11}, "circuit.wasm", "circuit_final.zkey");
proofCompnent.innerHTML = JSON.stringify(proof, null, 1);
const vkey = await fetch("verification_key.json").then( function(res) {
return res.json();
});
const res = await snarkjs.groth16.verify(vkey, publicSignals, proof);
resultComponent.innerHTML = res;
}
</script>
</body>
</html>
```
## License ## License
snarkjs is part of the iden3 project copyright 2018 0KIMS association and published with GPL-3 license. Please check the COPYING file for more details. snarkjs is part of the iden3 project copyright 2018 0KIMS association and published with GPL-3 license. Please check the COPYING file for more details.

@ -1,212 +0,0 @@
### Install snarkjs and circom
```sh
npm install -g circom
npm install -g snarkjs
```
### Help
```sh
snarkjs
```
In commands that takes long time, you can add the -v or --verbose option to see the progress.
### Start a new ceremony.
```sh
snarkjs powersoftau new bn128 12 pot12_0000.ptau
```
### Contribute in the ceremony
```sh
snarkjs powersoftau contribute pot12_0000.ptau pot12_0001.ptau --name="Example Name" -v
```
### Do a second contribution
```sh
snarkjs powersoftau contribute pot12_0001.ptau pot12_0002.ptau --name="Second contribution Name" -v
```
### Verify the file
```sh
snarkjs powersoftau verify pot12_0002.ptau
```
### Contribute using ther party software.
```sh
snarkjs powersoftau export challange pot12_0002.ptau challange_0003
snarkjs powersoftau challange contribute bn128 challange_0003 response_0003
snarkjs powersoftau import response pot12_0002.ptau response_0003 pot12_0003.ptau -n="Third contribution name"
```
### Add a beacon
```sh
snarkjs powersoftau beacon pot12_0003.ptau pot12_beacon.ptau 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f 10 -n="Final Beacon"
```
### Prepare phase2
```sh
powersoftau prepare phase2 pot12_beacon.ptau pot12_final.ptau -v
```
### Verify the last file
```sh
snarkjs powersoftau verify pot12_final.ptau
```
### Create a circuit
```sh
mkdir mycircuit
cd my mycircuit
cat <<EOT > circuit.circom
template Multiplier(n) {
signal private input a;
signal private input b;
signal output c;
signal int[n];
int[0] <== a*a + b;
for (var i=1; i<n; i++) {
int[i] <== int[i-1]*int[i-1] + b;
}
c <== int[n-1];
}
component main = Multiplier(1000);
EOT
```
### compile the circuit
```sh
circom circuit.circom -r -w -s -v
```
### info of a circuit
```sh
snarkjs r1cs info circuit.r1cs
```
### Print the constraints
```sh
snarkjs r1cs print circuit.r1cs
```
### export r1cs to json
```sh
snarkjs r1cs export json circuit.r1cs circuit.r1cs.json
```
### Generate the reference zKey without contributions from the circuit.
```sh
snarkjs zkey new circuit.r1cs pot12_final.ptau circuit_0000.zkey
```
### Contribute in the phase2 ceremony
```sh
snarkjs zkey contribute circuit_0000.zkey circuit_0001.zkey --name="1st Contributor Name" -v
```
### Do a second phase2 contribution
```sh
snarkjs zkey contribute circuit_0001.zkey circuit_0002.zkey --name="Second contribution Name" -v
```
### Verify the zkey file
```sh
snarkjs zkey verify circuit.r1cs pot12_final.ptau circuit_0002.zkey
```
### Contribute using ther party software.
```sh
snarkjs zkey export bellman circuit_0002.zkey challange_phase2_0003
snarkjs zkey bellman contribute bn128 challange_phase2_0003 response_phase2_0003
snarkjs zkey import bellman circuit_0002.zkey response_phase2_0003 circuit_0003.zkey -n="Third contribution name"
```
### Add a beacon
```sh
snarkjs zkey beacon circuit_0003.zkey circuit_final.zkey 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f 10 -n="Final Beacon phase2"
```
### Verify the final file
```sh
snarkjs zkey verify circuit.r1cs pot12_final.ptau circuit_final.zkey
```
### Export the verification key
```sh
snarkjs zkey export verificationkey circuit_final.zkey verification_key.json
```
### Calculat witess
```sh
cat <<EOT > input.json
{"a": 3, "b": 11}
EOT
snarkjs wtns calculate circuit.wasm input.json witness.wtns
```
### Debug witness calculation
En general when you are developing a new circuit you will want to check for some errors in the witness calculation process.
You can do it by doing
```sh
snarkjs wtns debug circuit.wasm input.json witness.wtns circuit.sym --trigger --get --set
```
This will log every time a new component is started/ended ( --trigger ) when a signal is set (--set) and when it's get (--get)
### Proof calculation
```sh
snarkjs groth16 prove circuit_final.zkey witness.wtns proof.json public.json
```
It is possible also to do the calculate witness and the prove calculation in the same command:
```sh
snarkjs groth16 fullprove input.json circuit.wasm circuit_final.zkey proof.json public.json
```
### Verify
```sh
snarkjs groth16 verify verification_key.json public.json proof.json
```
### Export Solidity Verifier
```sh
snarkjs zkey export solidityverifier circuit_final.zkey verifier.sol
```
You can deploy th "Verifier" smartcontract using remix for example.
In order to simulate a verification call, you can do:
```sh
zkey export soliditycalldata public.json proof.json
```
And cut and paste the resolt directlly in the "verifyProof" field in the deployed smart contract.
This call will return true if the proof and the public data is valid.

@ -455,6 +455,9 @@ class MemFile {
} }
/* global fetch */
async function createOverride(o, b) { async function createOverride(o, b) {
if (typeof o === "string") { if (typeof o === "string") {
o = { o = {
@ -472,13 +475,26 @@ async function createOverride(o, b) {
} }
} }
function readExisting$1(o, b) { async function readExisting$1(o, b) {
if (o instanceof Uint8Array) { if (o instanceof Uint8Array) {
o = { o = {
type: "mem", type: "mem",
data: o data: o
}; };
} }
if (process.browser) {
if (typeof o === "string") {
const buff = await fetch(o).then( function(res) {
return res.arrayBuffer();
}).then(function (ab) {
return new Uint8Array(ab);
});
o = {
type: "mem",
data: buff
};
}
} else {
if (typeof o === "string") { if (typeof o === "string") {
o = { o = {
type: "file", type: "file",
@ -486,10 +502,11 @@ function readExisting$1(o, b) {
cacheSize: b cacheSize: b
}; };
} }
}
if (o.type == "file") { if (o.type == "file") {
return open(o.fileName, "r", o.cacheSize); return await open(o.fileName, "r", o.cacheSize);
} else if (o.type == "mem") { } else if (o.type == "mem") {
return readExisting(o); return await readExisting(o);
} else { } else {
throw new Error("Invalid FastFile type: "+o.type); throw new Error("Invalid FastFile type: "+o.type);
} }
@ -734,10 +751,11 @@ var scripts = {
test: "mocha", test: "mocha",
build: "rollup -c config/rollup.cjs.config.js", build: "rollup -c config/rollup.cjs.config.js",
buildcli: "rollup -c config/rollup.cli.config.js", buildcli: "rollup -c config/rollup.cli.config.js",
buildiife: "BROWSER=true rollup -c config/rollup.iife.config.js" buildiife: "BROWSER=true rollup -c config/rollup.iife.config.js",
buildiifemin: "BROWSER=true rollup -c config/rollup.iife_min.config.js"
}; };
var bin = { var bin = {
snarkjs: "build/cli.js" snarkjs: "build/cli.cjs"
}; };
var directories = { var directories = {
templates: "templates" templates: "templates"
@ -760,11 +778,11 @@ var repository = {
var dependencies = { var dependencies = {
"blake2b-wasm": "https://github.com/jbaylina/blake2b-wasm.git", "blake2b-wasm": "https://github.com/jbaylina/blake2b-wasm.git",
circom_runtime: "0.0.8", circom_runtime: "0.0.8",
fastfile: "0.0.5", fastfile: "0.0.6",
ffjavascript: "0.2.2", ffjavascript: "0.2.2",
keccak: "^3.0.0", keccak: "^3.0.0",
logplease: "^1.2.15", logplease: "^1.2.15",
r1csfile: "0.0.9", r1csfile: "0.0.10",
yargs: "^12.0.5" yargs: "^12.0.5"
}; };
var devDependencies = { var devDependencies = {
@ -777,7 +795,8 @@ var devDependencies = {
"rollup-plugin-ignore": "^1.0.6", "rollup-plugin-ignore": "^1.0.6",
"rollup-plugin-json": "^4.0.0", "rollup-plugin-json": "^4.0.0",
"rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-node-resolve": "^5.2.0",
"rollup-plugin-replace": "^2.2.0" "rollup-plugin-replace": "^2.2.0",
"rollup-plugin-terser": "^6.1.0"
}; };
var pkg = { var pkg = {
name: name, name: name,
@ -5203,7 +5222,7 @@ async function read(fileName) {
const {stringifyBigInts: stringifyBigInts$1} = ffjavascript.utils; const {stringifyBigInts: stringifyBigInts$1} = ffjavascript.utils;
async function groth16ProofFromInput(zkeyFileName, witnessFileName, logger) { async function groth16Prove(zkeyFileName, witnessFileName, logger) {
const {fd: fdWtns, sections: sectionsWtns} = await readBinFile$1(witnessFileName, "wtns", 2); const {fd: fdWtns, sections: sectionsWtns} = await readBinFile$1(witnessFileName, "wtns", 2);
const wtns = await readHeader$1(fdWtns, sectionsWtns); const wtns = await readHeader$1(fdWtns, sectionsWtns);
@ -5298,7 +5317,6 @@ async function groth16ProofFromInput(zkeyFileName, witnessFileName, logger) {
proof = stringifyBigInts$1(proof); proof = stringifyBigInts$1(proof);
publicSignals = stringifyBigInts$1(publicSignals); publicSignals = stringifyBigInts$1(publicSignals);
return {proof, publicSignals}; return {proof, publicSignals};
} }
@ -5457,12 +5475,12 @@ async function wtnsCalculate(input, wasmFileName, wtnsFileName, options) {
} }
async function groth16ProofFromInput$1(input, wasmFile, zkeyFileName, logger) { async function groth16FullProve(input, wasmFile, zkeyFileName, logger) {
const wtns= { const wtns= {
type: "mem" type: "mem"
}; };
await wtnsCalculate(input, wasmFile, wtns); await wtnsCalculate(input, wasmFile, wtns);
return await groth16ProofFromInput(zkeyFileName, wtns); return await groth16Prove(zkeyFileName, wtns);
} }
/* /*
@ -5485,7 +5503,7 @@ async function groth16ProofFromInput$1(input, wasmFile, zkeyFileName, logger) {
*/ */
const {unstringifyBigInts} = ffjavascript.utils; const {unstringifyBigInts} = ffjavascript.utils;
async function isValid(vk_verifier, publicSignals, proof, logger) { async function groth16Verify(vk_verifier, publicSignals, proof, logger) {
/* /*
let cpub = vk_verifier.IC[0]; let cpub = vk_verifier.IC[0];
for (let s= 0; s< vk_verifier.nPublic; s++) { for (let s= 0; s< vk_verifier.nPublic; s++) {
@ -5649,13 +5667,6 @@ const commands = [
options: "-verbose|v -nopoints -nocheck -name|n", options: "-verbose|v -nopoints -nocheck -name|n",
action: powersOfTawImport action: powersOfTawImport
}, },
{
cmd: "powersoftau verify <powersoftau.ptau>",
description: "verifies a powers of tau file",
alias: ["ptv"],
options: "-verbose|v",
action: powersOfTawVerify
},
{ {
cmd: "powersoftau beacon <old_powersoftau.ptau> <new_powersoftau.ptau> <beaconHash(Hex)> <numIterationsExp>", cmd: "powersoftau beacon <old_powersoftau.ptau> <new_powersoftau.ptau> <beaconHash(Hex)> <numIterationsExp>",
description: "adds a beacon", description: "adds a beacon",
@ -5671,6 +5682,13 @@ const commands = [
options: "-verbose|v", options: "-verbose|v",
action: powersOfTawPreparePhase2 action: powersOfTawPreparePhase2
}, },
{
cmd: "powersoftau verify <powersoftau.ptau>",
description: "verifies a powers of tau file",
alias: ["ptv"],
options: "-verbose|v",
action: powersOfTawVerify
},
{ {
cmd: "powersoftau export json <powersoftau_0000.ptau> <powersoftau_0000.json>", cmd: "powersoftau export json <powersoftau_0000.ptau> <powersoftau_0000.json>",
description: "Exports a power of tau file to a JSON", description: "Exports a power of tau file to a JSON",
@ -5718,34 +5736,67 @@ const commands = [
alias: ["wej"], alias: ["wej"],
action: wtnsExportJson$1 action: wtnsExportJson$1
}, },
/*
{ {
cmd: "zksnark setup [circuit.r1cs] [circuit.zkey] [verification_key.json]", cmd: "zkey new [circuit.r1cs] [powersoftau.ptau] [circuit.zkey]",
description: "Run a simple setup for a circuit generating the proving key.", description: "Creates an initial pkey file with zero contributions ",
alias: ["zs", "setup -r1cs|r -provingkey|pk -verificationkey|vk"], alias: ["zkn"],
options: "-verbose|v -protocol", options: "-verbose|v",
action: zksnarkSetup action: zkeyNew
},
*/
{
cmd: "groth16 prove [circuit.zkey] [witness.wtns] [proof.json] [public.json]",
description: "Generates a zk Proof from witness",
alias: ["g16p", "zpw", "zksnark proof", "proof -pk|provingkey -wt|witness -p|proof -pub|public"],
options: "-verbose|v -protocol",
action: zksnarkProve
}, },
{ {
cmd: "groth16 fullprove [input.json] [circuit.wasm] [circuit.zkey] [proof.json] [public.json]", cmd: "zkey contribute <circuit_old.zkey> <circuit_new.zkey>",
description: "Generates a zk Proof from input", description: "creates a zkey file with a new contribution",
alias: ["g16f", "g16i"], alias: ["zkc"],
options: "-verbose|v -protocol", options: "-verbose|v -entropy|e -name|n",
action: zksnarkFullProve action: zkeyContribute
}, },
{ {
cmd: "groth16 verify [verification_key.json] [public.json] [proof.json]", cmd: "zkey export bellman [circuit.zkey] [circuit.mpcparams]",
description: "Verify a zk Proof", description: "Export a zKey to a MPCParameters file compatible with kobi/phase2 (Bellman)",
alias: ["g16v", "verify -vk|verificationkey -pub|public -p|proof"], alias: ["zkeb"],
action: zksnarkVerify options: "-verbose|v",
action: zkeyExportBellman
},
{
cmd: "zkey bellman contribute <curve> <circuit.mpcparams> <circuit_response.mpcparams>",
description: "contributes to a llallange file in bellman format",
alias: ["zkbc"],
options: "-verbose|v -entropy|e",
action: zkeyBellmanContribute
},
{
cmd: "zkey import bellman <circuit_old.zkey> <circuit.mpcparams> <circuit_new.zkey>",
description: "Export a zKey to a MPCParameters file compatible with kobi/phase2 (Bellman) ",
alias: ["zkib"],
options: "-verbose|v -name|n",
action: zkeyImportBellman
},
{
cmd: "zkey beacon <circuit_old.zkey> <circuit_new.zkey> <beaconHash(Hex)> <numIterationsExp>",
description: "adds a beacon",
alias: ["zkb"],
options: "-verbose|v -name|n",
action: zkeyBeacon
},
{
cmd: "zkey verify [circuit.r1cs] [powersoftau.ptau] [circuit.zkey]",
description: "Verify zkey file contributions and verify that matches with the original circuit.r1cs and ptau",
alias: ["zkv"],
options: "-verbose|v",
action: zkeyVerify
},
{
cmd: "zkey export verificationkey [circuit.zkey] [verification_key.json]",
description: "Exports a verification key",
alias: ["zkev"],
action: zkeyExportVKey
},
{
cmd: "zkey export json [circuit.zkey] [circuit.zkey.json]",
description: "Exports a circuit key to a JSON file",
alias: ["zkej"],
options: "-verbose|v",
action: zkeyExportJson$1
}, },
{ {
cmd: "zkey export solidityverifier [circuit.zkey] [verifier.sol]", cmd: "zkey export solidityverifier [circuit.zkey] [verifier.sol]",
@ -5760,66 +5811,24 @@ const commands = [
action: zkeyExportSolidityCalldata action: zkeyExportSolidityCalldata
}, },
{ {
cmd: "zkey new [circuit.r1cs] [powersoftau.ptau] [circuit.zkey]", cmd: "groth16 prove [circuit.zkey] [witness.wtns] [proof.json] [public.json]",
description: "Creates an initial pkey file with zero contributions ", description: "Generates a zk Proof from witness",
alias: ["zkn"], alias: ["g16p", "zpw", "zksnark proof", "proof -pk|provingkey -wt|witness -p|proof -pub|public"],
options: "-verbose|v", options: "-verbose|v -protocol",
action: zkeyNew action: groth16Prove$1
}, },
{ {
cmd: "zkey export bellman [circuit.zkey] [circuit.mpcparams]", cmd: "groth16 fullprove [input.json] [circuit.wasm] [circuit.zkey] [proof.json] [public.json]",
description: "Export a zKey to a MPCParameters file compatible with kobi/phase2 (Bellman)", description: "Generates a zk Proof from input",
alias: ["zkeb"], alias: ["g16f", "g16i"],
options: "-verbose|v", options: "-verbose|v -protocol",
action: zkeyExportBellman action: groth16FullProve$1
}, },
{ {
cmd: "zkey import bellman <circuit_old.zkey> <circuit.mpcparams> <circuit_new.zkey>", cmd: "groth16 verify [verification_key.json] [public.json] [proof.json]",
description: "Export a zKey to a MPCParameters file compatible with kobi/phase2 (Bellman) ", description: "Verify a zk Proof",
alias: ["zkib"], alias: ["g16v", "verify -vk|verificationkey -pub|public -p|proof"],
options: "-verbose|v -name|n", action: groth16Verify$1
action: zkeyImportBellman
},
{
cmd: "zkey verify [circuit.r1cs] [powersoftau.ptau] [circuit.zkey]",
description: "Verify zkey file contributions and verify that matches with the original circuit.r1cs and ptau",
alias: ["zkv"],
options: "-verbose|v",
action: zkeyVerify
},
{
cmd: "zkey contribute <circuit_old.zkey> <circuit_new.zkey>",
description: "creates a zkey file with a new contribution",
alias: ["zkc"],
options: "-verbose|v -entropy|e -name|n",
action: zkeyContribute
},
{
cmd: "zkey beacon <circuit_old.zkey> <circuit_new.zkey> <beaconHash(Hex)> <numIterationsExp>",
description: "adds a beacon",
alias: ["zkb"],
options: "-verbose|v -name|n",
action: zkeyBeacon
},
{
cmd: "zkey bellman contribute <curve> <circuit.mpcparams> <circuit_response.mpcparams>",
description: "contributes to a llallange file in bellman format",
alias: ["zkbc"],
options: "-verbose|v -entropy|e",
action: zkeyBellmanContribute
},
{
cmd: "zkey export verificationkey [circuit.zkey] [verification_key.json]",
description: "Exports a verification key",
alias: ["zkev"],
action: zkeyExportVKey
},
{
cmd: "zkey export json [circuit.zkey] [circuit.zkey.json]",
description: "Exports a circuit key to a JSON file",
alias: ["zkej"],
options: "-verbose|v",
action: zkeyExportJson$1
}, },
]; ];
@ -5839,42 +5848,21 @@ TODO COMMANDS
============= =============
{ {
cmd: "r1cs export circomJSON [circuit.r1cs] [circuit.json]", cmd: "zksnark setup [circuit.r1cs] [circuit.zkey] [verification_key.json]",
description: "Exports a R1CS to JSON file.", description: "Run a simple setup for a circuit generating the proving key.",
alias: ["rj"], alias: ["zs", "setup -r1cs|r -provingkey|pk -verificationkey|vk"],
action: r1csExportCircomJSON options: "-verbose|v -protocol",
action: zksnarkSetup
}, },
{
cmd: "witness export json <witness.wtns> <witness.json>",
description: "Export witness file to json",
alias: ["wj"],
action: witnessExportJson
},
{
cmd: "zkey export vkey <circuit.zkey> <verification_key.json>",
description: "Exports a verification key to JSON",
alias: ["kv"],
action: zKeySolidity
},
{ {
cmd: "witness verify <circuit.r1cs> <witness.wtns>", cmd: "witness verify <circuit.r1cs> <witness.wtns>",
description: "Verify a witness agains a r1cs", description: "Verify a witness agains a r1cs",
alias: ["wv"], alias: ["wv"],
action: witnessVerify action: witnessVerify
}, },
{
phase2 constribute Contribute in the seconf phase ceremony cmd: "powersOfTau export response"
phase2 beacon Contribute in the seconf phase ceremony with a Powers of Tau }
phase2 verify Verify the Powers of tau
zksnark setup s Run a simple setup for a circuit generating the proving key.
zksnark prove p Generates a zk Proof
zksnark verify v Verify a zk Proof
zkey export pkJSON pkjson Exports a proving key to JSON
zkey export vkJSON vkjson Exports a verification key to JSON
zkey export vkSolidity vksol Creates a verifier in solidity
proof callParameters cp Generates call parameters ready to be called.
*/ */
@ -6014,7 +6002,7 @@ async function zksnarkSetup(params, options) {
*/ */
// groth16 prove [circuit.zkey] [witness.wtns] [proof.json] [public.json] // groth16 prove [circuit.zkey] [witness.wtns] [proof.json] [public.json]
async function zksnarkProve(params, options) { async function groth16Prove$1(params, options) {
const zkeyName = params[0] || "circuit.zkey"; const zkeyName = params[0] || "circuit.zkey";
const witnessName = params[1] || "witness.wtns"; const witnessName = params[1] || "witness.wtns";
@ -6023,7 +6011,7 @@ async function zksnarkProve(params, options) {
if (options.verbose) Logger.setLogLevel("DEBUG"); if (options.verbose) Logger.setLogLevel("DEBUG");
const {proof, publicSignals} = await groth16ProofFromInput(zkeyName, witnessName); const {proof, publicSignals} = await groth16Prove(zkeyName, witnessName);
await fs.promises.writeFile(proofName, JSON.stringify(stringifyBigInts$2(proof), null, 1), "utf-8"); await fs.promises.writeFile(proofName, JSON.stringify(stringifyBigInts$2(proof), null, 1), "utf-8");
await fs.promises.writeFile(publicName, JSON.stringify(stringifyBigInts$2(publicSignals), null, 1), "utf-8"); await fs.promises.writeFile(publicName, JSON.stringify(stringifyBigInts$2(publicSignals), null, 1), "utf-8");
@ -6032,7 +6020,7 @@ async function zksnarkProve(params, options) {
} }
// groth16 fullprove [input.json] [circuit.wasm] [circuit.zkey] [proof.json] [public.json] // groth16 fullprove [input.json] [circuit.wasm] [circuit.zkey] [proof.json] [public.json]
async function zksnarkFullProve(params, options) { async function groth16FullProve$1(params, options) {
const inputName = params[0] || "input.json"; const inputName = params[0] || "input.json";
const wasmName = params[1] || "circuit.wasm"; const wasmName = params[1] || "circuit.wasm";
@ -6044,7 +6032,7 @@ async function zksnarkFullProve(params, options) {
const input = unstringifyBigInts$1(JSON.parse(await fs.promises.readFile(inputName, "utf8"))); const input = unstringifyBigInts$1(JSON.parse(await fs.promises.readFile(inputName, "utf8")));
const {proof, publicSignals} = await groth16ProofFromInput$1(input, wasmName, zkeyName); const {proof, publicSignals} = await groth16FullProve(input, wasmName, zkeyName);
await fs.promises.writeFile(proofName, JSON.stringify(stringifyBigInts$2(proof), null, 1), "utf-8"); await fs.promises.writeFile(proofName, JSON.stringify(stringifyBigInts$2(proof), null, 1), "utf-8");
await fs.promises.writeFile(publicName, JSON.stringify(stringifyBigInts$2(publicSignals), null, 1), "utf-8"); await fs.promises.writeFile(publicName, JSON.stringify(stringifyBigInts$2(publicSignals), null, 1), "utf-8");
@ -6053,7 +6041,7 @@ async function zksnarkFullProve(params, options) {
} }
// groth16 verify [verification_key.json] [public.json] [proof.json] // groth16 verify [verification_key.json] [public.json] [proof.json]
async function zksnarkVerify(params, options) { async function groth16Verify$1(params, options) {
const verificationKeyName = params[0] || "verification_key.json"; const verificationKeyName = params[0] || "verification_key.json";
const publicName = params[1] || "public.json"; const publicName = params[1] || "public.json";
@ -6065,9 +6053,9 @@ async function zksnarkVerify(params, options) {
if (options.verbose) Logger.setLogLevel("DEBUG"); if (options.verbose) Logger.setLogLevel("DEBUG");
const isValid$1 = await isValid(verificationKey, pub, proof, logger); const isValid = await groth16Verify(verificationKey, pub, proof, logger);
if (isValid$1) { if (isValid) {
return 0; return 0;
} else { } else {
return 1; return 1;

5349
build/main.cjs Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
build/snarkjs.min.js vendored Normal file

File diff suppressed because one or more lines are too long

208
cli.js

@ -79,13 +79,6 @@ const commands = [
options: "-verbose|v -nopoints -nocheck -name|n", options: "-verbose|v -nopoints -nocheck -name|n",
action: powersOfTawImport action: powersOfTawImport
}, },
{
cmd: "powersoftau verify <powersoftau.ptau>",
description: "verifies a powers of tau file",
alias: ["ptv"],
options: "-verbose|v",
action: powersOfTawVerify
},
{ {
cmd: "powersoftau beacon <old_powersoftau.ptau> <new_powersoftau.ptau> <beaconHash(Hex)> <numIterationsExp>", cmd: "powersoftau beacon <old_powersoftau.ptau> <new_powersoftau.ptau> <beaconHash(Hex)> <numIterationsExp>",
description: "adds a beacon", description: "adds a beacon",
@ -101,6 +94,13 @@ const commands = [
options: "-verbose|v", options: "-verbose|v",
action: powersOfTawPreparePhase2 action: powersOfTawPreparePhase2
}, },
{
cmd: "powersoftau verify <powersoftau.ptau>",
description: "verifies a powers of tau file",
alias: ["ptv"],
options: "-verbose|v",
action: powersOfTawVerify
},
{ {
cmd: "powersoftau export json <powersoftau_0000.ptau> <powersoftau_0000.json>", cmd: "powersoftau export json <powersoftau_0000.ptau> <powersoftau_0000.json>",
description: "Exports a power of tau file to a JSON", description: "Exports a power of tau file to a JSON",
@ -148,34 +148,67 @@ const commands = [
alias: ["wej"], alias: ["wej"],
action: wtnsExportJson action: wtnsExportJson
}, },
/*
{ {
cmd: "zksnark setup [circuit.r1cs] [circuit.zkey] [verification_key.json]", cmd: "zkey new [circuit.r1cs] [powersoftau.ptau] [circuit.zkey]",
description: "Run a simple setup for a circuit generating the proving key.", description: "Creates an initial pkey file with zero contributions ",
alias: ["zs", "setup -r1cs|r -provingkey|pk -verificationkey|vk"], alias: ["zkn"],
options: "-verbose|v -protocol", options: "-verbose|v",
action: zksnarkSetup action: zkeyNew
},
*/
{
cmd: "groth16 prove [circuit.zkey] [witness.wtns] [proof.json] [public.json]",
description: "Generates a zk Proof from witness",
alias: ["g16p", "zpw", "zksnark proof", "proof -pk|provingkey -wt|witness -p|proof -pub|public"],
options: "-verbose|v -protocol",
action: zksnarkProve
}, },
{ {
cmd: "groth16 fullprove [input.json] [circuit.wasm] [circuit.zkey] [proof.json] [public.json]", cmd: "zkey contribute <circuit_old.zkey> <circuit_new.zkey>",
description: "Generates a zk Proof from input", description: "creates a zkey file with a new contribution",
alias: ["g16f", "g16i"], alias: ["zkc"],
options: "-verbose|v -protocol", options: "-verbose|v -entropy|e -name|n",
action: zksnarkFullProve action: zkeyContribute
}, },
{ {
cmd: "groth16 verify [verification_key.json] [public.json] [proof.json]", cmd: "zkey export bellman [circuit.zkey] [circuit.mpcparams]",
description: "Verify a zk Proof", description: "Export a zKey to a MPCParameters file compatible with kobi/phase2 (Bellman)",
alias: ["g16v", "verify -vk|verificationkey -pub|public -p|proof"], alias: ["zkeb"],
action: zksnarkVerify options: "-verbose|v",
action: zkeyExportBellman
},
{
cmd: "zkey bellman contribute <curve> <circuit.mpcparams> <circuit_response.mpcparams>",
description: "contributes to a llallange file in bellman format",
alias: ["zkbc"],
options: "-verbose|v -entropy|e",
action: zkeyBellmanContribute
},
{
cmd: "zkey import bellman <circuit_old.zkey> <circuit.mpcparams> <circuit_new.zkey>",
description: "Export a zKey to a MPCParameters file compatible with kobi/phase2 (Bellman) ",
alias: ["zkib"],
options: "-verbose|v -name|n",
action: zkeyImportBellman
},
{
cmd: "zkey beacon <circuit_old.zkey> <circuit_new.zkey> <beaconHash(Hex)> <numIterationsExp>",
description: "adds a beacon",
alias: ["zkb"],
options: "-verbose|v -name|n",
action: zkeyBeacon
},
{
cmd: "zkey verify [circuit.r1cs] [powersoftau.ptau] [circuit.zkey]",
description: "Verify zkey file contributions and verify that matches with the original circuit.r1cs and ptau",
alias: ["zkv"],
options: "-verbose|v",
action: zkeyVerify
},
{
cmd: "zkey export verificationkey [circuit.zkey] [verification_key.json]",
description: "Exports a verification key",
alias: ["zkev"],
action: zkeyExportVKey
},
{
cmd: "zkey export json [circuit.zkey] [circuit.zkey.json]",
description: "Exports a circuit key to a JSON file",
alias: ["zkej"],
options: "-verbose|v",
action: zkeyExportJson
}, },
{ {
cmd: "zkey export solidityverifier [circuit.zkey] [verifier.sol]", cmd: "zkey export solidityverifier [circuit.zkey] [verifier.sol]",
@ -190,66 +223,24 @@ const commands = [
action: zkeyExportSolidityCalldata action: zkeyExportSolidityCalldata
}, },
{ {
cmd: "zkey new [circuit.r1cs] [powersoftau.ptau] [circuit.zkey]", cmd: "groth16 prove [circuit.zkey] [witness.wtns] [proof.json] [public.json]",
description: "Creates an initial pkey file with zero contributions ", description: "Generates a zk Proof from witness",
alias: ["zkn"], alias: ["g16p", "zpw", "zksnark proof", "proof -pk|provingkey -wt|witness -p|proof -pub|public"],
options: "-verbose|v", options: "-verbose|v -protocol",
action: zkeyNew action: groth16Prove
}, },
{ {
cmd: "zkey export bellman [circuit.zkey] [circuit.mpcparams]", cmd: "groth16 fullprove [input.json] [circuit.wasm] [circuit.zkey] [proof.json] [public.json]",
description: "Export a zKey to a MPCParameters file compatible with kobi/phase2 (Bellman)", description: "Generates a zk Proof from input",
alias: ["zkeb"], alias: ["g16f", "g16i"],
options: "-verbose|v", options: "-verbose|v -protocol",
action: zkeyExportBellman action: groth16FullProve
}, },
{ {
cmd: "zkey import bellman <circuit_old.zkey> <circuit.mpcparams> <circuit_new.zkey>", cmd: "groth16 verify [verification_key.json] [public.json] [proof.json]",
description: "Export a zKey to a MPCParameters file compatible with kobi/phase2 (Bellman) ", description: "Verify a zk Proof",
alias: ["zkib"], alias: ["g16v", "verify -vk|verificationkey -pub|public -p|proof"],
options: "-verbose|v -name|n", action: groth16Verify
action: zkeyImportBellman
},
{
cmd: "zkey verify [circuit.r1cs] [powersoftau.ptau] [circuit.zkey]",
description: "Verify zkey file contributions and verify that matches with the original circuit.r1cs and ptau",
alias: ["zkv"],
options: "-verbose|v",
action: zkeyVerify
},
{
cmd: "zkey contribute <circuit_old.zkey> <circuit_new.zkey>",
description: "creates a zkey file with a new contribution",
alias: ["zkc"],
options: "-verbose|v -entropy|e -name|n",
action: zkeyContribute
},
{
cmd: "zkey beacon <circuit_old.zkey> <circuit_new.zkey> <beaconHash(Hex)> <numIterationsExp>",
description: "adds a beacon",
alias: ["zkb"],
options: "-verbose|v -name|n",
action: zkeyBeacon
},
{
cmd: "zkey bellman contribute <curve> <circuit.mpcparams> <circuit_response.mpcparams>",
description: "contributes to a llallange file in bellman format",
alias: ["zkbc"],
options: "-verbose|v -entropy|e",
action: zkeyBellmanContribute
},
{
cmd: "zkey export verificationkey [circuit.zkey] [verification_key.json]",
description: "Exports a verification key",
alias: ["zkev"],
action: zkeyExportVKey
},
{
cmd: "zkey export json [circuit.zkey] [circuit.zkey.json]",
description: "Exports a circuit key to a JSON file",
alias: ["zkej"],
options: "-verbose|v",
action: zkeyExportJson
}, },
]; ];
@ -269,42 +260,21 @@ TODO COMMANDS
============= =============
{ {
cmd: "r1cs export circomJSON [circuit.r1cs] [circuit.json]", cmd: "zksnark setup [circuit.r1cs] [circuit.zkey] [verification_key.json]",
description: "Exports a R1CS to JSON file.", description: "Run a simple setup for a circuit generating the proving key.",
alias: ["rj"], alias: ["zs", "setup -r1cs|r -provingkey|pk -verificationkey|vk"],
action: r1csExportCircomJSON options: "-verbose|v -protocol",
action: zksnarkSetup
}, },
{
cmd: "witness export json <witness.wtns> <witness.json>",
description: "Export witness file to json",
alias: ["wj"],
action: witnessExportJson
},
{
cmd: "zkey export vkey <circuit.zkey> <verification_key.json>",
description: "Exports a verification key to JSON",
alias: ["kv"],
action: zKeySolidity
},
{ {
cmd: "witness verify <circuit.r1cs> <witness.wtns>", cmd: "witness verify <circuit.r1cs> <witness.wtns>",
description: "Verify a witness agains a r1cs", description: "Verify a witness agains a r1cs",
alias: ["wv"], alias: ["wv"],
action: witnessVerify action: witnessVerify
}, },
{
phase2 constribute Contribute in the seconf phase ceremony cmd: "powersOfTau export response"
phase2 beacon Contribute in the seconf phase ceremony with a Powers of Tau }
phase2 verify Verify the Powers of tau
zksnark setup s Run a simple setup for a circuit generating the proving key.
zksnark prove p Generates a zk Proof
zksnark verify v Verify a zk Proof
zkey export pkJSON pkjson Exports a proving key to JSON
zkey export vkJSON vkjson Exports a verification key to JSON
zkey export vkSolidity vksol Creates a verifier in solidity
proof callParameters cp Generates call parameters ready to be called.
*/ */
@ -444,7 +414,7 @@ async function zksnarkSetup(params, options) {
*/ */
// groth16 prove [circuit.zkey] [witness.wtns] [proof.json] [public.json] // groth16 prove [circuit.zkey] [witness.wtns] [proof.json] [public.json]
async function zksnarkProve(params, options) { async function groth16Prove(params, options) {
const zkeyName = params[0] || "circuit.zkey"; const zkeyName = params[0] || "circuit.zkey";
const witnessName = params[1] || "witness.wtns"; const witnessName = params[1] || "witness.wtns";
@ -462,7 +432,7 @@ async function zksnarkProve(params, options) {
} }
// groth16 fullprove [input.json] [circuit.wasm] [circuit.zkey] [proof.json] [public.json] // groth16 fullprove [input.json] [circuit.wasm] [circuit.zkey] [proof.json] [public.json]
async function zksnarkFullProve(params, options) { async function groth16FullProve(params, options) {
const inputName = params[0] || "input.json"; const inputName = params[0] || "input.json";
const wasmName = params[1] || "circuit.wasm"; const wasmName = params[1] || "circuit.wasm";
@ -483,7 +453,7 @@ async function zksnarkFullProve(params, options) {
} }
// groth16 verify [verification_key.json] [public.json] [proof.json] // groth16 verify [verification_key.json] [public.json] [proof.json]
async function zksnarkVerify(params, options) { async function groth16Verify(params, options) {
const verificationKeyName = params[0] || "verification_key.json"; const verificationKeyName = params[0] || "verification_key.json";
const publicName = params[1] || "public.json"; const publicName = params[1] || "public.json";
@ -495,7 +465,7 @@ async function zksnarkVerify(params, options) {
if (options.verbose) Logger.setLogLevel("DEBUG"); if (options.verbose) Logger.setLogLevel("DEBUG");
const isValid = await groth16.validate(verificationKey, pub, proof, logger); const isValid = await groth16.verify(verificationKey, pub, proof, logger);
if (isValid) { if (isValid) {
return 0; return 0;

@ -4,10 +4,26 @@ import commonJS from "rollup-plugin-commonjs";
export default { export default {
input: "main.js", input: "main.js",
output: { output: {
file: "build/main.js", file: "build/main.cjs",
format: "cjs", format: "cjs",
}, },
external: ["fs", "os", "worker_threads", "readline", "crypto", "path"], external: [
"fs",
"os",
"worker_threads",
"readline",
"crypto",
"path",
"big-integer",
"wasmsnark",
"circom_runtime",
"blake2b-wasm",
"ffjavascript",
"keccak",
"yargs",
"logplease"
],
plugins: [ plugins: [
resolve({ preferBuiltins: true }), resolve({ preferBuiltins: true }),
commonJS({ commonJS({

@ -0,0 +1,24 @@
import resolve from "rollup-plugin-node-resolve";
import commonJS from "rollup-plugin-commonjs";
import ignore from "rollup-plugin-ignore";
import replace from "rollup-plugin-replace";
import { terser } from "rollup-plugin-terser";
export default {
input: "main.js",
output: {
file: "build/snarkjs.min.js",
format: "iife",
globals: {
os: "null"
},
name: "snarkjs"
},
plugins: [
ignore(["fs", "os", "crypto", "readline", "worker_threads"]),
resolve(),
commonJS(),
replace({ "process.browser": !!process.env.BROWSER }),
terser()
]
};

122
package-lock.json generated

@ -203,6 +203,12 @@
"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
"dev": true "dev": true
}, },
"buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true
},
"builtin-modules": { "builtin-modules": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz",
@ -327,6 +333,12 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true "dev": true
}, },
"commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@ -646,9 +658,9 @@
"dev": true "dev": true
}, },
"fastfile": { "fastfile": {
"version": "0.0.5", "version": "0.0.6",
"resolved": "https://registry.npmjs.org/fastfile/-/fastfile-0.0.5.tgz", "resolved": "https://registry.npmjs.org/fastfile/-/fastfile-0.0.6.tgz",
"integrity": "sha512-h6YDy9iI1gITf900quL91qnBl25JtqU5KD82NzhW0B35YFjGhXwWSkUA8g+nyz1th95RWEhtonz7O2AiSL+lQg==" "integrity": "sha512-6cOUdePcue0DAssqGKPhmcSgdLTaB2IzxNgg2WAADOuta00Os88+ShpDItSkQ/eLCiAeYjsPasdBLYozVz+4Ug=="
}, },
"ffjavascript": { "ffjavascript": {
"version": "0.2.2", "version": "0.2.2",
@ -1205,6 +1217,12 @@
"p-is-promise": "^2.0.0" "p-is-promise": "^2.0.0"
} }
}, },
"merge-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
"mimic-fn": { "mimic-fn": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
@ -1670,14 +1688,23 @@
"dev": true "dev": true
}, },
"r1csfile": { "r1csfile": {
"version": "0.0.9", "version": "0.0.10",
"resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.9.tgz", "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.10.tgz",
"integrity": "sha512-VEp8K+Y3z+rRepjVgnnHI0fMgkTts6jYGr6R2WYWTJzW/g08rChWKErjwJRp4VRmqBGHNDV73GImLCxmf3+/7w==", "integrity": "sha512-9w2aCGE9E85v4zGGyLuKyiFyFOv71f7tNbmeujCmNFdQkW06rhuEKMcv/My8MBqOI0SyA6fefYJxGyKOSDCNNA==",
"requires": { "requires": {
"fastfile": "0.0.5", "fastfile": "0.0.6",
"ffjavascript": "0.2.2" "ffjavascript": "0.2.2"
} }
}, },
"randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"dev": true,
"requires": {
"safe-buffer": "^5.1.0"
}
},
"readdirp": { "readdirp": {
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
@ -1797,6 +1824,54 @@
"rollup-pluginutils": "^2.6.0" "rollup-pluginutils": "^2.6.0"
} }
}, },
"rollup-plugin-terser": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-6.1.0.tgz",
"integrity": "sha512-4fB3M9nuoWxrwm39habpd4hvrbrde2W2GG4zEGPQg1YITNkM3Tqur5jSuXlWNzbv/2aMLJ+dZJaySc3GCD8oDw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.8.3",
"jest-worker": "^26.0.0",
"serialize-javascript": "^3.0.0",
"terser": "^4.7.0"
},
"dependencies": {
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"jest-worker": {
"version": "26.1.0",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.1.0.tgz",
"integrity": "sha512-Z9P5pZ6UC+kakMbNJn+tA2RdVdNX5WH1x+5UCBZ9MxIK24pjYtFt96fK+UwBTrjLYm232g1xz0L3eTh51OW+yQ==",
"dev": true,
"requires": {
"merge-stream": "^2.0.0",
"supports-color": "^7.0.0"
}
},
"serialize-javascript": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz",
"integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==",
"dev": true,
"requires": {
"randombytes": "^2.1.0"
}
},
"supports-color": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
"integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
"dev": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"rollup-pluginutils": { "rollup-pluginutils": {
"version": "2.8.2", "version": "2.8.2",
"resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
@ -1824,6 +1899,12 @@
"tslib": "^1.9.0" "tslib": "^1.9.0"
} }
}, },
"safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true
},
"safer-buffer": { "safer-buffer": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@ -1869,6 +1950,22 @@
"is-fullwidth-code-point": "^2.0.0" "is-fullwidth-code-point": "^2.0.0"
} }
}, },
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
},
"source-map-support": {
"version": "0.5.19",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
"integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
"dev": true,
"requires": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"sourcemap-codec": { "sourcemap-codec": {
"version": "1.4.8", "version": "1.4.8",
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
@ -1984,6 +2081,17 @@
} }
} }
}, },
"terser": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
"integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
"dev": true,
"requires": {
"commander": "^2.20.0",
"source-map": "~0.6.1",
"source-map-support": "~0.5.12"
}
},
"text-table": { "text-table": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",

@ -13,10 +13,11 @@
"test": "mocha", "test": "mocha",
"build": "rollup -c config/rollup.cjs.config.js", "build": "rollup -c config/rollup.cjs.config.js",
"buildcli": "rollup -c config/rollup.cli.config.js", "buildcli": "rollup -c config/rollup.cli.config.js",
"buildiife": "BROWSER=true rollup -c config/rollup.iife.config.js" "buildiife": "BROWSER=true rollup -c config/rollup.iife.config.js",
"buildiifemin": "BROWSER=true rollup -c config/rollup.iife_min.config.js"
}, },
"bin": { "bin": {
"snarkjs": "build/cli.js" "snarkjs": "build/cli.cjs"
}, },
"directories": { "directories": {
"templates": "templates" "templates": "templates"
@ -39,11 +40,11 @@
"dependencies": { "dependencies": {
"blake2b-wasm": "https://github.com/jbaylina/blake2b-wasm.git", "blake2b-wasm": "https://github.com/jbaylina/blake2b-wasm.git",
"circom_runtime": "0.0.8", "circom_runtime": "0.0.8",
"fastfile": "0.0.5", "fastfile": "0.0.6",
"ffjavascript": "0.2.2", "ffjavascript": "0.2.2",
"keccak": "^3.0.0", "keccak": "^3.0.0",
"logplease": "^1.2.15", "logplease": "^1.2.15",
"r1csfile": "0.0.9", "r1csfile": "0.0.10",
"yargs": "^12.0.5" "yargs": "^12.0.5"
}, },
"devDependencies": { "devDependencies": {
@ -56,6 +57,7 @@
"rollup-plugin-ignore": "^1.0.6", "rollup-plugin-ignore": "^1.0.6",
"rollup-plugin-json": "^4.0.0", "rollup-plugin-json": "^4.0.0",
"rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-node-resolve": "^5.2.0",
"rollup-plugin-replace": "^2.2.0" "rollup-plugin-replace": "^2.2.0",
"rollup-plugin-terser": "^6.1.0"
} }
} }

@ -1,3 +1,3 @@
export {default as fullProve} from "./groth16_fullprove.js"; export {default as fullProve} from "./groth16_fullprove.js";
export {default as prove} from "./groth16_prove.js"; export {default as prove} from "./groth16_prove.js";
export {default as validate} from "./groth16_verify.js"; export {default as verify} from "./groth16_verify.js";

@ -1,7 +1,7 @@
import groth16_prove from "./groth16_prove.js"; import groth16_prove from "./groth16_prove.js";
import wtns_calculate from "./wtns_calculate.js"; import wtns_calculate from "./wtns_calculate.js";
export default async function groth16ProofFromInput(input, wasmFile, zkeyFileName, logger) { export default async function groth16FullProve(input, wasmFile, zkeyFileName, logger) {
const wtns= { const wtns= {
type: "mem" type: "mem"
}; };

@ -6,7 +6,7 @@ import { log2 } from "./misc.js";
import { Scalar, utils } from "ffjavascript"; import { Scalar, utils } from "ffjavascript";
const {stringifyBigInts} = utils; const {stringifyBigInts} = utils;
export default async function groth16ProofFromInput(zkeyFileName, witnessFileName, logger) { export default async function groth16Prove(zkeyFileName, witnessFileName, logger) {
const {fd: fdWtns, sections: sectionsWtns} = await binFileUtils.readBinFile(witnessFileName, "wtns", 2); const {fd: fdWtns, sections: sectionsWtns} = await binFileUtils.readBinFile(witnessFileName, "wtns", 2);
const wtns = await wtnsUtils.readHeader(fdWtns, sectionsWtns); const wtns = await wtnsUtils.readHeader(fdWtns, sectionsWtns);
@ -101,7 +101,6 @@ export default async function groth16ProofFromInput(zkeyFileName, witnessFileNam
proof = stringifyBigInts(proof); proof = stringifyBigInts(proof);
publicSignals = stringifyBigInts(publicSignals); publicSignals = stringifyBigInts(publicSignals);
return {proof, publicSignals}; return {proof, publicSignals};
} }

@ -23,7 +23,7 @@ import * as curves from "./curves.js";
import { utils } from "ffjavascript"; import { utils } from "ffjavascript";
const {unstringifyBigInts} = utils; const {unstringifyBigInts} = utils;
export default async function isValid(vk_verifier, publicSignals, proof, logger) { export default async function groth16Verify(vk_verifier, publicSignals, proof, logger) {
/* /*
let cpub = vk_verifier.IC[0]; let cpub = vk_verifier.IC[0];
for (let s= 0; s< vk_verifier.nPublic; s++) { for (let s= 0; s< vk_verifier.nPublic; s++) {

@ -109,7 +109,7 @@ describe("Full process", function () {
}); });
it ("groth16 verify", async () => { it ("groth16 verify", async () => {
const res = await snarkjs.groth16.validate(vKey, publicSignals, proof); const res = await snarkjs.groth16.verify(vKey, publicSignals, proof);
assert(res == true); assert(res == true);
}); });