Skip to main content

Verifying and proving a circuit

This tutorial shows how to verify a new circuit using the EVM Placeholder proof system verifier, which is an application for in-EVM verification of zero-knowledge proofs compatible with Placeholder.

Download and compile the verifier​

info

Prior to installing the verifier, make sure to install Node.js and npm.

Execute the following commands to download and install evm-placeholder-verification.

git clone https://github.com/NilFoundation/evm-placeholder-verification.git
cd evm-placeholder-verification/
npm install
npx hardhat compile

Verify a circuit​

During the previous tutorial, zkLLVM has generated a folder containing the contracts file and related files for the new circuit.

Copy and paste this folder into ./evm-placeholder-verification/contracts/zkllvm.

Afterward, run the following command in the root directory of evm-placeholder-verification.

npx hardhat deploy

This will deploy all circuits in the ./evm-placeholder-verification/contracts/** directory including the new circuit to a local EVM network.

To verify the new circuit, use the below command.

npx hardhat verify-circuit-proof --test {name_of_circuit_directory}

, where {name_of_circuit_directory} is the name of the directory containing the transpiler ouputs for the new circuit.

The following message should appear in the terminal.

Run modular verifier for: {name_of_circuit_directory}
Verify : ../contracts/zkllvm/{name_of_circuit_directory}/proof.bin
[ 999n, 5n ]
⛽Gas used: 5097062
Events received:
✅ProofVerified

With this, the new circuit is fully verified!

Generate a proof using proof-producer​

The final step in this tutorial is to use proof-producer to generate a proof for the new circuit and see if it aligns with the proof created by zkLLVM. This step is optional and is only needed if there is a mismatch between proof-generator and the version of proof-generator used in evm-placeholder-verification.

Set up proof-producer​

First, clone the proof-producer repository and its sub-mobules.

git clone --recurse-submodules https://github.com/NilFoundation/proof-producer.git

Then, install the dependencies required to run proof-producer.

sudo apt-get install build-essential libsctp-dev libssl-dev libicu-dev lsb-release gnutls-dev pkg-config

Create a build directory and switch to it.

mkdir build && cd build

Re-configure cmake and compile proof-generator.

cmake .. -DCMAKE_BUILD_TYPE=Release -DZK_PLACEHOLDER_PROFILING_ENABLED=TRUE -DBLUEPRINT_PLACEHOLDER_PROOF_GEN=True
make -j $(nproc)

Afterward, the ./build/bin/proof-generator directory should include two versions of proof-generator.

  • proof-generator-multi-threaded
  • proof-generator-single-threaded

This tutorial will use proof-generator-single-threaded to generate proof.

Generate proof​

During the previous tutorial, zkLLVM should have generated the .tbl and .crct files for the new circuit.

If these files are not located within the zkllvm/build/examples/cpp directory, run the following commands in the zkLLVM directory.

cmake --build build -t {name_of_build_target}_crct
cmake --build build -t {name_of_build_target}_tbl

To generate new proof, execute the following command from the proof-producer/build/bin/proof-generator directory.

./proof-generator-single-threaded -t /path/to/assignment_{name_of_build_target}.tbl --circuit /path/to/circuit_{name_of_build_target}.crct

proof-generator should place the proof.bin file with the new proof into the current directoryy.

Validate the new proof​

Copy the new proof.bin file and paste it into the /evm-placeholder-verification/contracts/zkllvm/transpiler_output_{name_of_build_target} directory.

Replace the already existing proof.bin file with the new proof and re-run the below command.

npx hardhat verify-circuit-proof --test {name_of_circuit_directory}

The output should be exactly the same as the output for running evm-placeholder-verifier on the proof generated by zkLLVM.