Multi-AIR (RV32IM)#
The RV32IM Fibonacci program demonstrates the full multi-AIR STARK protocol with LogUp bus interactions, matrices of different heights, and per-height alpha tracking.
Multi-AIR Structure#
Unlike the single-AIR Fibonacci, a multi-AIR proof covers multiple AIRs simultaneously. Each AIR has its own:
Trace matrix (possibly different number of rows)
Constraint DAG
Preprocessed trace (optional)
Bus interactions (optional)
All AIRs share a single FRI proof.
Different Heights#
In a multi-AIR proof, trace matrices can have different heights (\(N_a \ne N_b\)). This affects the protocol in several ways:
MMCS: The mixed-matrix commitment scheme (
_build_mmcs_tree) builds a single Merkle tree where shorter matrices are injected at higher tree levels.Per-height alpha tracking: During PCS opening, the \(\alpha\)-power accumulator is maintained separately for each distinct \(\log_2(\text{height})\):
This is critical — using a single global accumulator produces incorrect proofs for multi-height cases, even though it works for single-height proofs.
FRI reduced openings: The FRI commit phase receives reduced openings keyed by height. During folding, reduced openings at the current folded height are “rolled in”: \(F_{k+1} \mathrel{+}= \beta_k^2 \cdot \text{ro}_h\).
LogUp Bus Interactions#
Multi-AIR programs use LogUp to enforce consistency between AIRs via shared
buses (compute_after_challenge_trace).
Interaction Definition#
Each interaction specifies:
Bus ID: which bus this interaction connects to.
Message fields: column indices defining the message.
Count: the multiplicity (positive for sends, negative for receives).
After-Challenge Computation#
Beta powers: \(\beta^0, \beta^1, \ldots\) generated from the interaction challenge \(\beta_{\text{lu}}\).
Denominators: For each interaction at each row: $\( d = \alpha_{\text{lu}} + m_0 + \beta_{\text{lu}} \cdot m_1 + \cdots + \beta_{\text{lu}}^{|m|} \cdot (\text{bus\_id} + 1) \)$
Reciprocals: Batch invert all denominators.
Chunk sums: Weighted sum of reciprocals by interaction counts.
Running sum \(\phi\): Prefix sum of chunk sums. The final value \(\phi[N-1]\) is the exposed value (cumulative sum).
Cumulative Sum Check#
The sum of exposed values across all AIRs must equal zero:
This enforces that every bus send has a corresponding receive.
Test Vectors#
The rv32im_fibonacci test vector exercises:
Multiple AIRs with different trace heights
LogUp interactions across AIRs
Per-height alpha tracking in PCS
Multi-height MMCS tree construction
The test suite caches the proof to avoid the ~25-minute generation time. Both prover (byte-for-byte match) and verifier tests pass.