Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,17 +34,17 @@ You can use the tool to build the binary file from the witness.json file generat
### IMPORTANT: Please be sure you run your setup with `--protocol groth` websnark only generates groth16 proofs!

```
node ../tools/buildwitness.js -i witness.json -o witness.bin
node ../tools/buildwitness_cli.js -i witness.json -o witness.bin
```

provingKey is the binary buffer with the binary representation of the proving key.

Check the tool tools/buildpkey.js to convert a proving_key.json file generated
Check the tool tools/buildpkey_cli.js to convert a proving_key.json file generated
in [snarkjs](https://github.com/iden3/snarkjs) to a proving_key.bin file that can
be used directly with this library.

```
node ../tools/buildpkey.js -i proving_key.json -o proving_key.bin
node ../tools/buildpkey_cli.js -i proving_key.json -o proving_key.bin
```

The result is a JSON object with pi_a, pi_b and pi_c points.
Expand Down
138 changes: 55 additions & 83 deletions tools/buildpkey.js
Original file line number Diff line number Diff line change
@@ -1,36 +1,6 @@
const {unstringifyBigInts} = require("./stringifybigint.js");
const fs = require("fs");
const bigInt = require("big-integer");
const assert = require("assert");

const version = require("../package").version;

const argv = require("yargs")
.version(version)
.usage(`node buildpkey.js -i "proving_key.json" -o "proving_key.bin"
Default: circuit.json
`)
.alias("i", "input")
.alias("o", "output")
.help("h")
.alias("h", "help")
.epilogue(`Copyright (C) 2018 0kims association
This program comes with ABSOLUTELY NO WARRANTY;
This is free software, and you are welcome to redistribute it
under certain conditions; see the COPYING file in the official
repo directory at https://github.com/iden3/circom `)
.argv;

const inputName = (argv.input) ? argv.input : "proving_key.json";
const outputName = (argv.output) ? argv.output : "proving_key.bin";


const provingKey = unstringifyBigInts(JSON.parse(fs.readFileSync(inputName, "utf8")));





function writeUint32(h, val) {
h.dataView.setUint32(h.offset, val, true);
h.offset += 4;
Expand Down Expand Up @@ -117,73 +87,75 @@ function calculateBuffLen(provingKey) {
}


const buffLen = calculateBuffLen(provingKey);
function buildPKey(provingKey) {
const buffLen = calculateBuffLen(provingKey);

const buff = new ArrayBuffer(buffLen);
const buff = new ArrayBuffer(buffLen);

const h = {
dataView: new DataView(buff),
offset: 0
};
const h = {
dataView: new DataView(buff),
offset: 0
};


writeUint32(h, provingKey.nVars);
writeUint32(h, provingKey.nPublic);
writeUint32(h, provingKey.domainSize);
const pPolsA = alloc(h, 4);
const pPolsB = alloc(h, 4);
const pPointsA = alloc(h, 4);
const pPointsB1 = alloc(h, 4);
const pPointsB2 = alloc(h, 4);
const pPointsC = alloc(h, 4);
const pPointsHExps = alloc(h, 4);
writeUint32(h, provingKey.nVars);
writeUint32(h, provingKey.nPublic);
writeUint32(h, provingKey.domainSize);
const pPolsA = alloc(h, 4);
const pPolsB = alloc(h, 4);
const pPointsA = alloc(h, 4);
const pPointsB1 = alloc(h, 4);
const pPointsB2 = alloc(h, 4);
const pPointsC = alloc(h, 4);
const pPointsHExps = alloc(h, 4);

writePoint(h, provingKey.vk_alfa_1);
writePoint(h, provingKey.vk_beta_1);
writePoint(h, provingKey.vk_delta_1);
writePoint2(h, provingKey.vk_beta_2);
writePoint2(h, provingKey.vk_delta_2);
writePoint(h, provingKey.vk_alfa_1);
writePoint(h, provingKey.vk_beta_1);
writePoint(h, provingKey.vk_delta_1);
writePoint2(h, provingKey.vk_beta_2);
writePoint2(h, provingKey.vk_delta_2);

writeUint32ToPointer(h, pPolsA, h.offset);
for (let i=0; i<provingKey.nVars; i++) {
writeTransformedPolynomial(h, provingKey.polsA[i]);
}
writeUint32ToPointer(h, pPolsA, h.offset);
for (let i=0; i<provingKey.nVars; i++) {
writeTransformedPolynomial(h, provingKey.polsA[i]);
}

writeUint32ToPointer(h, pPolsB, h.offset);
for (let i=0; i<provingKey.nVars; i++) {
writeTransformedPolynomial(h, provingKey.polsB[i]);
}
writeUint32ToPointer(h, pPolsB, h.offset);
for (let i=0; i<provingKey.nVars; i++) {
writeTransformedPolynomial(h, provingKey.polsB[i]);
}

writeUint32ToPointer(h, pPointsA, h.offset);
for (let i=0; i<provingKey.nVars; i++) {
writePoint(h, provingKey.A[i]);
}
writeUint32ToPointer(h, pPointsA, h.offset);
for (let i=0; i<provingKey.nVars; i++) {
writePoint(h, provingKey.A[i]);
}

writeUint32ToPointer(h, pPointsB1, h.offset);
for (let i=0; i<provingKey.nVars; i++) {
writePoint(h, provingKey.B1[i]);
}
writeUint32ToPointer(h, pPointsB1, h.offset);
for (let i=0; i<provingKey.nVars; i++) {
writePoint(h, provingKey.B1[i]);
}

writeUint32ToPointer(h, pPointsB2, h.offset);
for (let i=0; i<provingKey.nVars; i++) {
writePoint2(h, provingKey.B2[i]);
}
writeUint32ToPointer(h, pPointsB2, h.offset);
for (let i=0; i<provingKey.nVars; i++) {
writePoint2(h, provingKey.B2[i]);
}

writeUint32ToPointer(h, pPointsC, h.offset);
for (let i=provingKey.nPublic+1; i<provingKey.nVars; i++) {
writePoint(h, provingKey.C[i]);
}
writeUint32ToPointer(h, pPointsC, h.offset);
for (let i=provingKey.nPublic+1; i<provingKey.nVars; i++) {
writePoint(h, provingKey.C[i]);
}

writeUint32ToPointer(h, pPointsHExps, h.offset);
for (let i=0; i<provingKey.domainSize; i++) {
writePoint(h, provingKey.hExps[i]);
}
writeUint32ToPointer(h, pPointsHExps, h.offset);
for (let i=0; i<provingKey.domainSize; i++) {
writePoint(h, provingKey.hExps[i]);
}

assert.equal(h.offset, buffLen);

assert.equal(h.offset, buffLen);
return Buffer.from(buff);
}

var wstream = fs.createWriteStream(outputName);
wstream.write(Buffer.from(buff));
wstream.end();
module.exports = buildPKey;

/*
NSignals
Expand Down
34 changes: 34 additions & 0 deletions tools/buildpkey_cli.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
const {unstringifyBigInts} = require("./stringifybigint.js");
const buildPKey = require("./buildpkey.js");
const fs = require("fs");

const version = require("../package").version;

const argv = require("yargs")
.version(version)
.usage(`node buildpkey.js -i "proving_key.json" -o "proving_key.bin"
Default: circuit.json
`)
.alias("i", "input")
.alias("o", "output")
.help("h")
.alias("h", "help")
.epilogue(`Copyright (C) 2018 0kims association
This program comes with ABSOLUTELY NO WARRANTY;
This is free software, and you are welcome to redistribute it
under certain conditions; see the COPYING file in the official
repo directory at https://github.com/iden3/circom `)
.argv;

const inputName = (argv.input) ? argv.input : "proving_key.json";
const outputName = (argv.output) ? argv.output : "proving_key.bin";


const provingKey = unstringifyBigInts(JSON.parse(fs.readFileSync(inputName, "utf8")));

const bin = buildPKey(provingKey);

var wstream = fs.createWriteStream(outputName);
wstream.write(bin);
wstream.end();

58 changes: 15 additions & 43 deletions tools/buildwitness.js
Original file line number Diff line number Diff line change
@@ -1,32 +1,5 @@
const {unstringifyBigInts} = require("./stringifybigint.js");
const fs = require("fs");
const assert = require("assert");

const version = require("../package").version;

const argv = require("yargs")
.version(version)
.usage(`node buildpkey.js -i "witness.json" -o "witness.bin"
Default: circuit.json
`)
.alias("i", "input")
.alias("o", "output")
.help("h")
.alias("h", "help")
.epilogue(`Copyright (C) 2018 0kims association
This program comes with ABSOLUTELY NO WARRANTY;
This is free software, and you are welcome to redistribute it
under certain conditions; see the COPYING file in the official
repo directory at https://github.com/iden3/circom `)
.argv;

const inputName = (argv.input) ? argv.input : "witness.json";
const outputName = (argv.output) ? argv.output : "witness.bin";


const witness = unstringifyBigInts(JSON.parse(fs.readFileSync(inputName, "utf8")));


function writeUint32(h, val) {
h.dataView.setUint32(h.offset, val, true);
h.offset += 4;
Expand All @@ -42,7 +15,6 @@ function writeBigInt(h, bi) {


function calculateBuffLen(witness) {

let size = 0;

// beta2, delta2
Expand All @@ -52,25 +24,25 @@ function calculateBuffLen(witness) {
}


const buffLen = calculateBuffLen(witness);

const buff = new ArrayBuffer(buffLen);
function buildWitness(witness) {
const buffLen = calculateBuffLen(witness);

const h = {
dataView: new DataView(buff),
offset: 0
};
const buff = new ArrayBuffer(buffLen);

const h = {
dataView: new DataView(buff),
offset: 0
};

// writeUint32(h, witness.length);
// writeUint32(h, witness.length);

for (let i=0; i<witness.length; i++) {
writeBigInt(h, witness[i]);
}
for (let i=0; i<witness.length; i++) {
writeBigInt(h, witness[i]);
}

assert.equal(h.offset, buffLen);
assert.equal(h.offset, buffLen);

var wstream = fs.createWriteStream(outputName);
wstream.write(Buffer.from(buff));
wstream.end();
return Buffer.from(buff);
}

module.exports = buildWitness;
33 changes: 33 additions & 0 deletions tools/buildwitness_cli.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
const {unstringifyBigInts} = require("./stringifybigint.js");
const buildWitness = require("./buildwitness.js");
const fs = require("fs");

const version = require("../package").version;

const argv = require("yargs")
.version(version)
.usage(`node buildpkey.js -i "witness.json" -o "witness.bin"
Default: circuit.json
`)
.alias("i", "input")
.alias("o", "output")
.help("h")
.alias("h", "help")
.epilogue(`Copyright (C) 2018 0kims association
This program comes with ABSOLUTELY NO WARRANTY;
This is free software, and you are welcome to redistribute it
under certain conditions; see the COPYING file in the official
repo directory at https://github.com/iden3/circom `)
.argv;

const inputName = (argv.input) ? argv.input : "witness.json";
const outputName = (argv.output) ? argv.output : "witness.bin";

const witness = unstringifyBigInts(JSON.parse(fs.readFileSync(inputName, "utf8")));

const bin = buildWitness(witness);

var wstream = fs.createWriteStream(outputName);
wstream.write(bin);
wstream.end();