Introduction
In STARK-based proof systems, execution traces of computations are typically represented as structured arrays over a finite field. Specifically, we consider a trace matrix $M \in \mathbb{F}^{T \times w}$, where each row corresponds to the state of a virtual machine (VM) at a given timestep, and each column represents one of the $w$ registers of the machine.
A fundamental aspect of STARK proofs is verifying that this execution trace satisfies a predefined set of constraints. These constraints are typically expressed as a collection of multivariate polynomials, $\mathcal{P} = { P(x_1, ..., x_w, y_1, ..., y_w) }$, which enforce relations between successive rows of the trace. Formally, the prover must convince the verifier that for all $P \in \mathcal{P}$, the constraints hold across adjacent rows, i.e., $P(\vec{m}t, \vec{m}{t+1}) = 0$, where $\vec{m}_t$ denotes the state of the machine at timestep $t$.
However, polynomial constraints between adjacent rows are just one type of constraint that STARKs can enforce. These protocols also support boundary constraints and polynomial relations that extend beyond immediate row adjacency, enabling more flexible and expressive proof systems.
Extending STARKs with lookup arguments
While STARK protocols efficiently verify computations by enforcing polynomial constraints over an execution trace, they are inherently limited to operating on a single trace. This constraint introduces several challenges: