Commitment Phase#
This section describes the prover’s commitment rounds: transcript seeding, witness commitment (Stage 1), after-challenge trace via LogUp (Stage 2), quotient computation (Stage Q), and the evaluation stage.
Transcript Seeding#
Before any commitment, the prover initializes the Fiat-Shamir transcript
(prove_stark):
Create a fresh
Challenger().Observe the verifying key’s
pre_hash(8 base field elements).Observe the number of AIRs as a single field element.
Observe each
air_idindividually.
The verifier performs identical seeding
(verify_stark).
Stage 1: Witness Commitment#
The prover commits the main execution trace:
Generate witness trace. For each AIR, produce a matrix of \(N\) rows and \(m\) columns, where each column is a witness polynomial \(f_j\) evaluated at the trace domain \(H\) (program-specific; see Part II).
Commit via PCS. Extend each column to the LDE domain via coset LDE, build an MMCS Merkle tree, and extract the root commitment \(r_1\) (
pcs_commit).Absorb into transcript. The prover observes (in order):
Public values for each AIR
Flattened preprocessed trace commitments (from the verifying key)
Main trace commitment \(r_1\)
\(\log_2(\text{degree})\) for each AIR
Stage 2: After-Challenge Trace (LogUp)#
If any AIR has bus interactions (lookups, permutations), the prover computes auxiliary columns using the FRI LogUp protocol.
Grind for LogUp PoW. Compute a proof-of-work witness for the interaction phase.
Sample interaction challenges. Draw two extension field challenges:
\(\alpha_{\text{lu}} \leftarrow \mathcal{T}.\text{sample\_ext}()\)
\(\beta_{\text{lu}} \leftarrow \mathcal{T}.\text{sample\_ext}()\)
Compute after-challenge trace. For each AIR with interactions, compute the log-derivative auxiliary columns (
compute_after_challenge_trace):a. Generate beta powers from \(\beta_{\text{lu}}\) for each interaction.
b. Evaluate constraint DAG at all rows to get field values needed by the interaction expressions.
c. Compute denominators for each interaction at each row: $\( d_i = \alpha_{\text{lu}} + m_0 + \beta_{\text{lu}} \cdot m_1 + \cdots + \beta_{\text{lu}}^{|m|} \cdot (\text{bus\_id} + 1) \)\( where \)m_0, m_1, \ldots$ are the interaction message fields.
d. Batch invert all denominators, then compute chunk sums (weighted by interaction counts).
e. Running sum \(\phi\): prefix sum of chunk sums. The cumulative sum (exposed value) must equal zero for a valid trace.
Observe exposed values (cumulative sums) into the transcript.
Commit after-challenge trace via PCS. Flatten FF4 columns to 4 base field columns each. Observe the commitment into the transcript.
Stage Q: Quotient Polynomial#
The prover computes and commits the quotient polynomial.
Sample \(\alpha\) from the transcript: \(\alpha \leftarrow \mathcal{T}.\text{sample\_ext}()\). This challenge combines all constraint polynomials via random linear combination.
Compute quotient chunks for each AIR (
compute_quotient_chunks):a. Create a disjoint quotient domain of size \(N \cdot d_Q\), where \(d_Q\) is the quotient degree.
b. Extend all traces (main, preprocessed, after-challenge) to the quotient domain via coset LDE.
c. Evaluate all constraints at every point of the quotient domain, accumulate with \(\alpha\)-powers using Horner’s method: $\( \text{accumulated}(x) = \sum_{i} \alpha^i \cdot C_i(x) \)$
d. Divide by the vanishing polynomial: $\( Q(x) = \frac{\text{accumulated}(x)}{Z_H(x)} \)$
e. Split the quotient evaluations into \(d_Q\) chunks of \(N\) values each, producing \(d_Q\) separate trace matrices.
Commit quotient chunks via PCS. Observe the commitment \(r_Q\) into the transcript.
DEEP Proof-of-Work#
After the quotient commitment, the prover grinds for a DEEP proof-of-work witness (separate from the LogUp PoW).
Evaluation Stage#
Sample \(\zeta\) from the transcript: \(\zeta \leftarrow \mathcal{T}.\text{sample\_ext}()\). This is the out-of-domain (OOD) evaluation point.
Open all polynomials at \(\zeta\) and \(\zeta \omega\) (the next-row point). For each committed matrix, the prover evaluates its columns at both points using polynomial evaluation from coefficients (
pcs_open):Round
Matrices
Points
Preprocessed
Per-AIR constant columns
\(\zeta\), \(\zeta\omega\)
Cached main
Per-partition trace columns
\(\zeta\), \(\zeta\omega\)
Common main
Shared trace columns
\(\zeta\), \(\zeta\omega\)
After-challenge
LogUp auxiliary columns
\(\zeta\), \(\zeta\omega\)
Quotient
Quotient chunks
\(\zeta\) only
Observe opened values into the transcript (done inside
pcs_open).Compute FRI reduced polynomial and run the FRI protocol to prove the opened values are consistent with the commitments (
prove_fri).