Generating proofs for Aligned
SP1
Dependencies
This guide assumes that:
sp1 prover installed (instructions here)
sp1 project to generate the proofs (instructions here)
aligned installed (instructions here)
How to generate a proof
Aligned only verifies SP1 in a compressed version. You can check you are using compressed by opening script/src/main.rs and check that the proof is generated with
client.prove_compressed
instead ofclient.prove
.
First, open a terminal and navigate to the script folder in the sp1 project directory
Then, run the following command to generate a proof:
How to get the proof verified by Aligned
After generating the proof, you will have to find two different files:
proof file: usually found under
script
directory, with the nameproof.json
or similarelf file: usually found under
program/elf/
directory
Then, you can send the proof to the Aligned network by running the following command
Where proof_path
is the path to the proof file, vm_program_path
is the path to the ELF file. proof_generator_addr
is an optional parameter that works as a helper for some applications where you can be frontrunned.
For more instructions on how to submit proofs, check the Submitting proofs guide.
Gnark
Dependencies
This guide assumes that:
Gnark library is installed. If not, install it using the following command inside your Go module:
Gnark project to generate the proofs' instructions here
How to generate a proof
Open a terminal and navigate to the Gnark project directory. Then, run the following command to generate the proof:
How to get the proof verified by Aligned
After generating the proof, you will have to have three different files:
proof file
verification key file
public input file
For a detailed guide on how to generate those files, refer to our detailed guide.
Then, you can send the proof to the Aligned network by running the following command
Where proof path is the path to the proof file, public_input_path
is the path to the public input file, and verification_key_path
is the path to the verification key file.
For more instructions on how to submit proofs, check the Submitting proofs guide.
Risc0
Dependencies
This guide assumes that:
Risc0 toolchain installed (instructions here)
Risc0 project to generate the proofs (instructions here)
Aligned installed (instructions here)
How to generate a proof
First, open the risc0 host file and add the following code to export proof, image id & public input needed by Aligned.
Note that METHOD_ID will be imported from guest, but it will be under a different name.
Then run the following command to generate the proof:
How to get the proof verified by Aligned
After generating the proof, you will have to find three different files:
Proof file
Image id file
Public input file
Then, you can send the proof to the Aligned network by running the following command
For more instructions on how to submit proofs, check the Submitting proofs guide.
ZkRust
zkRust
is a CLI tool maintained by Aligned that aims to simplify the developing applications in Rust using zkVM's such as SP1 or Risc0.
zkRust can be installed directly by downloading the latest release binaries:
Then, to get started you can create a workspace for your project in zkRust by running:
It is that simple.
Usage
To use zkRust, users specify a fn main()
whose execution is proven within the zkVM. This function must be defined in a main.rs
file in a directory with the following structure:
For using more complex programs you can import a separate lib/ crate into the PROGRAM_DIRECTORY
Inputs and Outputs
The user may also define a input()
and output()
functions in addition to main()
, that define code that runs outside of the zkVM, before and after the VM executes
The
input()
function executes before the zkVM code is executed and allows the user to define inputs passed to the vm such as a deserialized Tx or data fetched from an external source at runtime.Within the
main()
(guest) function the user may write information from the computation performed in the zkVM to an output buffer to be used after proof generation.The
output()
defines code that allows the user to read the information written to that buffer of the and perform post-processing of that data.
The user may specify inputs into the VM (guest) code using zk_rust_io::write()
as long on the type of rust object they are writing implements Serializable
.
Within the main()
function (guest) the user may read in the inputs by specifying zk_rust_io::read()
and output data computed during the execution phase of the code within the VM (guest) program by specifying zk_rust_io::commit()
.
To read the output of the output of the VM (guest) program you declare zk_rust_io::out()
. The zk_rust_io
crate defines function headers that are not inlined and are purely used as compile time symbols to ensure a user can compile their rust code before running it within one of the zkVMs available in zkRust.
To use the I/O imports import the zk_rust_io
crate by adding the following to the Cargo.toml
in your project directory.
Example
input.rs
main.rs
output.rs
To generate a proof of the execution of your code run the following:
Sp1:
For additional information on using zkRust and using it to submit proofs to Aligned see the zkRust Github Repository.
Last updated