mirror of
https://github.com/arnaucube/miksi-core.git
synced 2026-02-06 19:16:40 +01:00
Add miksi js lib for build witness calculation
This commit is contained in:
@@ -37,6 +37,8 @@ compile_and_ts() {
|
||||
sed -i "s/contract Verifier/contract ${CONTRACT}Verifier/g" ${CIRCUIT}-verifier.sol
|
||||
sed -i "s/Pairing/${CONTRACT}Pairing/g" ${CIRCUIT}-verifier.sol
|
||||
cp ${CIRCUIT}-verifier.sol ../contracts/
|
||||
|
||||
node ../node_modules/wasmsnark/tools/buildpkey.js -i ${CIRCUIT}-proving_key.json -o ${CIRCUIT}-proving_key.bin
|
||||
}
|
||||
|
||||
CIRCUIT="deposit"
|
||||
|
||||
76368
dist/miksi-browser.js
vendored
Normal file
76368
dist/miksi-browser.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
dist/miksi.d.ts
vendored
Normal file
11
dist/miksi.d.ts
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
declare const fs: any;
|
||||
declare const groth: any;
|
||||
declare const stringifyBigInts: any, unstringifyBigInts: any;
|
||||
declare const WitnessCalculatorBuilder: any;
|
||||
declare const circomlib: any;
|
||||
declare const smt: any;
|
||||
declare const Web3: any;
|
||||
declare const nLevels = 5;
|
||||
declare const coinCode = "0";
|
||||
declare const ethAmount = "1";
|
||||
declare const amount: any;
|
||||
67
dist/miksi.js
vendored
Normal file
67
dist/miksi.js
vendored
Normal file
@@ -0,0 +1,67 @@
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
const fs = require("fs");
|
||||
const { groth } = require('snarkjs');
|
||||
const { stringifyBigInts, unstringifyBigInts } = require('ffjavascript').utils;
|
||||
const WitnessCalculatorBuilder = require("circom_runtime").WitnessCalculatorBuilder;
|
||||
const circomlib = require("circomlib");
|
||||
const smt = require("circomlib").smt;
|
||||
const Web3 = require("web3");
|
||||
const nLevels = 5;
|
||||
const coinCode = "0"; // refearing to ETH
|
||||
const ethAmount = '1';
|
||||
const amount = Web3.utils.toWei(ethAmount, 'ether');
|
||||
exports.calcWitness = (wasm, secret, nullifier, commitments) => __awaiter(this, void 0, void 0, function* () {
|
||||
const poseidon = circomlib.poseidon.createHash(6, 8, 57);
|
||||
const commitment = poseidon([coinCode, amount, secret, nullifier]).toString();
|
||||
let tree = yield smt.newMemEmptyTrie();
|
||||
yield tree.insert(1, 0);
|
||||
// old root
|
||||
const rootOld = tree.root;
|
||||
const resOld = yield tree.find(commitment);
|
||||
if (resOld.found) {
|
||||
console.error("leaf expect to not exist but exists");
|
||||
}
|
||||
let siblingsOld = resOld.siblings;
|
||||
while (siblingsOld.length < nLevels) {
|
||||
siblingsOld.push("0");
|
||||
}
|
||||
;
|
||||
yield tree.insert(commitment, 0);
|
||||
// new root
|
||||
const rootNew = tree.root;
|
||||
const resNew = yield tree.find(commitment);
|
||||
if (!resNew.found) {
|
||||
console.error("leaf expect to exist but not exists");
|
||||
}
|
||||
let siblingsNew = resNew.siblings;
|
||||
while (siblingsNew.length < nLevels) {
|
||||
siblingsNew.push("0");
|
||||
}
|
||||
;
|
||||
// calculate witness
|
||||
const input = unstringifyBigInts({
|
||||
"coinCode": coinCode,
|
||||
"amount": amount,
|
||||
"secret": secret,
|
||||
"nullifier": nullifier,
|
||||
"siblingsOld": siblingsOld,
|
||||
"siblingsNew": siblingsNew,
|
||||
"rootOld": rootOld,
|
||||
"rootNew": rootNew,
|
||||
"commitment": commitment
|
||||
});
|
||||
const options = {};
|
||||
const wc = yield WitnessCalculatorBuilder(wasm, options);
|
||||
const w = yield wc.calculateWitness(input);
|
||||
const witness = unstringifyBigInts(stringifyBigInts(w));
|
||||
return witness;
|
||||
});
|
||||
//# sourceMappingURL=miksi.js.map
|
||||
1
dist/miksi.js.map
vendored
Normal file
1
dist/miksi.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"miksi.js","sourceRoot":"","sources":["../src/miksi.ts"],"names":[],"mappings":"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"}
|
||||
967
package-lock.json
generated
967
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
10
package.json
10
package.json
@@ -2,10 +2,13 @@
|
||||
"name": "miksi-core",
|
||||
"version": "0.0.1",
|
||||
"description": "miksi-core",
|
||||
"main": "index.js",
|
||||
"main": "src/miksi.ts",
|
||||
"scripts": {
|
||||
"clean": "rm -fR dist",
|
||||
"build": "npm run clean && ./node_modules/.bin/tsc --strictNullChecks",
|
||||
"aaabrowserify": "browserify src/miksi.js -o dist/miksi-browser.js --standalone miksi --ignore-missing",
|
||||
"browserify": "browserify src/miksi.ts --standalone miksi > dist/miksi-browser.js",
|
||||
"test": "./node_modules/.bin/mocha -r ts-node/register test/*.ts",
|
||||
"test-circuits": "./node_modules/.bin/mocha -r ts-node/register test/circuits/*.ts",
|
||||
"test-sc": "truffle test test/contracts/*.ts",
|
||||
"truffle": "truffle"
|
||||
@@ -30,6 +33,9 @@
|
||||
"ts-node": "^7.0.1",
|
||||
"tslint": "^5.18.0",
|
||||
"typescript": "^3.5.3",
|
||||
"web3": "^1.0.0-beta.30"
|
||||
"web3": "^1.0.0-beta.30",
|
||||
"wasmsnark": "0.0.10",
|
||||
"browserify": "^16.5.0",
|
||||
"circom_runtime": "0.0.6"
|
||||
}
|
||||
}
|
||||
|
||||
89
src/miksi.ts
Normal file
89
src/miksi.ts
Normal file
@@ -0,0 +1,89 @@
|
||||
const fs = require("fs");
|
||||
const bigInt = require("big-integer");
|
||||
const { groth } = require('snarkjs');
|
||||
const { stringifyBigInts, unstringifyBigInts } = require('ffjavascript').utils;
|
||||
const WitnessCalculatorBuilder = require("circom_runtime").WitnessCalculatorBuilder;
|
||||
const circomlib = require("circomlib");
|
||||
const smt = require("circomlib").smt;
|
||||
const Web3 = require("web3");
|
||||
// const buildBn128 = require("wasmsnark").buildBn128;
|
||||
|
||||
|
||||
const nLevels = 5;
|
||||
const coinCode = "0"; // refearing to ETH
|
||||
const ethAmount = '1';
|
||||
const amount = Web3.utils.toWei(ethAmount, 'ether');
|
||||
|
||||
// let bn128;
|
||||
//
|
||||
// exports.init = async () => {
|
||||
// bn128 = await buildBn128();
|
||||
// }
|
||||
|
||||
exports.calcWitness = async (wasm, secret, nullifier, commitments) => {
|
||||
const poseidon = circomlib.poseidon.createHash(6, 8, 57);
|
||||
const commitment = poseidon([coinCode, amount, secret, nullifier]).toString();
|
||||
|
||||
let tree = await smt.newMemEmptyTrie();
|
||||
await tree.insert(1, 0);
|
||||
|
||||
// old root
|
||||
const rootOld = tree.root;
|
||||
const resOld = await tree.find(commitment);
|
||||
if (resOld.found) {
|
||||
console.error("leaf expect to not exist but exists");
|
||||
}
|
||||
let siblingsOld = resOld.siblings;
|
||||
while (siblingsOld.length < nLevels) {
|
||||
siblingsOld.push("0");
|
||||
};
|
||||
|
||||
await tree.insert(commitment, 0);
|
||||
|
||||
// new root
|
||||
const rootNew = tree.root;
|
||||
const resNew = await tree.find(commitment);
|
||||
if (!resNew.found) {
|
||||
console.error("leaf expect to exist but not exists");
|
||||
}
|
||||
let siblingsNew = resNew.siblings;
|
||||
while (siblingsNew.length < nLevels) {
|
||||
siblingsNew.push("0");
|
||||
};
|
||||
|
||||
// calculate witness
|
||||
const input = unstringifyBigInts({
|
||||
"coinCode": coinCode,
|
||||
"amount": amount,
|
||||
"secret": secret,
|
||||
"nullifier": nullifier,
|
||||
"siblingsOld": siblingsOld,
|
||||
"siblingsNew": siblingsNew,
|
||||
"rootOld": rootOld,
|
||||
"rootNew": rootNew,
|
||||
"commitment": commitment
|
||||
});
|
||||
console.log("input", input);
|
||||
// const options = {};
|
||||
// const wc = await WitnessCalculatorBuilder(wasm, options);
|
||||
|
||||
const wc = await WitnessCalculatorBuilder(wasm);
|
||||
|
||||
const witness = await wc.calculateWitness(input, {sanityCheck: true});
|
||||
|
||||
const wBuff = Buffer.allocUnsafe(witness.length*32);
|
||||
|
||||
for (let i=0; i<witness.length; i++) {
|
||||
for (let j=0; j<8; j++) {
|
||||
const bi = witness[i];
|
||||
const v = bigInt(bi).shiftRight(j*32).and(0xFFFFFFFF).toJSNumber();
|
||||
wBuff.writeUInt32LE(v, i*32 + j*4, 4)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// const witness = unstringifyBigInts(stringifyBigInts(w));
|
||||
return wBuff;
|
||||
}
|
||||
|
||||
|
||||
26
test/miksi.test.ts
Normal file
26
test/miksi.test.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
const fs = require("fs");
|
||||
|
||||
const miksi = require("../src/miksi.ts");
|
||||
|
||||
export {};
|
||||
|
||||
describe("deposit test", function () {
|
||||
this.timeout(200000);
|
||||
|
||||
it("Test Deposit", async () => {
|
||||
const secret = "1234567890";
|
||||
const nullifier = "567891234";
|
||||
const commitments = [];
|
||||
|
||||
const wasm = await fs.promises.readFile("./build/deposit.wasm");
|
||||
console.log("w", wasm.length);
|
||||
|
||||
const witness = await miksi.calcWitness(wasm, secret, nullifier, commitments);
|
||||
// console.log("w", witness);
|
||||
|
||||
|
||||
// const pk = await fs.promises.readFile("./build/deposit-proving_key.bin");
|
||||
// const proof = await miksi.calcProof(witness, pk);
|
||||
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user