Architecture Overview#
ZisK is a zero-knowledge virtual machine that proves correct execution of RISC-V programs. It decomposes computation into a single airgroup named “ZisK” containing 21 specialized AIRs (Algebraic Intermediate Representations), each responsible for a different aspect of execution: instruction dispatch, memory, arithmetic, bitwise operations, cryptographic precompiles, and lookup tables.
The AIRs communicate via buses—shared lookup and permutation arguments that enforce consistency between components. The central interconnect is the operation bus: the Main CPU AIR dispatches operations to coprocessors (Binary, Arith, etc.) via lookup assumes, and each coprocessor proves correctness via lookup proves on the same bus.
Airgroup Structure#
All 21 AIRs belong to a single airgroup (“ZisK”). The aggregation type is sum (logup) at stage 2, meaning the global constraint checks that the sum of all \(\mathrm{gsum}\) boundary values across all AIRs equals zero.
Configuration parameters:
Lattice size: \(L = 368\) (no elliptic-curve mode).
Transcript arity: \(a = 4\) (Poseidon2 sponge width \(= 16\)).
Number of public inputs: 68 (4 for
rom_root\(+\) 64 forinputs).Stage-2 challenges: 2 (\(\alpha, \gamma\)).
Proof values: 2 at stage 1 (
enable_input_data,enable_rom_data).
AIR Inventory#
Each AIR is implemented as a Rust state machine in zisk/state-machines/.
ID |
Name |
Trace size |
Role |
Compressor? |
|---|---|---|---|---|
0 |
CPU instruction dispatch |
No |
||
1 |
Program ROM lookup table |
No |
||
2 |
Main memory (sorted by addr+step) |
No |
||
3 |
Immutable ROM data region |
No |
||
4 |
Free input data region |
No |
||
5 |
Unaligned memory access logic |
No |
||
6 |
Byte-level memory alignment |
No |
||
7 |
Read-side byte alignment |
No |
||
8 |
Write-side byte alignment |
No |
||
9 |
64-bit multiply/divide |
No |
||
10 |
Bitwise AND, OR, XOR, comparisons |
No |
||
11 |
Dedicated 64-bit addition |
No |
||
12 |
Shifts, sign-extension |
No |
||
13 |
256-bit addition |
No |
||
14 |
256-bit field arithmetic (secp256k1, BN254) |
Yes |
||
15 |
384-bit field arithmetic (BLS12-381) |
Yes |
||
16 |
Keccak-f[1600] permutation |
Yes |
||
17 |
SHA-256 compression function |
Yes |
||
18 |
\(2^{20}\) |
Range check lookup table |
No |
|
19 |
\(2^{21}\) |
Packed lookup tables (7 tables) |
No |
|
20 |
\(2^{21}\) |
Packed lookup tables (3 tables) |
No |
AIRs marked “Compressor = Yes” have STARK verifier circuits exceeding \(2^{17}\) rows, requiring the optional Compressor stage in the recursion pipeline (see the Recursion Pipeline).
STARK Parameters per AIR#
Each AIR defines a STARK instance with concrete parameters. All AIRs share: blowup factor \(\beta = 2\), Merkle arity \(a = 4\), quotient degree \(d = 2\) (except Rom with \(d = 1\)), and cubic extension \(\Fext\) (\(q_{\mathrm{dim}} = 3\)).
Name |
\(n\) |
Witness |
Intmd |
Const |
Eval pts |
FRI rounds |
|---|---|---|---|---|---|---|
Main |
22 |
38 |
8 |
3 |
61 |
7 |
Rom |
22 |
1 |
2 |
1 |
18 |
7 |
Mem |
22 |
13 |
3 |
2 |
29 |
7 |
RomData |
21 |
6 |
3 |
2 |
19 |
7 |
InputData |
21 |
9 |
6 |
2 |
27 |
7 |
MemAlign |
21 |
29 |
6 |
2 |
59 |
7 |
MemAlignByte |
22 |
16 |
4 |
1 |
25 |
7 |
MemAlignReadByte |
22 |
10 |
3 |
1 |
18 |
7 |
MemAlignWriteByte |
22 |
14 |
4 |
1 |
23 |
7 |
Arith |
21 |
44 |
15 |
1 |
64 |
7 |
Binary |
22 |
39 |
5 |
1 |
49 |
7 |
BinaryAdd |
22 |
10 |
3 |
1 |
18 |
7 |
BinaryExtension |
22 |
29 |
6 |
1 |
40 |
7 |
Add256 |
20 |
47 |
17 |
1 |
69 |
6 |
ArithEq |
20 |
39 |
14 |
2 |
434 |
6 |
ArithEq384 |
20 |
33 |
14 |
2 |
536 |
6 |
Keccakf |
17 |
2137 |
293 |
2 |
4065 |
5 |
Sha256f |
18 |
102 |
7 |
2 |
1265 |
6 |
SpecifiedRanges |
20 |
33 |
17 |
34 |
88 |
6 |
VirtualTable0 |
21 |
8 |
5 |
52 |
69 |
7 |
VirtualTable1 |
21 |
8 |
5 |
73 |
90 |
7 |
Columns: \(n\) = trace size exponent (\(N = 2^n\)), Witness = stage-1 committed columns, Intmd = stage-2 intermediate columns, Const = constant (setup) columns, Eval pts = evaluation map entries (polynomial openings in the FRI batching), FRI rounds = number of folding rounds. The number of FRI queries ranges from 217 (Keccakf) to 232 (ArithEq384), targeting approximately 100 bits of security.
Notable outliers. Keccakf has by far the most columns (2137 witness \(+\) 293 intermediate) because each Keccak-f round requires extensive bit-level decomposition. ArithEq384 has the most evaluation points (536) due to the large number of constraint polynomials in its 384-bit modular arithmetic verification. The lookup table AIRs (SpecifiedRanges, VirtualTable0, VirtualTable1) have many constant columns (up to 73) because the precomputed table values are committed as constant polynomials during setup.