arnaucube
arnaucube/circomPublic Self-hosted repository
r1cs builder fix
Jordi Baylina jordi@baylina.cat
Sat, 04 Jul 2020 19:54:47 +0200
commit

8655573b349ac0be045d01e98138a51c00da10c2

parent

8fc6e3f1c6c379850c019df47a21040f99d8cf11

1 files changed, 33 insertions(+), 60 deletions(-)

jump to
M src/r1csfile.js → src/r1csfile.js

@@ -9,22 +9,24 @@

const fd = await fastFile.createOverride(fileName); - await fd.write(Buffer.from("r1cs"), 0); // Magic "r1cs" + const type = "r1cs"; + const buff = new Uint8Array(4); + for (let i=0; i<4; i++) buff[i] = type.charCodeAt(i); + await fd.write(buff, 0); // Magic "r1cs" - let p = 4; - await writeU32(1); // Version - await writeU32(3); // Number of Sections + await fd.writeULE32(1); // Version + await fd.writeULE32(3); // Number of Sections // Write the header /////////// - await writeU32(1); // Header type - const pHeaderSize = p; - await writeU64(0); // Temporally set to 0 length + await fd.writeULE32(1); // Header type + const pHeaderSize = fd.pos; + await fd.writeULE64(0); // Temporally set to 0 length const n8 = (Math.floor( (ctx.F.bitLength - 1) / 64) +1)*8; // Field Def - await writeU32(n8); // Temporally set to 0 length + await fd.writeULE32(n8); // Temporally set to 0 length await writeBigInt(ctx.F.p); const NWires =

@@ -34,20 +36,20 @@ ctx.totals[ctx.stPUBINPUT] +

ctx.totals[ctx.stPRVINPUT] + ctx.totals[ctx.stINTERNAL]; - await writeU32(NWires); - await writeU32(ctx.totals[ctx.stOUTPUT]); - await writeU32(ctx.totals[ctx.stPUBINPUT]); - await writeU32(ctx.totals[ctx.stPRVINPUT]); - await writeU64(ctx.signals.length); - await writeU32(ctx.constraints.length); + await fd.writeULE32(NWires); + await fd.writeULE32(ctx.totals[ctx.stOUTPUT]); + await fd.writeULE32(ctx.totals[ctx.stPUBINPUT]); + await fd.writeULE32(ctx.totals[ctx.stPRVINPUT]); + await fd.writeULE64(ctx.signals.length); + await fd.writeULE32(ctx.constraints.length); - const headerSize = p - pHeaderSize - 8; + const headerSize = fd.pos - pHeaderSize - 8; // Write constraints /////////// - await writeU32(2); // Constraints type - const pConstraintsSize = p; - await writeU64(0); // Temporally set to 0 length + await fd.writeULE32(2); // Constraints type + const pConstraintsSize = fd.pos; + await fd.writeULE64(0); // Temporally set to 0 length for (let i=0; i<ctx.constraints.length; i++) { if ((ctx.verbose)&&(i%10000 == 0)) {

@@ -56,13 +58,13 @@ }

await writeConstraint(ctx.constraints[i]); } - const constraintsSize = p - pConstraintsSize - 8; + const constraintsSize = fd.pos - pConstraintsSize - 8; // Write map /////////// - await writeU32(3); // wires2label type - const pMapSize = p; - await writeU64(0); // Temporally set to 0 length + await fd.writeULE32(3); // wires2label type + const pMapSize = fd.pos; + await fd.writeULE64(0); // Temporally set to 0 length const arr = new Array(NWires);

@@ -76,45 +78,19 @@ arr[outIdx] = i;

} } for (let i=0; i<arr.length; i++) { - await writeU64(arr[i]); + await fd.writeULE64(arr[i]); if ((ctx.verbose)&&(i%100000)) console.log("writing wire2label map: ", i); } - const mapSize = p - pMapSize - 8; + const mapSize = fd.pos - pMapSize - 8; // Write sizes - await writeU32(headerSize, pHeaderSize); - await writeU32(constraintsSize, pConstraintsSize); - await writeU32(mapSize, pMapSize); + await fd.writeULE32(headerSize, pHeaderSize); + await fd.writeULE32(constraintsSize, pConstraintsSize); + await fd.writeULE32(mapSize, pMapSize); 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, 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; - const MSB = Math.floor(v / 0x100000000); - b.writeInt32LE(LSB, 0); - b.writeInt32LE(MSB, 4); - - await fd.write(b, o); - - if (typeof(pos) == "undefined") p += 8; - } - async function writeConstraint(c) { await writeLC(c.a); await writeLC(c.b);

@@ -123,28 +99,25 @@ }

async function writeLC(lc) { const idxs = Object.keys(lc.coefs); - await writeU32(idxs.length); + await fd.writeULE32(idxs.length); for (let s in lc.coefs) { let lSignal = ctx.signals[s]; while (lSignal.e >=0 ) lSignal = ctx.signals[lSignal.e]; - await writeU32(lSignal.id); + await fd.writeULE32(lSignal.id); await writeBigInt(lc.coefs[s]); } } async function writeBigInt(n, pos) { - - let o = (typeof pos == "undefined") ? p : pos; const s = n.toString(16); const b = Buffer.from(s.padStart(n8*2, "0"), "hex"); - const buff = Buffer.allocUnsafe(b.length); + const buff = new Uint8Array(b.length); for (let i=0; i<b.length; i++) buff[i] = b[b.length-1-i]; - await fd.write(buff, o); + await fd.write(buff, pos); - if (typeof(pos) == "undefined") p += n8; } }