arnaucube
arnaucube/circomPublic Self-hosted repository
fastfile
Jordi Baylina jordi@baylina.cat
Sun, 19 Apr 2020 18:38:10 +0200
commit

7fc457ac9058fd22faee9e459d1d7f27d90c11b1

parent

8c4980c3f960405a9364e4da6a0809ea650e66cb

3 files changed, 26 insertions(+), 19 deletions(-)

jump to
M package-lock.json → package-lock.json

@@ -581,6 +581,11 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",

"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fastfile": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/fastfile/-/fastfile-0.0.1.tgz", + "integrity": "sha512-Fk8PWafGWGEUw7oPq/dJen92ASxknCEy4ZC8n4VEvSwCp/jcReyEmVoWsRIWTf+IvAp2MzvFi54vOPeK2LQZtQ==" + }, "ffiasm": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/ffiasm/-/ffiasm-0.0.2.tgz",

@@ -1123,10 +1128,11 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",

"dev": true }, "r1csfile": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.4.tgz", - "integrity": "sha512-1Y/zzzEjQVTR/gPlduRaKi2K+yU+UxqtsS+obDLEEb4WAzwCkKGybRfp037CUW5OApeleS1WdGmtKv9K9FPhsA==", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.5.tgz", + "integrity": "sha512-B+BdKPb/WUTp4N/3X4d1Spgx9Ojx5tFVejGZRJxpTtzq34mC8Vi/czWfiPj85V8kud31lCfYcZ16z7+czvM0Sw==", "requires": { + "fastfile": "0.0.1", "ffjavascript": "0.1.0" } },
M package.json → package.json

@@ -31,11 +31,12 @@ },

"dependencies": { "chai": "^4.2.0", "circom_runtime": "0.0.5", + "fastfile": "0.0.1", "ffiasm": "0.0.2", "ffjavascript": "0.1.0", "ffwasm": "0.0.7", "fnv-plus": "^1.3.1", - "r1csfile": "0.0.4", + "r1csfile": "0.0.5", "tmp-promise": "^2.0.2", "wasmbuilder": "0.0.10" },
M src/r1csfile.js → src/r1csfile.js

@@ -1,16 +1,15 @@

-const fs = require("fs"); +const fastFile = require("fastfile"); const assert = require("assert"); -const Scalar = require("ffjavascript").Scalar; module.exports.buildR1cs = buildR1cs; async function buildR1cs(ctx, fileName) { - const fd = await fs.promises.open(fileName, "w"); + const fd = await fastFile.createOverride(fileName); - await fd.write("r1cs"); // Magic "r1cs" + await fd.write(Buffer.from("r1cs"), 0); // Magic "r1cs" let p = 4; await writeU32(1); // Version

@@ -53,7 +52,6 @@

for (let i=0; i<ctx.constraints.length; i++) { if ((ctx.verbose)&&(i%10000 == 0)) { if (ctx.verbose) console.log("writing constraint: ", i); - await fd.datasync(); } await writeConstraint(ctx.constraints[i]); }

@@ -89,19 +87,22 @@ await writeU32(headerSize, pHeaderSize);

await writeU32(constraintsSize, pConstraintsSize); await writeU32(mapSize, pMapSize); - await fd.sync(); await fd.close(); async function writeU32(v, pos) { + let o = (typeof pos == "undefined") ? p : pos; + const b = Buffer.allocUnsafe(4); b.writeInt32LE(v); - await fd.write(b, 0, 4, pos); + await fd.write(b, o); if (typeof(pos) == "undefined") p += 4; } async function writeU64(v, pos) { + let o = (typeof pos == "undefined") ? p : pos; + const b = Buffer.allocUnsafe(8); const LSB = v & 0xFFFFFFFF;

@@ -109,7 +110,7 @@ const MSB = Math.floor(v / 0x100000000);

b.writeInt32LE(LSB, 0); b.writeInt32LE(MSB, 4); - await fd.write(b, 0, 8, pos); + await fd.write(b, o); if (typeof(pos) == "undefined") p += 8; }

@@ -134,16 +135,15 @@ }

} async function writeBigInt(n, pos) { - const b = Buffer.allocUnsafe(n8); - const dwords = Scalar.toArray(n, 0x100000000); + let o = (typeof pos == "undefined") ? p : pos; - for (let i=0; i<dwords.length; i++) { - b.writeUInt32LE(dwords[dwords.length-1-i], i*4, 4 ); - } - b.fill(0, dwords.length*4); + const s = n.toString(16); + const b = Buffer.from(s.padStart(n8*2, "0"), "hex"); + const buff = Buffer.allocUnsafe(b.length); + for (let i=0; i<b.length; i++) buff[i] = b[b.length-1-i]; - await fd.write(b, 0, fs, pos); + await fd.write(buff, o); if (typeof(pos) == "undefined") p += n8; }