allow buildpkey & buildwitness to be called from js code in addition to cli usage

This commit is contained in:
arnaucube
2019-05-23 18:51:52 +02:00
parent e40bd0b701
commit ca30f49c67
5 changed files with 146 additions and 135 deletions

View File

@@ -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! ### 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. 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 in [snarkjs](https://github.com/iden3/snarkjs) to a proving_key.bin file that can
be used directly with this library. 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. The result is a JSON object with pi_a, pi_b and pi_c points.

View File

@@ -1,36 +1,6 @@
const {unstringifyBigInts} = require("./stringifybigint.js");
const fs = require("fs");
const bigInt = require("big-integer"); const bigInt = require("big-integer");
const assert = require("assert"); 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) { function writeUint32(h, val) {
h.dataView.setUint32(h.offset, val, true); h.dataView.setUint32(h.offset, val, true);
h.offset += 4; h.offset += 4;
@@ -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 = { const h = {
dataView: new DataView(buff), dataView: new DataView(buff),
offset: 0 offset: 0
}; };
writeUint32(h, provingKey.nVars); writeUint32(h, provingKey.nVars);
writeUint32(h, provingKey.nPublic); writeUint32(h, provingKey.nPublic);
writeUint32(h, provingKey.domainSize); writeUint32(h, provingKey.domainSize);
const pPolsA = alloc(h, 4); const pPolsA = alloc(h, 4);
const pPolsB = alloc(h, 4); const pPolsB = alloc(h, 4);
const pPointsA = alloc(h, 4); const pPointsA = alloc(h, 4);
const pPointsB1 = alloc(h, 4); const pPointsB1 = alloc(h, 4);
const pPointsB2 = alloc(h, 4); const pPointsB2 = alloc(h, 4);
const pPointsC = alloc(h, 4); const pPointsC = alloc(h, 4);
const pPointsHExps = alloc(h, 4); const pPointsHExps = alloc(h, 4);
writePoint(h, provingKey.vk_alfa_1); writePoint(h, provingKey.vk_alfa_1);
writePoint(h, provingKey.vk_beta_1); writePoint(h, provingKey.vk_beta_1);
writePoint(h, provingKey.vk_delta_1); writePoint(h, provingKey.vk_delta_1);
writePoint2(h, provingKey.vk_beta_2); writePoint2(h, provingKey.vk_beta_2);
writePoint2(h, provingKey.vk_delta_2); writePoint2(h, provingKey.vk_delta_2);
writeUint32ToPointer(h, pPolsA, h.offset); writeUint32ToPointer(h, pPolsA, h.offset);
for (let i=0; i<provingKey.nVars; i++) { for (let i=0; i<provingKey.nVars; i++) {
writeTransformedPolynomial(h, provingKey.polsA[i]); writeTransformedPolynomial(h, provingKey.polsA[i]);
} }
writeUint32ToPointer(h, pPolsB, h.offset); writeUint32ToPointer(h, pPolsB, h.offset);
for (let i=0; i<provingKey.nVars; i++) { for (let i=0; i<provingKey.nVars; i++) {
writeTransformedPolynomial(h, provingKey.polsB[i]); writeTransformedPolynomial(h, provingKey.polsB[i]);
} }
writeUint32ToPointer(h, pPointsA, h.offset); writeUint32ToPointer(h, pPointsA, h.offset);
for (let i=0; i<provingKey.nVars; i++) { for (let i=0; i<provingKey.nVars; i++) {
writePoint(h, provingKey.A[i]); writePoint(h, provingKey.A[i]);
} }
writeUint32ToPointer(h, pPointsB1, h.offset); writeUint32ToPointer(h, pPointsB1, h.offset);
for (let i=0; i<provingKey.nVars; i++) { for (let i=0; i<provingKey.nVars; i++) {
writePoint(h, provingKey.B1[i]); writePoint(h, provingKey.B1[i]);
} }
writeUint32ToPointer(h, pPointsB2, h.offset); writeUint32ToPointer(h, pPointsB2, h.offset);
for (let i=0; i<provingKey.nVars; i++) { for (let i=0; i<provingKey.nVars; i++) {
writePoint2(h, provingKey.B2[i]); writePoint2(h, provingKey.B2[i]);
} }
writeUint32ToPointer(h, pPointsC, h.offset); writeUint32ToPointer(h, pPointsC, h.offset);
for (let i=provingKey.nPublic+1; i<provingKey.nVars; i++) { for (let i=provingKey.nPublic+1; i<provingKey.nVars; i++) {
writePoint(h, provingKey.C[i]); writePoint(h, provingKey.C[i]);
} }
writeUint32ToPointer(h, pPointsHExps, h.offset); writeUint32ToPointer(h, pPointsHExps, h.offset);
for (let i=0; i<provingKey.domainSize; i++) { for (let i=0; i<provingKey.domainSize; i++) {
writePoint(h, provingKey.hExps[i]); writePoint(h, provingKey.hExps[i]);
}
assert.equal(h.offset, buffLen);
return Buffer.from(buff);
} }
assert.equal(h.offset, buffLen); module.exports = buildPKey;
var wstream = fs.createWriteStream(outputName);
wstream.write(Buffer.from(buff));
wstream.end();
/* /*
NSignals NSignals

34
tools/buildpkey_cli.js Normal file
View File

@@ -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();

View File

@@ -1,32 +1,5 @@
const {unstringifyBigInts} = require("./stringifybigint.js");
const fs = require("fs");
const assert = require("assert"); 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) { function writeUint32(h, val) {
h.dataView.setUint32(h.offset, val, true); h.dataView.setUint32(h.offset, val, true);
h.offset += 4; h.offset += 4;
@@ -42,7 +15,6 @@ function writeBigInt(h, bi) {
function calculateBuffLen(witness) { function calculateBuffLen(witness) {
let size = 0; let size = 0;
// beta2, delta2 // beta2, delta2
@@ -52,25 +24,25 @@ function calculateBuffLen(witness) {
} }
const buffLen = calculateBuffLen(witness); function buildWitness(witness) {
const buffLen = calculateBuffLen(witness);
const buff = new ArrayBuffer(buffLen); const buff = new ArrayBuffer(buffLen);
const h = { const h = {
dataView: new DataView(buff), dataView: new DataView(buff),
offset: 0 offset: 0
}; };
// writeUint32(h, witness.length);
// writeUint32(h, witness.length); for (let i=0; i<witness.length; i++) {
for (let i=0; i<witness.length; i++) {
writeBigInt(h, witness[i]); writeBigInt(h, witness[i]);
}
assert.equal(h.offset, buffLen);
return Buffer.from(buff);
} }
assert.equal(h.offset, buffLen); module.exports = buildWitness;
var wstream = fs.createWriteStream(outputName);
wstream.write(Buffer.from(buff));
wstream.end();

33
tools/buildwitness_cli.js Normal file
View File

@@ -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();