From 80bdc6a5804a98f60f5f1fa657dc900f06471d28 Mon Sep 17 00:00:00 2001 From: Jim Zhang Date: Thu, 29 Aug 2024 14:22:32 -0400 Subject: [PATCH 1/2] Use npx snarkjs to avoid installing globally Signed-off-by: Jim Zhang --- zkp/circuits/gen.js | 45 ++++++++------------------------------- zkp/circuits/package.json | 1 + 2 files changed, 10 insertions(+), 36 deletions(-) diff --git a/zkp/circuits/gen.js b/zkp/circuits/gen.js index 7f8c9b3..99fcaa5 100644 --- a/zkp/circuits/gen.js +++ b/zkp/circuits/gen.js @@ -83,12 +83,9 @@ const processCircuit = async (circuit, ptau, skipSolidityGenaration) => { if (!compileOnly && !fs.existsSync(ptauFile)) { log(circuit, `PTAU file does not exist, downloading: ${ptauFile}`); try { - const response = await axios.get( - `https://storage.googleapis.com/zkevm/ptau/${ptau}.ptau`, - { - responseType: 'stream', - } - ); + const response = await axios.get(`https://storage.googleapis.com/zkevm/ptau/${ptau}.ptau`, { + responseType: 'stream', + }); response.data.pipe(fs.createWriteStream(ptauFile)); await new Promise((resolve, reject) => { response.data.on('end', resolve); @@ -101,9 +98,7 @@ const processCircuit = async (circuit, ptau, skipSolidityGenaration) => { } log(circuit, `Compiling circuit`); - await execAsync( - `circom ${circomInput} --output ${circuitsRoot} --sym --wasm` - ); + await execAsync(`circom ${circomInput} --output ${circuitsRoot} --sym --wasm`); if (compileOnly) { return; } @@ -111,20 +106,10 @@ const processCircuit = async (circuit, ptau, skipSolidityGenaration) => { await execAsync(`circom ${circomInput} --output ${provingKeysRoot} --r1cs`); log(circuit, `Generating test proving key with ${ptau}`); - await execAsync( - `snarkjs groth16 setup ${path.join( - provingKeysRoot, - `${circuit}.r1cs` - )} ${ptauFile} ${zkeyOutput}` - ); + await execAsync(`npx snarkjs groth16 setup ${path.join(provingKeysRoot, `${circuit}.r1cs`)} ${ptauFile} ${zkeyOutput}`); log(circuit, `Generating verification key`); - await execAsync( - `snarkjs zkey export verificationkey ${zkeyOutput} ${path.join( - provingKeysRoot, - `${circuit}-vkey.json` - )}` - ); + await execAsync(`npx snarkjs zkey export verificationkey ${zkeyOutput} ${path.join(provingKeysRoot, `${circuit}-vkey.json`)}`); if (skipSolidityGenaration) { log(circuit, `Skipping solidity verifier generation`); @@ -132,27 +117,15 @@ const processCircuit = async (circuit, ptau, skipSolidityGenaration) => { } log(circuit, `Generating solidity verifier`); - const solidityFile = path.join( - '..', - '..', - 'solidity', - 'contracts', - 'lib', - `verifier_${circuit}.sol` - ); - await execAsync( - `snarkjs zkey export solidityverifier ${zkeyOutput} ${solidityFile}` - ); + const solidityFile = path.join('..', '..', 'solidity', 'contracts', 'lib', `verifier_${circuit}.sol`); + await execAsync(`npx snarkjs zkey export solidityverifier ${zkeyOutput} ${solidityFile}`); log(circuit, `Modifying the contract name in the Solidity file`); const camelCaseCircuitName = toCamelCase(circuit); const solidityFileTmp = `${solidityFile}.tmp`; const fileContent = fs.readFileSync(solidityFile, 'utf8'); - const updatedContent = fileContent.replace( - ' Groth16Verifier ', - ` Groth16Verifier_${camelCaseCircuitName} ` - ); + const updatedContent = fileContent.replace(' Groth16Verifier ', ` Groth16Verifier_${camelCaseCircuitName} `); fs.writeFileSync(solidityFileTmp, updatedContent); fs.renameSync(solidityFileTmp, solidityFile); }; diff --git a/zkp/circuits/package.json b/zkp/circuits/package.json index 8af366e..d4ae515 100644 --- a/zkp/circuits/package.json +++ b/zkp/circuits/package.json @@ -12,6 +12,7 @@ "devDependencies": { "axios": "^1.7.3", "p-limit": "^6.1.0", + "snarkjs": "^0.7.4", "yargs": "^17.7.2" } } From f670da7f4089c35e7ef1ddd7d0a71ca5a02040cb Mon Sep 17 00:00:00 2001 From: Jim Zhang Date: Thu, 29 Aug 2024 14:23:35 -0400 Subject: [PATCH 2/2] Remove reformatting Signed-off-by: Jim Zhang --- zkp/circuits/gen.js | 45 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/zkp/circuits/gen.js b/zkp/circuits/gen.js index 99fcaa5..e6b14ed 100644 --- a/zkp/circuits/gen.js +++ b/zkp/circuits/gen.js @@ -83,9 +83,12 @@ const processCircuit = async (circuit, ptau, skipSolidityGenaration) => { if (!compileOnly && !fs.existsSync(ptauFile)) { log(circuit, `PTAU file does not exist, downloading: ${ptauFile}`); try { - const response = await axios.get(`https://storage.googleapis.com/zkevm/ptau/${ptau}.ptau`, { - responseType: 'stream', - }); + const response = await axios.get( + `https://storage.googleapis.com/zkevm/ptau/${ptau}.ptau`, + { + responseType: 'stream', + } + ); response.data.pipe(fs.createWriteStream(ptauFile)); await new Promise((resolve, reject) => { response.data.on('end', resolve); @@ -98,7 +101,9 @@ const processCircuit = async (circuit, ptau, skipSolidityGenaration) => { } log(circuit, `Compiling circuit`); - await execAsync(`circom ${circomInput} --output ${circuitsRoot} --sym --wasm`); + await execAsync( + `circom ${circomInput} --output ${circuitsRoot} --sym --wasm` + ); if (compileOnly) { return; } @@ -106,10 +111,20 @@ const processCircuit = async (circuit, ptau, skipSolidityGenaration) => { await execAsync(`circom ${circomInput} --output ${provingKeysRoot} --r1cs`); log(circuit, `Generating test proving key with ${ptau}`); - await execAsync(`npx snarkjs groth16 setup ${path.join(provingKeysRoot, `${circuit}.r1cs`)} ${ptauFile} ${zkeyOutput}`); + await execAsync( + `npx snarkjs groth16 setup ${path.join( + provingKeysRoot, + `${circuit}.r1cs` + )} ${ptauFile} ${zkeyOutput}` + ); log(circuit, `Generating verification key`); - await execAsync(`npx snarkjs zkey export verificationkey ${zkeyOutput} ${path.join(provingKeysRoot, `${circuit}-vkey.json`)}`); + await execAsync( + `npx snarkjs zkey export verificationkey ${zkeyOutput} ${path.join( + provingKeysRoot, + `${circuit}-vkey.json` + )}` + ); if (skipSolidityGenaration) { log(circuit, `Skipping solidity verifier generation`); @@ -117,15 +132,27 @@ const processCircuit = async (circuit, ptau, skipSolidityGenaration) => { } log(circuit, `Generating solidity verifier`); - const solidityFile = path.join('..', '..', 'solidity', 'contracts', 'lib', `verifier_${circuit}.sol`); - await execAsync(`npx snarkjs zkey export solidityverifier ${zkeyOutput} ${solidityFile}`); + const solidityFile = path.join( + '..', + '..', + 'solidity', + 'contracts', + 'lib', + `verifier_${circuit}.sol` + ); + await execAsync( + `npx snarkjs zkey export solidityverifier ${zkeyOutput} ${solidityFile}` + ); log(circuit, `Modifying the contract name in the Solidity file`); const camelCaseCircuitName = toCamelCase(circuit); const solidityFileTmp = `${solidityFile}.tmp`; const fileContent = fs.readFileSync(solidityFile, 'utf8'); - const updatedContent = fileContent.replace(' Groth16Verifier ', ` Groth16Verifier_${camelCaseCircuitName} `); + const updatedContent = fileContent.replace( + ' Groth16Verifier ', + ` Groth16Verifier_${camelCaseCircuitName} ` + ); fs.writeFileSync(solidityFileTmp, updatedContent); fs.renameSync(solidityFileTmp, solidityFile); };