arnaucube
arnaucube/websnarkPublic Self-hosted repository
websnark/tools/buildwitness.js
tools/buildwitness.jsRaw
 1const {unstringifyBigInts} = require("./stringifybigint.js");
 2const fs = require("fs");
 3const assert = require("assert");
 4
 5const version = require("../package").version;
 6
 7const argv = require("yargs")
 8    .version(version)
 9    .usage(`node buildpkey.js -i "witness.json" -o "witness.bin"
10  Default: circuit.json
11        `)
12    .alias("i", "input")
13    .alias("o", "output")
14    .help("h")
15    .alias("h", "help")
16    .epilogue(`Copyright (C) 2018  0kims association
17    This program comes with ABSOLUTELY NO WARRANTY;
18    This is free software, and you are welcome to redistribute it
19    under certain conditions; see the COPYING file in the official
20    repo directory at  https://github.com/iden3/circom `)
21    .argv;
22
23const inputName = (argv.input) ? argv.input : "witness.json";
24const outputName = (argv.output) ? argv.output : "witness.bin";
25
26
27const witness = unstringifyBigInts(JSON.parse(fs.readFileSync(inputName, "utf8")));
28
29
30function writeUint32(h, val) {
31    h.dataView.setUint32(h.offset, val, true);
32    h.offset += 4;
33}
34
35
36function writeBigInt(h, bi) {
37    for (let i=0; i<8; i++) {
38        const v = bi.shiftRight(i*32).and(0xFFFFFFFF).toJSNumber();
39        writeUint32(h, v);
40    }
41}
42
43
44function calculateBuffLen(witness) {
45
46    let size = 0;
47
48    // beta2, delta2
49    size += witness.length * 32;
50
51    return size;
52}
53
54
55const buffLen = calculateBuffLen(witness);
56
57const buff = new ArrayBuffer(buffLen);
58
59const h = {
60    dataView: new DataView(buff),
61    offset: 0
62};
63
64
65// writeUint32(h, witness.length);
66
67for (let i=0; i<witness.length; i++) {
68    writeBigInt(h, witness[i]);
69}
70
71assert.equal(h.offset, buffLen);
72
73var wstream = fs.createWriteStream(outputName);
74wstream.write(Buffer.from(buff));
75wstream.end();
76