@xorddotcom/shield
Version:
p align="center" > <img src="https://xord.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F283b98b7-fdae-4e5a-acaf-248242084e4a%2FICON.png?table=block&id=5306223c-a4f7-45d1-9f54-b9a5f4004cd6&spaceId=49976899-64a1-40f
246 lines • 11.6 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.compile = void 0;
/* eslint-disable @typescript-eslint/prefer-for-of */
/* eslint-disable @typescript-eslint/no-unused-vars */
const chalk_1 = __importDefault(require("chalk"));
const enquirer_1 = require("enquirer");
const ora_1 = __importDefault(require("ora"));
const fs_extra_1 = __importDefault(require("fs-extra"));
// @ts-ignore
const circom2_1 = require("circom2");
const fs = __importStar(require("fs/promises"));
const logger_1 = require("../../../utils/logger");
const snarkjs_1 = require("../../../utils/snarkjs");
const wasm_1 = require("../../../utils/wasm");
const utils_1 = require("../../../utils/utils");
var Protocol;
(function (Protocol) {
Protocol["GROTH16"] = "groth16";
Protocol["PLONK"] = "plonk";
})(Protocol || (Protocol = {}));
const compile = async (options) => {
try {
let userConfig;
let circuits;
const defaultConfig = {
solidity: "^0.8.0",
circom: {
inputBasePath: "/circuits",
outputBasePath: "/build",
ptau: "",
circuits: [],
},
};
try {
userConfig = require(`${process.cwd()}/shield.config.js`);
circuits = userConfig.circom.circuits;
if (options.circuit) {
circuits = circuits.filter((circuit) => {
return circuit.name === options.circuit;
});
}
if (!userConfig.circom) {
(0, logger_1.log)("unable to locate circom user defined config in file shield.config.js.", "error");
process.exit(1);
}
else if (!userConfig.circom.ptau) {
(0, logger_1.log)("please define the ptau file name in file shield.config.js.", "error");
process.exit(1);
}
else if (!circuits.length) {
(0, logger_1.log)("please define the circuit details for compilation of circuits in file shield.config.js.", "error");
process.exit(1);
}
else {
for (let i = 0; i < circuits.length; i++) {
if (!circuits[i].name) {
(0, logger_1.log)("please define the circuit name for compilation of the circuit in file shield.config.js.", "error");
process.exit(1);
}
if (!circuits[i].protocol) {
circuits[i].protocol = Protocol.GROTH16;
}
if (!circuits[i].zkey) {
circuits[i].zkey = circuits[i].name;
}
if (!circuits[i].circuit) {
circuits[i].circuit = `${circuits[i].name}.circom`;
}
}
}
}
catch (e) {
(0, logger_1.log)("unable to locate shield config file.", "error");
process.exit(1);
}
const finalConfig = {
solidity: userConfig.solidity
? userConfig.solidity
: defaultConfig.solidity,
circom: {
inputBasePath: userConfig.circom.inputBasePath
? userConfig.circom.inputBasePath
: defaultConfig.circom.inputBasePath,
outputBasePath: userConfig.circom.outputBasePath
? userConfig.circom.outputBasePath
: defaultConfig.circom.outputBasePath,
ptau: userConfig.circom.ptau,
circuits,
},
};
const contributions = {};
for (let i = 0; i < finalConfig.circom.circuits.length; i++) {
try {
fs_extra_1.default.readFileSync(`${process.cwd()}${finalConfig.circom.inputBasePath}/${circuits[i].name}.circom`, {
encoding: "utf-8",
});
}
catch (e) {
(0, logger_1.log)(`unable to read file ${process.cwd()}${finalConfig.circom.inputBasePath}/${circuits[i].name}.circom`, "warning");
continue;
}
if (finalConfig.circom.circuits[i].protocol === "groth16") {
await (0, enquirer_1.prompt)([
{
type: "input",
name: "contributerName",
message: `Please enter the contribution of ${finalConfig.circom.circuits[i].name} circuit for groth16 setup?`,
initial: "1st Contributor Name",
result: async (value) => {
contributions[`${finalConfig.circom.circuits[i].name}`] = {
contributerName: value.toLowerCase(),
randomEntropy: "random text",
};
return value.toLowerCase();
},
},
{
type: "input",
name: "entropy",
message: `Please enter the entropy of ${finalConfig.circom.circuits[i].name} for groth16 setup?`,
initial: "random text",
result: async (value) => {
contributions[`${finalConfig.circom.circuits[i].name}`].randomEntropy = value.toLowerCase();
return value.toLowerCase();
},
},
]);
}
}
const wasmFs = await (0, wasm_1.initFS)();
const outputBasePath = `${process.cwd()}${finalConfig.circom.outputBasePath}`;
await (0, utils_1.getEmptyDirByPath)(outputBasePath, 0);
for (let i = 0; i < finalConfig.circom.circuits.length; i++) {
const circuitName = finalConfig.circom.circuits[i].name;
// Paths
const circuitPath = `${process.cwd()}${finalConfig.circom.inputBasePath}/${finalConfig.circom.circuits[i].circuit}`;
const ptauPath = `${outputBasePath}/${finalConfig.circom.ptau}`;
const r1csPath = `${outputBasePath}/${circuitName}/${circuitName}.r1cs`;
const zKeyPath = {
zero: `${outputBasePath}/${circuitName}/circuit_0000.zkey`,
final: `${outputBasePath}/${circuitName}/${finalConfig.circom.circuits[i].zkey}`,
};
const vKeyPath = `${outputBasePath}/${circuitName}/verification_key.json`;
const solVerifierPath = `${process.cwd()}/contracts/${circuitName}_Verifier.sol`;
const wasmPath = require.resolve("circom2/circom.wasm");
await (0, utils_1.getEmptyDirByPath)(`${outputBasePath}/${circuitName}`, 0);
if (await (0, utils_1.fileExists)(circuitPath)) {
const spinner = (0, ora_1.default)(chalk_1.default.greenBright(`Compiling ${circuitName}\n`)).start();
const circom = new circom2_1.CircomRunner({
args: [
circuitPath,
"--r1cs",
"--wat",
"--wasm",
"--sym",
"-o",
`${outputBasePath}/${circuitName}`,
],
env: {},
preopens: {
"/": "/",
},
bindings: {
...circom2_1.bindings,
fs: wasmFs,
},
returnOnExit: true,
});
const circomWasm = await fs.readFile(wasmPath);
try {
// step 1:
await circom.execute(circomWasm);
}
catch (error) {
if (`${error}`.includes("Include not found:")) {
(0, logger_1.log)(`Unable to compile ${circuitName}, Make sure you have node_modules and circomlib installed and try again`, "error");
(0, logger_1.log)(`${error}`, "error");
process.exit(1);
}
if (`${error}` !== "RuntimeError: unreachable") {
(0, logger_1.log)(`Unable to compile ${circuitName}`, "error");
(0, logger_1.log)(`${error}`, "error");
process.exit(1);
}
}
// step 2:
await snarkjs_1.WrappedSnarkJs.util.downloadPtau(ptauPath, finalConfig.circom.ptau);
if (finalConfig.circom.circuits[i].protocol === "groth16") {
// step 3 (b):
await snarkjs_1.WrappedSnarkJs.groth16.setup(r1csPath, ptauPath, zKeyPath.zero);
const contribution = contributions[finalConfig.circom.circuits[i].name];
// step 4:
await snarkjs_1.WrappedSnarkJs.groth16.contribute(zKeyPath.zero, zKeyPath.final, contribution ? contribution.contributerName : "", contribution ? contribution.randomEntropy : "");
}
else {
// step 3 (b):
await snarkjs_1.WrappedSnarkJs.plonk.setup(r1csPath, ptauPath, zKeyPath.final);
}
// step 5:
await snarkjs_1.WrappedSnarkJs.util.generateVkey(zKeyPath.final, vKeyPath);
// step 6:
await snarkjs_1.WrappedSnarkJs.util.generateSolidityVerifier(zKeyPath.final, solVerifierPath);
// step 7:
await (0, utils_1.bumpSolidityVersion)(finalConfig.solidity ? finalConfig.solidity : "^0.8.0", circuitName, finalConfig.circom.circuits[i].protocol);
spinner.succeed(chalk_1.default.greenBright(`${circuitName} compiled.`));
}
else {
(0, logger_1.log)(`unable to locate ${finalConfig.circom.circuits[i].circuit} at dir ${circuitPath} user defined config in file shield.config.js.`, "error");
}
}
process.exit(0);
}
catch (e) {
(0, logger_1.log)(e.message, "error");
process.exit(0);
}
};
exports.compile = compile;
//# sourceMappingURL=compile.js.map