arnaucube
arnaucube/websnarkPublic Self-hosted repository
allow buildpkey & buildwitness to be called from js code in addition to cli usage
arnaucube arnaucube@gmail.com
Thu, 23 May 2019 18:51:52 +0200
commit

ca30f49c679632737b88eac43e723f35ba65afe5

parent

e40bd0b701330ea209b6c89e70d768e5c8f634ce

5 files changed, 140 insertions(+), 129 deletions(-)

jump to
M README.md → README.md

@@ -34,17 +34,17 @@

### 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.
M tools/buildpkey.js → tools/buildpkey.js

@@ -1,35 +1,5 @@

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

@@ -117,73 +87,75 @@ return size;

} -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, pPointsA, h.offset); + for (let i=0; i<provingKey.nVars; i++) { + writePoint(h, provingKey.A[i]); + } -writeUint32ToPointer(h, pPolsB, h.offset); -for (let i=0; i<provingKey.nVars; i++) { - writeTransformedPolynomial(h, provingKey.polsB[i]); -} + writeUint32ToPointer(h, pPointsB1, h.offset); + for (let i=0; i<provingKey.nVars; i++) { + writePoint(h, provingKey.B1[i]); + } -writeUint32ToPointer(h, pPointsA, h.offset); -for (let i=0; i<provingKey.nVars; i++) { - writePoint(h, provingKey.A[i]); -} + writeUint32ToPointer(h, pPointsB2, h.offset); + for (let i=0; i<provingKey.nVars; i++) { + writePoint2(h, provingKey.B2[i]); + } -writeUint32ToPointer(h, pPointsB1, h.offset); -for (let i=0; i<provingKey.nVars; i++) { - writePoint(h, provingKey.B1[i]); -} + writeUint32ToPointer(h, pPointsC, h.offset); + for (let i=provingKey.nPublic+1; i<provingKey.nVars; i++) { + writePoint(h, provingKey.C[i]); + } -writeUint32ToPointer(h, pPointsB2, h.offset); -for (let i=0; i<provingKey.nVars; i++) { - writePoint2(h, provingKey.B2[i]); -} + writeUint32ToPointer(h, pPointsHExps, h.offset); + for (let i=0; i<provingKey.domainSize; i++) { + writePoint(h, provingKey.hExps[i]); + } -writeUint32ToPointer(h, pPointsC, h.offset); -for (let i=provingKey.nPublic+1; i<provingKey.nVars; i++) { - writePoint(h, provingKey.C[i]); -} + assert.equal(h.offset, buffLen); -writeUint32ToPointer(h, pPointsHExps, h.offset); -for (let i=0; i<provingKey.domainSize; i++) { - writePoint(h, provingKey.hExps[i]); + return Buffer.from(buff); } -assert.equal(h.offset, buffLen); - -var wstream = fs.createWriteStream(outputName); -wstream.write(Buffer.from(buff)); -wstream.end(); +module.exports = buildPKey; /* NSignals
A tools/buildpkey_cli.js

@@ -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(); +
M tools/buildwitness.js → tools/buildwitness.js

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

@@ -42,7 +15,6 @@ }

function calculateBuffLen(witness) { - let size = 0; // beta2, delta2

@@ -52,25 +24,25 @@ return size;

} -const buffLen = calculateBuffLen(witness); +function buildWitness(witness) { + const buffLen = calculateBuffLen(witness); -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, 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;
A tools/buildwitness_cli.js

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