@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
150 lines • 7.36 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.debug = void 0;
/* eslint-disable @typescript-eslint/prefer-for-of */
/* eslint-disable @typescript-eslint/no-unused-vars */
const chalk_1 = __importDefault(require("chalk"));
const ora_1 = __importDefault(require("ora"));
const logger_1 = require("../../../utils/logger");
const wasm_1 = require("../../../utils/wasm");
const utils_1 = require("../../../utils/utils");
const snarkjs_1 = require("../../../utils/snarkjs");
const checker_1 = require("../../../utils/checker");
// @ts-ignore
const r1csfile_1 = require("r1csfile");
// @ts-ignore
const ffjavascript_1 = require("ffjavascript");
const fs = require("fs/promises");
var Protocol;
(function (Protocol) {
Protocol["GROTH16"] = "groth16";
Protocol["PLONK"] = "plonk";
})(Protocol || (Protocol = {}));
const debug = 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 wasmFs = await (0, wasm_1.initFS)();
const outputBasePath = `${process.cwd()}${finalConfig.circom.outputBasePath}`;
for (let i = 0; i < finalConfig.circom.circuits.length; i++) {
const circuitName = finalConfig.circom.circuits[i].name;
const spinner = (0, ora_1.default)(chalk_1.default.greenBright(`Debugging ${circuitName}\n`)).start();
const wtnsFilePath = `${process.cwd()}${finalConfig.circom.inputBasePath}/${finalConfig.circom.circuits[i].name}_witness.wtns`;
const wasmFilePath = `${outputBasePath}/${circuitName}/${circuitName}_js/${circuitName}.wasm`;
const r1csFilePath = `${outputBasePath}/${circuitName}/${circuitName}.r1cs`;
const symFilePath = `${outputBasePath}/${circuitName}/${circuitName}.sym`;
if (!(await (0, utils_1.fileExists)(wasmFilePath))) {
(0, logger_1.log)(`\nUnable to locate ${circuitName}.wasm at dir ${wasmFilePath}, run shield compile to generate .wasm file in this output dir`, "error");
continue;
}
if (!(await (0, utils_1.fileExists)(r1csFilePath))) {
(0, logger_1.log)(`\nUnable to locate file ${circuitName}.r1cs at dir ${r1csFilePath}, run shield compile to generate .r1cs file in this output dir`, "error");
continue;
}
if (!(await (0, utils_1.fileExists)(symFilePath))) {
(0, logger_1.log)(`\nUnable to locate file ${circuitName}.sym at dir ${symFilePath}, run shield compile to generate .sym file in this output dir`, "error");
continue;
}
const inputFilePath = `${process.cwd()}${finalConfig.circom.inputBasePath}/${finalConfig.circom.circuits[i].input}`;
if (await (0, utils_1.fileExists)(inputFilePath)) {
try {
const input = ffjavascript_1.utils.unstringifyBigInts(JSON.parse(await fs.readFile(inputFilePath, "utf8")));
const wtnsFile = await snarkjs_1.WrappedSnarkJs.util.generateWtns(wtnsFilePath, wasmFilePath, input);
const r1cs = await (0, r1csfile_1.load)(r1csFilePath, true, false);
const symFile = await wasmFs.readFileSync(symFilePath);
await (0, logger_1.logSignals)(r1cs, wtnsFile, symFile, input);
const checker = new checker_1.Checker(r1csFilePath, symFilePath);
await checker.checkConstraintsAndOutput(wtnsFilePath.replace(".wtns", ".json"));
spinner.succeed(chalk_1.default.greenBright(`${circuitName} successfully debugged.`));
}
catch (error) {
if (error instanceof Error) {
spinner.fail(chalk_1.default.redBright(`${error.message}`));
}
else {
(0, logger_1.log)(`\nerror while debugging the circuit ${circuitName} ${error}`, "error");
spinner.fail(chalk_1.default.redBright(`${error}`));
}
}
}
else {
(0, logger_1.log)(`unable to locate ${finalConfig.circom.circuits[i].input} at dir ${inputFilePath} user defined config in file shield.config.js.`, "error");
}
}
process.exit(0);
}
catch (error) {
(0, logger_1.log)(error.message, "error");
}
};
exports.debug = debug;
//# sourceMappingURL=debug.js.map