2019-07-12 18:34:25 +02:00
|
|
|
const fs = require('fs');
|
2019-07-12 22:52:10 +02:00
|
|
|
const assert = require('assert');
|
2019-07-12 18:34:25 +02:00
|
|
|
const circom = require("circom");
|
|
|
|
const snarkjs = require("snarkjs");
|
|
|
|
const circomlib = require('circomlib');
|
|
|
|
const bigInt = snarkjs.bigInt;
|
2019-07-12 21:11:37 +02:00
|
|
|
const stringifyBigInts = require("websnark/tools/stringifybigint").stringifyBigInts;
|
|
|
|
const unstringifyBigInts = require("websnark/tools/stringifybigint").unstringifyBigInts;
|
2019-07-12 18:34:25 +02:00
|
|
|
const utils = require("./utils");
|
|
|
|
const merkleTree = require('../lib/MerkleTree');
|
|
|
|
const jsStorage = require("../lib/Storage");
|
|
|
|
const mimcHasher = require("../lib/MiMC");
|
|
|
|
|
|
|
|
function generateDeposit() {
|
|
|
|
let deposit = {
|
|
|
|
secret: utils.rbigint(31),
|
|
|
|
nullifier: utils.rbigint(31),
|
|
|
|
};
|
|
|
|
const preimage = Buffer.concat([deposit.nullifier.leInt2Buff(32), deposit.secret.leInt2Buff(32)]);
|
|
|
|
deposit.commitment = utils.pedersenHash(preimage);
|
|
|
|
return deposit;
|
|
|
|
}
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
const dep1 = generateDeposit();
|
|
|
|
const dep2 = generateDeposit();
|
|
|
|
const dep3 = generateDeposit();
|
|
|
|
|
|
|
|
const tree = new merkleTree("", new jsStorage(), new mimcHasher(), 16, 0);
|
|
|
|
|
|
|
|
await tree.insert(dep1.commitment);
|
|
|
|
await tree.insert(dep2.commitment);
|
|
|
|
await tree.insert(dep3.commitment);
|
|
|
|
|
|
|
|
const {root, path_elements, path_index} = await tree.path(1);
|
|
|
|
|
|
|
|
// Circuit input
|
2019-07-12 22:52:10 +02:00
|
|
|
const input = {
|
2019-07-12 18:34:25 +02:00
|
|
|
// public
|
|
|
|
root: root,
|
|
|
|
nullifier: dep2.nullifier,
|
|
|
|
receiver: utils.rbigint(20),
|
|
|
|
fee: bigInt(1e17),
|
|
|
|
|
|
|
|
// private
|
|
|
|
secret: dep2.secret,
|
|
|
|
pathElements: path_elements,
|
|
|
|
pathIndex: path_index,
|
2019-07-12 22:52:10 +02:00
|
|
|
};
|
2019-07-12 18:34:25 +02:00
|
|
|
|
|
|
|
console.log("Input:\n", input);
|
|
|
|
console.time("Time");
|
|
|
|
const proof = await utils.snarkProof(input);
|
|
|
|
console.log("Proof:\n", proof);
|
|
|
|
console.timeEnd("Time");
|
2019-07-12 22:52:10 +02:00
|
|
|
|
|
|
|
const verify = await utils.snarkVerify(proof);
|
|
|
|
assert(verify);
|
|
|
|
|
|
|
|
// try to cheat with recipient
|
|
|
|
proof.publicSignals[2] = '0x000000000000000000000000000000000000000000000000000000000000beef';
|
|
|
|
const verifyScam = await utils.snarkVerify(proof);
|
|
|
|
assert(!verifyScam);
|
|
|
|
|
|
|
|
console.log("Done.");
|
2019-07-12 18:34:25 +02:00
|
|
|
})();
|