Multi-AIR Challenge Binding#
When a computation is decomposed into multiple AIR instances (e.g. memory, ALU, range checks in a zkVM), each AIR produces an independent STARK proof. To prevent a malicious prover from mixing proofs across different executions, all per-AIR transcripts are seeded with a shared global challenge \(\chi\) derived from every AIR’s stage-1 commitment.
Per-AIR Contributions#
Suppose there are \(A\) AIR instances.
Each instance \(a \in [A]\) independently commits its stage-1 polynomials
to obtain a Merkle root \(r_1^{(a)}\).
It then computes a contribution \(\kappa^{(a)}\) as follows
(calculate_internal_contribution).
Assemble input data:
\[ \mathbf{d}^{(a)} = \bigl(\mathrm{vk}^{(a)},\; r_1^{(a)},\; \mathrm{airValues}^{(a)}\bigr), \]where \(\mathrm{vk}^{(a)}\) is the per-AIR verification key (4 base-field elements) and \(\mathrm{airValues}^{(a)}\) are any stage-1 air values.
Compute a hash state:
\[ h^{(a)} = \Poseidon(\mathbf{d}^{(a)}) \in \F^{16}. \]Lattice expansion (when no elliptic-curve mode is used). Chain-hash to produce a vector of \(L\) elements (typically \(L = 368\)):
\[\begin{split} \begin{aligned} \kappa^{(a)}[0\!:\!16] &= h^{(a)}, \\ \kappa^{(a)}[16k\!:\!16(k\!+\!1)] &= \Poseidon\bigl(\kappa^{(a)}[16(k\!-\!1)\!:\!16k]\bigr) \quad \text{for } k = 1, \ldots, L/16 - 1. \end{aligned} \end{split}\]
Challenge Aggregation#
The partial contributions are aggregated and a shared challenge is derived
(derive_global_challenge_multi_air).
Lattice mode.
Sum all contribution vectors elementwise
(accumulate_contributions):
Elliptic-curve mode. Each contribution is mapped to a point on an elliptic curve \(E / \mathbb{F}_{p^5}\) via a hash-to-curve map, then all points are summed:
The aggregated value is \((P.x \,\|\, P.y) \in \F^{10}\).
Global challenge derivation.
From the aggregated value \(\kappa\) (or the curve-mode representation),
derive the global challenge
(derive_global_challenge):
Initialize a fresh transcript \(\T_G\).
\(\T_G.\abs(\mathrm{publics})\).
\(\T_G.\abs(\mathrm{proofValues}_{\mathrm{stage\,1}})\) (if any).
\(\T_G.\abs(\kappa)\).
Squeeze: \(\chi \leftarrow \T_G.\sq()\), yielding \(\chi \in \Fext\).
Every AIR instance then uses \(\chi\) as its transcript seed (as described in Transcript Seeding), binding all per-AIR proofs to the same shared randomness.
Global Constraints#
After all per-AIR proofs are generated, the system verifies cross-AIR consistency via global constraints. These enforce that airgroup values accumulated during individual AIR executions (such as \(\mathrm{gsum}\) and \(\mathrm{gprod}\) boundary values) satisfy the required aggregate relationships:
Sum type (logup): the sum of all \(\mathrm{gsum}\) boundary values across AIRs sharing a bus equals zero.
Product type (permutation): the product of all \(\mathrm{gprod}\) boundary values across AIRs sharing a bus equals one.
The concrete global constraints for a specific machine (e.g. bus balance equations, continuation anchoring) are defined by the machine specification. For the verification circuit that enforces these constraints, see the Recursion Pipeline (VadcopFinal).