|
| 1 | +#!/bin/bash |
| 2 | +set -euo pipefail # Strict error handling |
| 3 | + |
| 4 | +# Ensures the script runs in the circuit directory |
| 5 | +cd "$(dirname "$0")" |
| 6 | + |
| 7 | +BUILD_DIR="build" |
| 8 | +INPUTS_DIR="inputs" |
| 9 | + |
| 10 | +mkdir -p "$BUILD_DIR" "$INPUTS_DIR" |
| 11 | + |
| 12 | +echo "### Step 1: Compile circuit to R1CS + WASM + SYM" |
| 13 | +circom TaskProof.circom --r1cs --wasm --sym -o "$BUILD_DIR" |
| 14 | +# Rename to .cjs for Node.js compatibility |
| 15 | +mv build/TaskProof_js/generate_witness.js build/TaskProof_js/generate_witness.cjs |
| 16 | +mv build/TaskProof_js/witness_calculator.js build/TaskProof_js/witness_calculator.cjs |
| 17 | +sed -i 's/\.\/witness_calculator\.js/.\/witness_calculator.cjs/' build/TaskProof_js/generate_witness.cjs |
| 18 | + |
| 19 | +echo "### Step 2: Trusted setup (powers of tau)" |
| 20 | +snarkjs powersoftau new bn128 12 "$BUILD_DIR/pot12_0000.ptau" -v |
| 21 | +snarkjs powersoftau contribute "$BUILD_DIR/pot12_0000.ptau" "$BUILD_DIR/pot12_0001.ptau" --name="First contribution" -v |
| 22 | +snarkjs powersoftau beacon "$BUILD_DIR/pot12_0001.ptau" "$BUILD_DIR/pot12_beacon.ptau" 0102030405060708 10 -n="final-beacon" |
| 23 | +snarkjs powersoftau prepare phase2 "$BUILD_DIR/pot12_beacon.ptau" "$BUILD_DIR/pot12_final.ptau" -v |
| 24 | + |
| 25 | +echo "### Step 2b: Setup Groth16 Phase 2" |
| 26 | +snarkjs groth16 setup "$BUILD_DIR/TaskProof.r1cs" "$BUILD_DIR/pot12_final.ptau" "$BUILD_DIR/TaskProof_0000.zkey" |
| 27 | +snarkjs zkey contribute "$BUILD_DIR/TaskProof_0000.zkey" "$BUILD_DIR/TaskProof_0001.zkey" --name="Alice" -e="$(openssl rand -base64 32)" -v |
| 28 | +snarkjs zkey contribute "$BUILD_DIR/TaskProof_0001.zkey" "$BUILD_DIR/TaskProof_0002.zkey" --name="Bob" -e="$(openssl rand -base64 32)" -v |
| 29 | +snarkjs zkey beacon "$BUILD_DIR/TaskProof_0002.zkey" "$BUILD_DIR/TaskProof_final.zkey" 0102030405060708 12 -n="final-beacon-phase2" |
| 30 | + |
| 31 | +echo "### Step 3: Export verification key + Solidity verifier" |
| 32 | +snarkjs zkey export verificationkey "$BUILD_DIR/TaskProof_final.zkey" verification_key.json |
| 33 | +snarkjs zkey export solidityverifier "$BUILD_DIR/TaskProof_final.zkey" ../src/Verifier.sol |
| 34 | + |
| 35 | +echo "### Step 4: Generate witness" |
| 36 | +if [[ ! -f "$INPUTS_DIR/input.json" ]]; then |
| 37 | + cat > "$INPUTS_DIR/input.json" <<EOF |
| 38 | +{ |
| 39 | + "solution": "42", |
| 40 | + "taskId": "7", |
| 41 | + "taskSalt": "123456", |
| 42 | + "recipient": "987654321", |
| 43 | + "commit": "11500528584593830379883139624647731070623497308416655972613955003754148633922" |
| 44 | +} |
| 45 | +EOF |
| 46 | + echo "Created default inputs at $INPUTS_DIR/input.json" |
| 47 | +fi |
| 48 | + |
| 49 | +node "$BUILD_DIR/TaskProof_js/generate_witness.cjs" \ |
| 50 | + "$BUILD_DIR/TaskProof_js/TaskProof.wasm" \ |
| 51 | + "$INPUTS_DIR/input.json" \ |
| 52 | + "$BUILD_DIR/witness.wtns" |
| 53 | + |
| 54 | +echo "### Step 4b: Generate proof and public signals" |
| 55 | +snarkjs groth16 prove "$BUILD_DIR/TaskProof_final.zkey" "$BUILD_DIR/witness.wtns" proof.json public.json |
| 56 | + |
| 57 | +echo "### Step 4c: Verify proof" |
| 58 | +snarkjs groth16 verify verification_key.json public.json proof.json |
| 59 | + |
| 60 | +echo "Done!" |
0 commit comments