From 12e92840a4890adaec442f99399135c4b8e82f0b Mon Sep 17 00:00:00 2001 From: cedoor Date: Mon, 30 May 2022 15:26:08 +0200 Subject: [PATCH] feat: add new scripts Former-commit-id: c70b85e36c89143b2296cf5003fc2e3778b8d080 --- package.json | 3 +- scripts/compile-circuits.ts | 79 ----------------------------------- scripts/download-zk-files.ts | 25 +++++++++++ scripts/generate-verifiers.ts | 34 +++++++++++++++ 4 files changed, 61 insertions(+), 80 deletions(-) delete mode 100644 scripts/compile-circuits.ts create mode 100644 scripts/download-zk-files.ts create mode 100644 scripts/generate-verifiers.ts diff --git a/package.json b/package.json index ae2a7bdd..900af8d4 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "scripts": { "start": "hardhat node", "compile": "hardhat compile", - "compile:circuits": "ts-node scripts/compile-circuits.ts", + "download:zk-files": "ts-node scripts/download-zk-files.ts", + "generate:verifiers": "ts-node scripts/generate-verifiers.ts", "deploy:verifier": "hardhat deploy:verifier", "deploy:semaphore": "hardhat deploy:semaphore", "deploy:semaphore-voting": "hardhat deploy:semaphore-voting", diff --git a/scripts/compile-circuits.ts b/scripts/compile-circuits.ts deleted file mode 100644 index 71a25add..00000000 --- a/scripts/compile-circuits.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { exec as _exec } from "child_process" -import download from "download" -import fs from "fs" -import logger from "js-logger" -import rimraf from "rimraf" -import { zKey } from "snarkjs" -import { promisify } from "util" -import { config } from "../package.json" - -logger.useDefaults() - -async function exec(command: string) { - const { stderr, stdout } = await promisify(_exec)(command) - - if (stderr) { - throw new Error(stderr) - } - - logger.info(stdout) -} - -async function main() { - const buildPath = config.paths.build.snark - const templatesPath = config.paths["snarkjs-templates"] - const solidityVersion = config.solidity.version - - if (!fs.existsSync(buildPath)) { - fs.mkdirSync(buildPath, { recursive: true }) - } - - if (!fs.existsSync(`${buildPath}/powersOfTau28_hez_final_14.ptau`)) { - const url = "https://hermez.s3-eu-west-1.amazonaws.com/powersOfTau28_hez_final_14.ptau" - - await download(url, buildPath) - } - - await exec(`circom ./circuits/semaphore.circom --r1cs --wasm -o ${buildPath}`) - - await zKey.newZKey( - `${buildPath}/semaphore.r1cs`, - `${buildPath}/powersOfTau28_hez_final_14.ptau`, - `${buildPath}/semaphore_0000.zkey`, - logger - ) - - await zKey.beacon( - `${buildPath}/semaphore_0000.zkey`, - `${buildPath}/semaphore_final.zkey`, - "Final Beacon", - "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", - 10, - logger - ) - - let verifierCode = await zKey.exportSolidityVerifier( - `${buildPath}/semaphore_final.zkey`, - { groth16: fs.readFileSync(`${templatesPath}/verifier_groth16.sol.ejs`, "utf8") }, - logger - ) - verifierCode = verifierCode.replace(/pragma solidity \^\d+\.\d+\.\d+/, `pragma solidity ^${solidityVersion}`) - - fs.writeFileSync(`${config.paths.contracts}/base/Verifier.sol`, verifierCode, "utf-8") - - const verificationKey = await zKey.exportVerificationKey(`${buildPath}/semaphore_final.zkey`, logger) - fs.writeFileSync(`${buildPath}/verification_key.json`, JSON.stringify(verificationKey), "utf-8") - - fs.renameSync(`${buildPath}/semaphore_js/semaphore.wasm`, `${buildPath}/semaphore.wasm`) - rimraf.sync(`${buildPath}/semaphore_js`) - rimraf.sync(`${buildPath}/powersOfTau28_hez_final_14.ptau`) - rimraf.sync(`${buildPath}/semaphore_0000.zkey`) - rimraf.sync(`${buildPath}/semaphore.r1cs`) -} - -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error) - process.exit(1) - }) diff --git a/scripts/download-zk-files.ts b/scripts/download-zk-files.ts new file mode 100644 index 00000000..6177325d --- /dev/null +++ b/scripts/download-zk-files.ts @@ -0,0 +1,25 @@ +import download from "download" +import fs from "fs" +import { config } from "../package.json" + +async function main() { + const buildPath = config.paths.build["zk-files"] + const url = "http://www.trusted-setup-pse.org/semaphore/semaphore.zip" + + if (!fs.existsSync(buildPath)) { + fs.mkdirSync(buildPath, { recursive: true }) + } + + if (!fs.existsSync(`${buildPath}/16/semaphore.zkey`)) { + await download(url, buildPath, { + extract: true + }) + } +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error) + process.exit(1) + }) diff --git a/scripts/generate-verifiers.ts b/scripts/generate-verifiers.ts new file mode 100644 index 00000000..65613346 --- /dev/null +++ b/scripts/generate-verifiers.ts @@ -0,0 +1,34 @@ +import fs from "fs" +import logger from "js-logger" +import { zKey } from "snarkjs" +import { config } from "../package.json" + +logger.useDefaults() + +async function main() { + const buildPath = config.paths.build["zk-files"] + const contractsPath = config.paths.contracts + const templatesPath = config.paths["snarkjs-templates"] + const solidityVersion = config.solidity.version + + if (fs.existsSync(`${buildPath}/16/semaphore.zkey`)) { + for (let treeDepth = 16; treeDepth <= 32; treeDepth++) { + let verifierCode = await zKey.exportSolidityVerifier( + `${buildPath}/${treeDepth}/semaphore.zkey`, + { groth16: fs.readFileSync(`${templatesPath}/verifier_groth16.sol.ejs`, "utf8") }, + logger + ) + verifierCode = verifierCode.replace(/pragma solidity \^\d+\.\d+\.\d+/, `pragma solidity ^${solidityVersion}`) + verifierCode = verifierCode.replace(/Verifier/, `Verifier${treeDepth}`) + + fs.writeFileSync(`${contractsPath}/verifiers/Verifier${treeDepth}.sol`, verifierCode, "utf-8") + } + } +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error) + process.exit(1) + })