@ -0,0 +1,23 @@ |
|||||
|
|
||||
|
include "../circuits/smt/smtverifier.circom"; |
||||
|
template SMT(nLevels) { |
||||
|
signal input root; |
||||
|
signal input mtp[nLevels]; |
||||
|
signal input hi; |
||||
|
signal input hv; |
||||
|
|
||||
|
component smtClaimExists = SMTVerifier(nLevels); |
||||
|
smtClaimExists.enabled <== 1; |
||||
|
smtClaimExists.fnc <== 0; |
||||
|
smtClaimExists.root <== root; |
||||
|
for (var i=0; i<nLevels; i++) { |
||||
|
smtClaimExists.siblings[i] <== mtp[i]; |
||||
|
} |
||||
|
smtClaimExists.oldKey <== 0; |
||||
|
smtClaimExists.oldValue <== 0; |
||||
|
smtClaimExists.isOld0 <== 0; |
||||
|
|
||||
|
smtClaimExists.key <== hi; |
||||
|
smtClaimExists.value <== hv; |
||||
|
} |
||||
|
component main = SMT(4); |
@ -0,0 +1,98 @@ |
|||||
|
const path = require("path"); |
||||
|
const snarkjs = require("snarkjs"); |
||||
|
const compiler = require("circom"); |
||||
|
const fs = require("fs") |
||||
|
|
||||
|
const bigInt = snarkjs.bigInt; |
||||
|
const smt = require("../src/smt.js"); |
||||
|
|
||||
|
const circuitSource = `
|
||||
|
include "../circuits/smt/smtverifier.circom"; |
||||
|
template SMT(nLevels) { |
||||
|
signal input root; |
||||
|
signal input mtp[nLevels]; |
||||
|
signal input hi; |
||||
|
signal input hv; |
||||
|
|
||||
|
component smtClaimExists = SMTVerifier(nLevels); |
||||
|
smtClaimExists.enabled <== 1; |
||||
|
smtClaimExists.fnc <== 0; |
||||
|
smtClaimExists.root <== root; |
||||
|
for (var i=0; i<nLevels; i++) { |
||||
|
smtClaimExists.siblings[i] <== mtp[i]; |
||||
|
} |
||||
|
smtClaimExists.oldKey <== 0; |
||||
|
smtClaimExists.oldValue <== 0; |
||||
|
smtClaimExists.isOld0 <== 0; |
||||
|
|
||||
|
smtClaimExists.key <== hi; |
||||
|
smtClaimExists.value <== hv; |
||||
|
} |
||||
|
component main = SMT(4); |
||||
|
`;
|
||||
|
|
||||
|
describe("smt3test", function () { |
||||
|
this.timeout(200000); |
||||
|
|
||||
|
let circuitFileName; |
||||
|
|
||||
|
before( async () => { |
||||
|
circuitFileName = path.join(__dirname, ".", "rawsmt3.circom"); |
||||
|
fs.writeFileSync(circuitFileName,circuitSource); |
||||
|
}); |
||||
|
|
||||
|
const levels = 4; |
||||
|
async function testsmt3(e1, e2) { |
||||
|
let tree = await smt.newMemEmptyTrie(); |
||||
|
|
||||
|
// insert e1, e2
|
||||
|
await tree.insert(e1.hi, e1.hv); |
||||
|
await tree.insert(e2.hi, e2.hv); |
||||
|
|
||||
|
// generate proof for e1
|
||||
|
const findInfo = await tree.find(e1.hi); |
||||
|
const siblings = findInfo.siblings; |
||||
|
while (siblings.length < levels) siblings.push(bigInt(0)); |
||||
|
|
||||
|
const input = { |
||||
|
root: tree.root, |
||||
|
mtp: siblings, |
||||
|
hi: e1.hi, |
||||
|
hv: e1.hv, |
||||
|
}; |
||||
|
|
||||
|
const compiledCircuit = await compiler( |
||||
|
circuitFileName, |
||||
|
{ reduceConstraints: false } |
||||
|
); |
||||
|
|
||||
|
const circuit = new snarkjs.Circuit(compiledCircuit); |
||||
|
const witness = circuit.calculateWitness(input); |
||||
|
circuit.checkWitness(witness); |
||||
|
} |
||||
|
|
||||
|
it("TestSmts", async () => { |
||||
|
|
||||
|
const e1 = { |
||||
|
hi: bigInt("17124152697573569611556136390143205198134245887034837071647643529178599000839"), |
||||
|
hv: bigInt("19650379996168153643111744440707177573540245771926102415571667548153444658179"), |
||||
|
}; |
||||
|
|
||||
|
const e2ok = { |
||||
|
hi: bigInt("16498254692537945203721083102154618658340563351558973077349594629411025251262"), |
||||
|
hv: bigInt("19650379996168153643111744440707177573540245771926102415571667548153444658179"), |
||||
|
}; |
||||
|
|
||||
|
const e2fail = { |
||||
|
hi: bigInt("17195092312975762537892237130737365903429674363577646686847513978084990105579"), |
||||
|
hv: bigInt("19650379996168153643111744440707177573540245771926102415571667548153444658179"), |
||||
|
}; |
||||
|
|
||||
|
console.log("test e1, e2ok"); |
||||
|
await testsmt3(e1, e2ok); |
||||
|
|
||||
|
console.log("test e1, e2fail"); |
||||
|
await testsmt3(e1, e2fail); |
||||
|
}); |
||||
|
}); |
||||
|
|