Simplify and working test

This commit is contained in:
Jordi Baylina
2018-12-13 21:04:37 +01:00
parent ccaa7ff23b
commit e636a4ac83
4 changed files with 67 additions and 45 deletions

View File

@@ -66,7 +66,7 @@ Insert to a used leaf.
│ │ │ │
│ │ │ │
┌────┴────┐ ┏━━━┻━━━┓ ┌───────┐ ┌────┴────┐ ┏━━━┻━━━┓ ┌───────┐
old1 │Old1Leaf │ ┌─────▶┃ Hash ┃◀──┼─ 0 │ bot │Old1Leaf │ ┌─────▶┃ Hash ┃◀──┼─ 0 │
└─────────┘ │ ┗━━━━━━━┛ └───────┘ └─────────┘ │ ┗━━━━━━━┛ └───────┘
@@ -159,7 +159,6 @@ template SMTInsert(nLevels) {
sm[i] = SMTInsertSM(); sm[i] = SMTInsertSM();
if (i==0) { if (i==0) {
sm[i].prev_top <== enabled; sm[i].prev_top <== enabled;
sm[i].prev_old1 <== 0;
sm[i].prev_old0 <== 0; sm[i].prev_old0 <== 0;
sm[i].prev_bot <== 0; sm[i].prev_bot <== 0;
sm[i].prev_new1 <== 0; sm[i].prev_new1 <== 0;
@@ -167,7 +166,6 @@ template SMTInsert(nLevels) {
sm[i].prev_upd <== 0; sm[i].prev_upd <== 0;
} else { } else {
sm[i].prev_top <== sm[i-1].st_top; sm[i].prev_top <== sm[i-1].st_top;
sm[i].prev_old1 <== sm[i-1].st_old1;
sm[i].prev_old0 <== sm[i-1].st_old0; sm[i].prev_old0 <== sm[i-1].st_old0;
sm[i].prev_bot <== sm[i-1].st_bot; sm[i].prev_bot <== sm[i-1].st_bot;
sm[i].prev_new1 <== sm[i-1].st_new1; sm[i].prev_new1 <== sm[i-1].st_new1;
@@ -187,7 +185,6 @@ template SMTInsert(nLevels) {
levels[i] = SMTInsertLevel(); levels[i] = SMTInsertLevel();
levels[i].st_top <== sm[i].st_top; levels[i].st_top <== sm[i].st_top;
levels[i].st_old1 <== sm[i].st_old1;
levels[i].st_old0 <== sm[i].st_old0; levels[i].st_old0 <== sm[i].st_old0;
levels[i].st_bot <== sm[i].st_bot; levels[i].st_bot <== sm[i].st_bot;
levels[i].st_new1 <== sm[i].st_new1; levels[i].st_new1 <== sm[i].st_new1;

View File

@@ -11,10 +11,9 @@ Outputs according to the state.
State oldRoot newRoot State oldRoot newRoot
===== ======= ======= ===== ======= =======
top H'(oldChild, sibling) H'(newChild, sibling) top H'(oldChild, sibling) H'(newChild, sibling)
old1 old1leaf H'(newChild, 0)
old0 0 new1leaf old0 0 new1leaf
bot 0 H'(newChild, 0) bot old1leaf H'(newChild, 0)
new1 0 H'(new1leaf, old1leaf) new1 old1leaf H'(new1leaf, old1leaf)
na 0 0 na 0 0
upd old1leaf new1leaf upd old1leaf new1leaf
@@ -26,7 +25,6 @@ H' is the Hash function with the inputs shifted acordingly.
template SMTInsertLevel() { template SMTInsertLevel() {
signal input st_top; signal input st_top;
signal input st_old1;
signal input st_old0; signal input st_old0;
signal input st_bot; signal input st_bot;
signal input st_new1; signal input st_new1;
@@ -59,12 +57,12 @@ template SMTInsertLevel() {
oldProofHash.L <== oldSwitcher.outL; oldProofHash.L <== oldSwitcher.outL;
oldProofHash.R <== oldSwitcher.outR; oldProofHash.R <== oldSwitcher.outR;
aux[0] <== old1leaf * (st_old1 + st_upd); aux[0] <== old1leaf * (st_bot + st_new1 + st_upd);
oldRoot <== aux[0] + oldProofHash.out * st_top; oldRoot <== aux[0] + oldProofHash.out * st_top;
// New side // New side
aux[1] <== newChild * ( st_top + st_old1 + st_bot); aux[1] <== newChild * ( st_top + st_bot);
newSwitcher.L <== aux[1] + new1leaf*st_new1; newSwitcher.L <== aux[1] + new1leaf*st_new1;
aux[2] <== sibling*st_top; aux[2] <== sibling*st_top;
@@ -74,6 +72,6 @@ template SMTInsertLevel() {
newProofHash.L <== newSwitcher.outL; newProofHash.L <== newSwitcher.outL;
newProofHash.R <== newSwitcher.outR; newProofHash.R <== newSwitcher.outR;
aux[3] <== newProofHash.out * (st_top + st_old1 + st_bot + st_new1); aux[3] <== newProofHash.out * (st_top + st_bot + st_new1);
newRoot <== aux[3] + new1leaf * (st_old0 + st_upd); newRoot <== aux[3] + new1leaf * (st_old0 + st_upd);
} }

View File

@@ -31,14 +31,13 @@ fnc[0] fnc[1]
1 1 DELETE 1 1 DELETE
########### ###########
# # # #
┌────────────────────────────▶# upd #─────────────────────┐ ┌────────────────────────────▶# upd #─────────────────────┐
│ ## ## │ │ ## ## │
│ ######### │ │ ######### │
levIns=1 │ │ levIns=1 │ │
fnc[0]=0 │ │ any fnc[0]=0 │ │ any
│ │ │ │
│ │ │ │
│ │ │ │
@@ -51,18 +50,18 @@ fnc[0] fnc[1]
│ ########### │ │ ########### │ │ ########### │ │ ########### │
│ # # ────────────┘ └────────▶# #│ │ # # ────────────┘ └────────▶# #│
└──# top # # na # └──# top # # na #
## ## ──── ┌──▶## ## ## ## ───────────────────┐ levIns=1 ┌──▶## ##
######### │ ######### ######### is0=0 │ #########
│ │ │ fnc[0]=1
########### ########### │ any │ xor=1 ########### │ any
levIns=1 │ # # xor=1 # # │ └──────────────────▶# # │
is0=0 └───▶# old1 #─────────────▶# new1 #──┘ # new1 #──┘
fnc[0]=1 ## ## ## ## ## ##
#########│ ######### └────────────────────────────────┐ #########
levIns=1 │ ▲
└───┐ ┌─────┘ is0=0 ┌─────┘
xor=0 │ ###########│ xor=1 fnc[0]=1 │ ###########│ xor=1
│ # # xor=0 │ # #
▼# btn # ▼# btn #
## ## ## ##
#########◀───────┐ #########◀───────┐
@@ -81,7 +80,6 @@ template SMTInsertSM() {
signal input prev_top; signal input prev_top;
signal input prev_old0; signal input prev_old0;
signal input prev_old1;
signal input prev_bot; signal input prev_bot;
signal input prev_new1; signal input prev_new1;
signal input prev_na; signal input prev_na;
@@ -89,7 +87,6 @@ template SMTInsertSM() {
signal output st_top; signal output st_top;
signal output st_old0; signal output st_old0;
signal output st_old1;
signal output st_bot; signal output st_bot;
signal output st_new1; signal output st_new1;
signal output st_na; signal output st_na;
@@ -98,21 +95,51 @@ template SMTInsertSM() {
signal aux1; signal aux1;
signal aux2; signal aux2;
aux1 <== prev_top * levIns; aux1 <== prev_top * levIns;
aux2 <== aux1*is0; aux2 <== aux1*fnc[0]; // prev_top * levIns * fnc[0]
st_top <== prev_top - aux1 // prev_top * (1-levIns) =
// = prev_top - aux1; // st_top = prev_top*(1-levIns)
st_old0 <== aux2 * fnc[0]; // (prev_top * levIns * is0)*fnc[0] = aux2 // = + prev_top
st_old1 <== (aux1 - aux2)*fnc[0]; // (prev_top * levIns * (1-is0))*fnc[0] = // - prev_top * levIns = aux1
// = (aux1 * (1-is0))*fnc[0] =
// = (aux1 - aux2) * fnc[0] st_top <== prev_top - aux1;
st_new1 <== (prev_old1 + prev_bot)*xor // prev_old1*xor + prev_bot*xor =
// = (prev_old1 + prev_bot)*xor; // st_old0 = prev_top * levIns * is0 * fnc[0]
st_bot <== -st_new1 + prev_old1 + prev_bot // prev_old1*(1-xor) + prev_bot*(1-xor) = // = + prev_top * levIns * is0 * fnc[0] = aux2 * is0
// = - prev_old1*xor -prev_bot*xor + prev_old1 + prev_bot =
// = -st_new1 + prev_old1 + prev_bot st_old0 <== aux2 * is0; // prev_top * levIns * is0 * fnc[0]
// st_new1 = prev_top * levIns * (1-is0)*fnc[0] * xor + prev_bot*xor =
// = + prev_top * levIns * fnc[0] * xor = aux2 * xor
// - prev_top * levIns * is0 * fnc[0] * xor = st_old0 * xor
// + prev_bot * xor = prev_bot * xor
st_new1 <== (aux2 - st_old0 + prev_bot)*xor;
// st_bot = prev_top * levIns * (1-is0)*fnc[0] * (1-xor) + prev_bot*(1-xor);
// = + prev_top * levIns * fnc[0]
// - prev_top * levIns * is0 * fnc[0]
// - prev_top * levIns * fnc[0] * xor
// + prev_top * levIns * is0 * fnc[0] * xor
// + prev_bot
// - prev_bot * xor
st_bot <== (1-xor) * (aux2 - st_old0 + prev_bot)
// st_upd = prev_top * (1-fnc[0]) *levIns;
// = + prev_top * levIns
// - prev_top * levIns * fnc[0]
st_upd <== aux1 - aux2
// st_na = prev_new1 + prev_old0 + prev_na + prev_upd;
// = + prev_new1
// + prev_old0
// + prev_na
// + prev_upd
st_na <== prev_new1 + prev_old0 + prev_na + prev_upd; st_na <== prev_new1 + prev_old0 + prev_na + prev_upd;
st_upd <== aux1*(1-fnc[0]); // prev_top*levIns*(1-fnc[0]) =
// = aux1 * (1-fnc[0])
} }

View File

@@ -108,8 +108,8 @@ describe("SMT test", function () {
const tree6 = await smt.newMemEmptyTrie(); const tree6 = await smt.newMemEmptyTrie();
await testInsert(tree1,keys[0],values[0], circuit); await testInsert(tree1,keys[0],values[0], circuit);
await testInsert(tree1,keys[1],values[1], circuit, console.log); await testInsert(tree1,keys[1],values[1], circuit);
/* await testInsert(tree1,keys[2],values[2], circuit); await testInsert(tree1,keys[2],values[2], circuit);
await testInsert(tree2,keys[0],values[0], circuit); await testInsert(tree2,keys[0],values[0], circuit);
await testInsert(tree2,keys[2],values[2], circuit); await testInsert(tree2,keys[2],values[2], circuit);
@@ -153,7 +153,7 @@ describe("SMT test", function () {
await testDelete(tree3, keys[1], circuit); await testDelete(tree3, keys[1], circuit);
await testDelete(tree4, keys[1], circuit); await testDelete(tree4, keys[1], circuit);
await testDelete(tree5, keys[0], circuit); await testDelete(tree5, keys[0], circuit);
await testDelete(tree6, keys[0], circuit); */ await testDelete(tree6, keys[0], circuit);
}); });
it("Should match a NOp with random vals", async () => { it("Should match a NOp with random vals", async () => {