Compiling a circuit
This tutorial contains step-by-step instructions on how to compile the arithmetic circuit created previously.
There are two possible ways for transforming a circuit into a proof binary and Solidity code.
- By calling individual tools
- By using the zkllvm-template project
Calling individual tools
The following diagram shows the flow for converting a .cpp
or a .rs
file into a proof binary and Solidity code for deployment.
Complete the below steps to follow this flow.
Running the compiler
To generate the circuit IR, complete one of the following tutorials.
📄️ Compiling C++ code
This tutorial shows how a .cpp file can be converted into a circuit IR.
📄️ Compiling Rust code
This tutorial demonstrates how an .rs file can be converted into a circuit IR.
Passing the IR to assigner
At this stage, the newly generated IR and the public info file are ready to be passed to assigner
.
Run the following command to generate the circuit constraints and the assignment table.
assigner -b path/to/circuit.ll -i path/to/public_input.inp -c circuit.crct -t assignment.tbl -e pallas --generate-type circuit-assignment
Using transpiler
to generate the circuit proof
The .crct
and .tbl
files can be passed to the transpiler
tool to generate a binary with the proof and Solidity files containing the circuit.
Run the below command to generate proof.bin
.
transpiler -m gen-test-proof -c path/to/circuit.crct -t path/to/assignment.tbl -o output -e pallas
Execute the following command to produce Solidity files.
transpiler -m gen-evm-verifier -c path/to/circuit.crct -t path/to/assignment.tbl -o output -e pallas --optimize-gates
Congratulations! At this stage, we recommend taking a look at other examples in the zkLLVM repository and compiling them.
Using zkllvm-template
zkllvm-template
is a project designed to simplify working with complex circuits and zk-enabled apps.
The project provides an easy-to-use interface for compiling circuits in one command instead of completing each step individually or reconfiguring build targets in CMakeLists.txt
.
zkllvm-templatehandles dependency management via a pre-configured
CMakeLists.txt` file. If a circuit fails to compile due to issues with dependencies, consider using the template project.
zkllvm-template
only supports C++ projects.
Compiling Rust code is done via a typical flow involving cargo
, which eliminates the need for configuring CMakeLists.txt
.
To work with zkllvm-template
, clone its repository with all sub-modules.
git clone --recurse-submodules https://github.com/NilFoundation/zkllvm-template.git
cd zkllvm-template
Additionally, install all required tools from pre-built binaries.
Within zkllvm-template
, the ./main
folder contains the main.cpp
file that acts as the entry point for the clang
compiler.
To run the compiler, execute the following command.
scripts/run.sh
This is equivalent to completing each individual step described in the previous section.