UNPKG

@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
"use strict"; 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