Sparse Merkle tree working
This commit is contained in:
parent
09f36d1e4d
commit
6d6558370f
@ -46,13 +46,6 @@ template SMTVerifier(nLevels) {
|
|||||||
for (var i=0; i<nLevels; i++) smtLevIns.siblings[i] <== siblings[i];
|
for (var i=0; i<nLevels; i++) smtLevIns.siblings[i] <== siblings[i];
|
||||||
smtLevIns.enabled <== 1;
|
smtLevIns.enabled <== 1;
|
||||||
|
|
||||||
component xors[nLevels];
|
|
||||||
for (var i=0; i<nLevels; i++) {
|
|
||||||
xors[i] = XOR();
|
|
||||||
xors[i].a <== n2bOld.out[i];
|
|
||||||
xors[i].b <== n2bNew.out[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
component sm[nLevels];
|
component sm[nLevels];
|
||||||
for (var i=0; i<nLevels; i++) {
|
for (var i=0; i<nLevels; i++) {
|
||||||
sm[i] = SMTVerifierSM();
|
sm[i] = SMTVerifierSM();
|
||||||
@ -70,11 +63,10 @@ template SMTVerifier(nLevels) {
|
|||||||
sm[i].prev_na <== sm[i-1].st_na;
|
sm[i].prev_na <== sm[i-1].st_na;
|
||||||
}
|
}
|
||||||
sm[i].is0 <== isOld0;
|
sm[i].is0 <== isOld0;
|
||||||
sm[i].xor <== xors[i].out;
|
|
||||||
sm[i].fnc <== fnc;
|
sm[i].fnc <== fnc;
|
||||||
sm[i].levIns <== smtLevIns.levIns[i];
|
sm[i].levIns <== smtLevIns.levIns[i];
|
||||||
}
|
}
|
||||||
// sm[nLevels-1].st_na === 1;
|
sm[nLevels-1].st_na === 1;
|
||||||
|
|
||||||
component levels[nLevels];
|
component levels[nLevels];
|
||||||
for (var i=nLevels-1; i != -1; i--) {
|
for (var i=nLevels-1; i != -1; i--) {
|
||||||
|
@ -15,38 +15,32 @@ err state is not a state itself. It's a lack of state.
|
|||||||
|
|
||||||
The end of the last level will have to be `na`
|
The end of the last level will have to be `na`
|
||||||
|
|
||||||
levIns=0 ###########
|
levIns=0 any
|
||||||
xor=1 # #
|
┌────┐ ┌────┐
|
||||||
fnc=1 ┌──────────▶# err #
|
│ │ │ │
|
||||||
│ ## ##
|
│ ▼ levIns=1 ▼ │
|
||||||
levIns=0 │ #########
|
│ ########### is0=1 ########### ########### │
|
||||||
xor=0 || fnc=0 │ any
|
│ # # fnc=1 # # any # # │
|
||||||
┌────┐ │ ┌────┐
|
└──# top # ─────────────────────▶# i0 #───────────────▶# na #──┘
|
||||||
│ │ │ │ │
|
## ## ──────────┐ ## ## ┌───────▶## ##
|
||||||
│ ▼ │ levIns=1 ▼ │
|
########─────────────┐│ ######### │┌────────▶#########
|
||||||
│ ########### │ is0=1 ########### ########### │
|
││ levIns=1 ││
|
||||||
│ # # ───────────┘ fnc=1 # # any # # │
|
││ is0=0 ########### ││
|
||||||
└──# top # ─────────────────────▶# i0 #───────────────▶# na #──┘
|
││ fnc=1 # # any│
|
||||||
## ## ──────────┐ ## ## ┌───────▶## ##
|
│└──────────▶ # iold #────────┘│
|
||||||
########─────────────┐│ ######### │┌────────▶#########
|
│ ## ## │
|
||||||
││ levIns=1 ││
|
│ ######### │
|
||||||
││ is0=0 ########### ││
|
│ │
|
||||||
││ fnc=1 # # any│
|
│ levIns=1 ########### │
|
||||||
│└──────────▶ # iold #────────┘│
|
│ fnc=0 # # any
|
||||||
│ ## ## │
|
└────────────▶# inew #─────────┘
|
||||||
│ ######### │
|
## ##
|
||||||
│ │
|
#########
|
||||||
│ levIns=1 ########### │
|
|
||||||
│ fnc=0 # # any
|
|
||||||
└────────────▶# inew #─────────┘
|
|
||||||
## ##
|
|
||||||
#########
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
template SMTVerifierSM() {
|
template SMTVerifierSM() {
|
||||||
signal input xor;
|
|
||||||
signal input is0;
|
signal input is0;
|
||||||
signal input levIns;
|
signal input levIns;
|
||||||
signal input fnc;
|
signal input fnc;
|
||||||
@ -65,19 +59,14 @@ template SMTVerifierSM() {
|
|||||||
|
|
||||||
signal prev_top_lev_ins;
|
signal prev_top_lev_ins;
|
||||||
signal prev_top_lev_ins_fnc;
|
signal prev_top_lev_ins_fnc;
|
||||||
signal xor_fnc;
|
|
||||||
|
|
||||||
prev_top_lev_ins <== prev_top * levIns;
|
prev_top_lev_ins <== prev_top * levIns;
|
||||||
prev_top_lev_ins_fnc <== prev_top_lev_ins*fnc; // prev_top * levIns * fnc
|
prev_top_lev_ins_fnc <== prev_top_lev_ins*fnc; // prev_top * levIns * fnc
|
||||||
xor_fnc <== xor*fnc;
|
|
||||||
|
|
||||||
|
// st_top = prev_top * (1-levIns)
|
||||||
// st_top = prev_top * (1-levIns) * (1 - xor*fnc)
|
|
||||||
// = + prev_top
|
// = + prev_top
|
||||||
// - prev_top * levIns
|
// - prev_top * levIns
|
||||||
// - prev_top * xor * fnc
|
st_top <== prev_top - prev_top_lev_ins;
|
||||||
// + prev_top * levIns * xor * fnc
|
|
||||||
st_top <== (prev_top - prev_top_lev_ins)*(1-xor_fnc);
|
|
||||||
|
|
||||||
// st_inew = prev_top * levIns * (1-fnc)
|
// st_inew = prev_top * levIns * (1-fnc)
|
||||||
// = + prev_top * levIns
|
// = + prev_top * levIns
|
||||||
|
Binary file not shown.
@ -7,7 +7,7 @@
|
|||||||
"test": "test"
|
"test": "test"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "mocha"
|
"test": "mocha --max-old-space-size=4000"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"pedersen",
|
"pedersen",
|
||||||
|
@ -51,7 +51,7 @@ async function testExclusion(tree, key, circuit) {
|
|||||||
isOld0: res.isOld0 ? 1 : 0,
|
isOld0: res.isOld0 ? 1 : 0,
|
||||||
key: key,
|
key: key,
|
||||||
value: 0
|
value: 0
|
||||||
}, console.log);
|
});
|
||||||
|
|
||||||
assert(circuit.checkWitness(w));
|
assert(circuit.checkWitness(w));
|
||||||
}
|
}
|
||||||
@ -82,13 +82,13 @@ describe("SMT test", function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("Check exclussion in a tree of 3", async () => {
|
it("Check exclussion in a tree of 3", async () => {
|
||||||
// await testExclusion(tree, 0, circuit);
|
await testExclusion(tree, 0, circuit);
|
||||||
await testExclusion(tree, 6, circuit);
|
await testExclusion(tree, 6, circuit);
|
||||||
/* await testExclusion(tree, 9, circuit);
|
await testExclusion(tree, 9, circuit);
|
||||||
await testExclusion(tree, 33, circuit);
|
await testExclusion(tree, 33, circuit);
|
||||||
await testExclusion(tree, 31, circuit);
|
await testExclusion(tree, 31, circuit);
|
||||||
await testExclusion(tree, 16, circuit);
|
await testExclusion(tree, 16, circuit);
|
||||||
await testExclusion(tree, 64, circuit); */
|
await testExclusion(tree, 64, circuit);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user