Adapt the way to connect mimcs
Jordi Baylina jordi@baylina.cat
Sun, 28 Apr 2019 12:03:15 +0100
7 files changed,
52 insertions(+),
49 deletions(-)
M
circuits/eddsamimc.circom
→
circuits/eddsamimc.circom
@@ -58,6 +58,7 @@ hash.in[1] <== R8y;
hash.in[2] <== Ax; hash.in[3] <== Ay; hash.in[4] <== M; + hash.k <== 0; component h2bits = Num2Bits_strict(); h2bits.in <== hash.out;
M
circuits/mimc.circom
→
circuits/mimc.circom
@@ -137,18 +137,19 @@ }
template MultiMiMC7(nInputs, nRounds) { signal input in[nInputs]; + signal input k; signal output out; + signal r[nInputs +1]; component mims[nInputs]; + + r[0] <== k; for (var i=0; i<nInputs; i++) { mims[i] = MiMC7(nRounds); - if (i==0) { - mims[i].x_in <== 15021630795539610737508582392395901278341266317943626182700664337106830745361; - } else { - mims[i].x_in <== mims[i-1].out; - } - mims[i].k <== in[i]; + mims[i].x_in <== in[i]; + mims[i].k <== r[i]; + r[i+1] <== r[i] + in[i] + mims[i].out; } - out <== mims[nInputs-1].out; + out <== r[nInputs]; }
M
circuits/smt/smthash.circom
→
circuits/smt/smthash.circom
@@ -29,19 +29,12 @@ signal input key;
signal input value; signal output out; - component h1 = MiMC7(91); // Constant - h1.x_in <== 15021630795539610737508582392395901278341266317943626182700664337106830745361; - h1.k <== 1; - - component h2 = MiMC7(91); - h2.x_in <== h1.out; - h2.k <== key; - - component h3 = MiMC7(91); - h3.x_in <== h2.out; - h3.k <== value; + component h = MultiMiMC7(2, 91); // Constant + h.in[0] <== key; + h.in[1] <== value; + h.k <== 1; - out <== h3.out; + out <== h.out; } /*@@ -55,13 +48,10 @@ signal input L;
signal input R; signal output out; - component h1 = MiMC7(91); - h1.x_in <== 15021630795539610737508582392395901278341266317943626182700664337106830745361; - h1.k <== L; + component h = MultiMiMC7(2, 91); // Constant + h.in[0] <== L; + h.in[1] <== R; + h.k <== 0; - component h2 = MiMC7(91); - h2.x_in <== h1.out; - h2.k <== R; - - out <== h2.out; + out <== h.out; }
M
src/eddsa.js
→
src/eddsa.js
@@ -3,7 +3,7 @@ const bigInt = require("snarkjs").bigInt;
const babyJub = require("./babyjub"); const pedersenHash = require("./pedersenHash").hash; const mimc7 = require("./mimc7"); - + exports.prv2pub= prv2pub; exports.sign = sign; exports.signMiMC = signMiMC;
M
src/mimc7.js
→
src/mimc7.js
@@ -44,10 +44,21 @@ }
return F.affine(F.add(r, k)); }; -exports.multiHash = (arr) => { - let r = exports.getIV(); +exports.multiHash = (arr, key) => { + let r; + if (typeof(key) === "undefined") { + r = F.zero; + } else { + r = key; + } for (let i=0; i<arr.length; i++) { - r = exports.hash(r, bigInt(arr[i])); + r = F.add( + F.add( + r, + arr[i] + ), + exports.hash(bigInt(arr[i]), r) + ); } - return r; + return F.affine(r); };
M
src/smt.js
→
src/smt.js
@@ -46,8 +46,8 @@
const ins = []; const dels = []; - let rtOld = mimc7.multiHash([1, key, resFind.foundValue]); - let rtNew = mimc7.multiHash([1, key, newValue]); + let rtOld = mimc7.multiHash([key, resFind.foundValue], bigInt.one); + let rtNew = mimc7.multiHash([key, newValue], bigInt.one); ins.push([rtNew, [1, key, newValue ]]); dels.push(rtOld);@@ -59,11 +59,11 @@ if (keyBits[level]) {
oldNode = [sibling, rtOld]; newNode = [sibling, rtNew]; } else { - oldNode = [rtOld, sibling, ]; - newNode = [rtNew, sibling, ]; + oldNode = [rtOld, sibling]; + newNode = [rtNew, sibling]; } - rtOld = mimc7.multiHash(oldNode); - rtNew = mimc7.multiHash(newNode); + rtOld = mimc7.multiHash(oldNode, bigInt.zero); + rtNew = mimc7.multiHash(newNode, bigInt.zero); dels.push(rtOld); ins.push([rtNew, newNode]); }@@ -92,7 +92,7 @@ };
const dels = []; const ins = []; - let rtOld = mimc7.multiHash([1, key, resFind.foundValue]); + let rtOld = mimc7.multiHash([key, resFind.foundValue], bigInt.one); let rtNew; dels.push(rtOld);@@ -130,9 +130,9 @@ newSibling = bigInt.zero;
} const oldSibling = resFind.siblings[level]; if (keyBits[level]) { - rtOld = mimc7.multiHash([oldSibling, rtOld]); + rtOld = mimc7.multiHash([oldSibling, rtOld], bigInt.zero); } else { - rtOld = mimc7.multiHash([rtOld, oldSibling]); + rtOld = mimc7.multiHash([rtOld, oldSibling], bigInt.zero); } dels.push(rtOld); if (!newSibling.isZero()) {@@ -147,7 +147,7 @@ newNode = [newSibling, rtNew];
} else { newNode = [rtNew, newSibling]; } - rtNew = mimc7.multiHash(newNode); + rtNew = mimc7.multiHash(newNode, bigInt.zero); ins.push([rtNew, newNode]); } }@@ -185,7 +185,7 @@ const oldKeyits = this._splitBits(resFind.notFoundKey);
for (let i= res.siblings.length; oldKeyits[i] == newKeyBits[i]; i++) { res.siblings.push(bigInt.zero); } - rtOld = mimc7.multiHash([1, resFind.notFoundKey, resFind.notFoundValue]); + rtOld = mimc7.multiHash([resFind.notFoundKey, resFind.notFoundValue], bigInt.one); res.siblings.push(rtOld); addedOne = true; mixed = false;@@ -197,7 +197,7 @@
const inserts = []; const dels = []; - let rt = mimc7.multiHash([1, key, value]); + let rt = mimc7.multiHash([key, value], bigInt.one); inserts.push([rt,[1, key, value]] ); for (let i=res.siblings.length-1; i>=0; i--) {@@ -207,9 +207,9 @@ }
if (mixed) { const oldSibling = resFind.siblings[i]; if (newKeyBits[i]) { - rtOld = mimc7.multiHash([oldSibling, rtOld]); + rtOld = mimc7.multiHash([oldSibling, rtOld], bigInt.zero); } else { - rtOld = mimc7.multiHash([rtOld, oldSibling]); + rtOld = mimc7.multiHash([rtOld, oldSibling], bigInt.zero); } dels.push(rtOld); }@@ -217,10 +217,10 @@
let newRt; if (newKeyBits[i]) { - newRt = mimc7.multiHash([res.siblings[i], rt]); + newRt = mimc7.multiHash([res.siblings[i], rt], bigInt.zero); inserts.push([newRt,[res.siblings[i], rt]] ); } else { - newRt = mimc7.multiHash([rt, res.siblings[i]]); + newRt = mimc7.multiHash([rt, res.siblings[i]], bigInt.zero); inserts.push([newRt,[rt, res.siblings[i]]] ); } rt = newRt;
M
test/eddsamimc.js
→
test/eddsamimc.js
@@ -9,7 +9,7 @@ const assert = chai.assert;
const bigInt = snarkjs.bigInt; -describe("EdDSA test", function () { +describe("EdDSA MiMC test", function () { let circuit; this.timeout(100000);