zk-VM: Advanced Usage
For basic usage of the Valida zk-VM, see QUICK STARK: Valida zk-VM. This page covers more advanced usage options for the Valida zk-VM.
Separate preprocessing stage
By default, the Valida prover and verifier perform the preprocessing stage of the argument from scratch each time. If you wish to perform the preprocessing stage of the argument as a separate step and write the result to a file, you can do so as follows:
This assumes that $PROGRAM
is the path to a Valida executable file. It writes the proving key to $NAME.pk
and $NAME.vk
.
To supply the proving key to the prover:
To supply the verifying key to the verifier:
Universal vs. program-specific setup
When the program being executed is part of the statement being proven, this is called a universal setup. When the program is not part of the statement being proven, this is called a program-specific setup. By default, Valida uses a universal setup. To use a program-specific setup, pass the --program-specific
flag to valida preprocess
, valida prove
, and valida verify
:
The universal setup is useful because it allows for the same verifier to verify proofs of execution for arbitrary programs. The program-specific setup is useful because it allows for more succinct statements which are easier to verify, due to the program being excluded from the statement.
Memory backends
The Valida zk-VM supports multiple memory backends, which have different time and space utilization characteristics. The memory backend can be selected by passing the --backend $BACKEND
option to any of the zk-VM commands.
The following values of $BACKEND
are supported:
btree
: a binary tree memory representationhashmap
: a hash map memory representationarray
: a sparse array memory representation with a bit vector indicating which addresses have been setlean
: a sparse array memory representation without a bit vector indicating which addresses have been set
To minimize space utilization for execution and proving, pick a btree
or hashmap
memory backend. To minimize execution time, pick an array
or lean
memory backend.
Advanced preprocessing options
The valida preprocess
command takes the following options:
--help
: print usage instructions--show-preprocessed
causes the preprocessed traces to be printed.--program-specific
chooses a program-specific setup instead of a universal setup.--backend $BACKEND
chooses$BACKEND
as the memory representation.
Advanced execution options
The valida run
command takes the following options:
--help
: print usage instructions--initial-fp $INITIAL_FP
: sets the initial value of the frame pointer (fp
) special purpose register to$INITIAL_FP
--fast
: turns off trace generation, reducing the time and space usage of the execution engine--program-specific
: chooses a program-specific setup instead of a universal setup (affects trace generation only)--backend $BACKEND
chooses$BACKEND
as the memory representation.
Advanced prover options
The valida prove
command takes the following options:
--help
: print usage instructions--initial-fp $INITIAL_FP
: sets the initial value of the frame pointer (fp
) special purpose register to$INITIAL_FP
--program-specific
: chooses a program-specific setup instead of a universal setup (affects trace generation only)--backend $BACKEND
chooses$BACKEND
as the memory representation.--show-public
: shows the public inputs to the prover (i.e., the public traces)--show-preprocessed
: shows the preprocessed inputs to the prover (i.e., the preprocessed traces)--show-main
: shows the main traces (i.e., the non-public, non-preprocessed traces)--show-interactions
: shows the interactions which go into the permutation argument
Advanced verifier options
The valida verify
command takes the following options:
--help
: print usage instructions--claimed-output $OUTPUT
: verifies that the output of the proven execution is$OUTPUT
--initial-fp $INITIAL_FP
: sets the initial value of the frame pointer (fp
) special purpose register to$INITIAL_FP
--program-specific
: chooses a program-specific setup instead of a universal setup (affects trace generation only)--backend $BACKEND
chooses$BACKEND
as the memory representation.--show-public
: shows the public inputs to the prover (i.e., the public traces)--show-preprocessed
: shows the preprocessed inputs to the prover (i.e., the preprocessed traces)
Last updated