chore: add ts script to compile circuits

Former-commit-id: 46fbe572b7
This commit is contained in:
cedoor
2022-01-25 20:15:32 +01:00
parent ed355829cd
commit 7dead05108
3 changed files with 73 additions and 40 deletions

View File

@@ -1,31 +0,0 @@
cd "$(dirname "$0")"
mkdir -p ../build
mkdir -p ../zkeyFiles
mkdir -p ../contracts
cd ../build
if [ -f ./powersOfTau28_hez_final_14.ptau ]; then
echo "powersOfTau28_hez_final_14.ptau already exists. Skipping."
else
echo 'Downloading powersOfTau28_hez_final_14.ptau'
wget https://hermez.s3-eu-west-1.amazonaws.com/powersOfTau28_hez_final_14.ptau
fi
circom ../circuits/semaphore.circom --r1cs --wasm --sym
snarkjs r1cs export json semaphore.r1cs semaphore.r1cs.json
snarkjs groth16 setup semaphore.r1cs powersOfTau28_hez_final_14.ptau semaphore_0000.zkey
snarkjs zkey contribute semaphore_0000.zkey semaphore_0001.zkey --name="Frist contribution" -v -e="Random entropy"
snarkjs zkey contribute semaphore_0001.zkey semaphore_0002.zkey --name="Second contribution" -v -e="Another random entropy"
snarkjs zkey beacon semaphore_0002.zkey semaphore_final.zkey 0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f 10 -n="Final Beacon phase2"
snarkjs zkey export verificationkey semaphore_final.zkey verification_key.json
snarkjs zkey export solidityverifier semaphore_final.zkey verifier.sol
cp verifier.sol ../contracts/Verifier.sol
cp verification_key.json ../zkeyFiles/verification_key.json
cp semaphore_js/semaphore.wasm ../zkeyFiles/semaphore.wasm
cp semaphore_final.zkey ../zkeyFiles/semaphore_final.zkey

View File

@@ -1,9 +0,0 @@
const fs = require("fs");
const solidityRegex = /pragma solidity \^\d+\.\d+\.\d+/
process.chdir('./contracts');
const content = fs.readFileSync("Verifier.sol", { encoding: 'utf-8' });
const bumped = content.replace(solidityRegex, 'pragma solidity ^0.8.0');
fs.writeFileSync("Verifier.sol", bumped);

View File

@@ -0,0 +1,73 @@
import { exec as _exec } from "child_process"
import download from "download"
import { r1cs, zKey } from "snarkjs"
import fs from "fs"
import util from "util"
import { config } from "../package.json"
import logger from "js-logger"
logger.useDefaults()
async function exec(command: string) {
const { stderr, stdout } = await util.promisify(_exec)(command)
if (stderr) {
throw new Error(stderr)
}
logger.info(stdout)
}
async function main() {
const buildPath = config.paths.build.snark
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"
const fileName = "powersOfTau28_hez_final_14.ptau"
await download(`${url}/${fileName}`, buildPath)
}
await exec(`circom ./circuits/semaphore.circom --r1cs --wasm --sym -o ${buildPath}`)
await r1cs.info(`${buildPath}/semaphore.r1cs`, logger)
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
)
const verificationKey = await zKey.exportVerificationKey(`${buildPath}/semaphore_final.zkey`, logger)
let verifierCode = await zKey.exportSolidityVerifier(
`${buildPath}/semaphore_final.zkey`,
{ groth16: fs.readFileSync("./node_modules/snarkjs/templates/verifier_groth16.sol.ejs", "utf8") },
logger
)
verifierCode = verifierCode.replace(/pragma solidity \^\d+\.\d+\.\d+/, "pragma solidity ^0.8.0")
fs.writeFileSync(`${buildPath}/verification_key.json`, JSON.stringify(verificationKey), "utf-8")
fs.writeFileSync(`${config.paths.contracts}/Verifier.sol`, verifierCode, "utf-8")
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error)
process.exit(1)
})