Trustless (S)NARKs

Inner Product with KZG

a_{1}
a_{2}
a_{3}
a_{5}
a_{6}
a_{8}
a_{4}
a_{7}
b_{1}
b_{2}
b_{3}
b_{4}
b_{5}
b_{6}
b_{7}
b_{8}
\vec{a}
\vec{b}
\omega^{0}
\omega^{1}
\omega^{2}
\omega^{3}
\omega^{4}
\omega^{5}
\omega^{6}
\omega^{7}
\mathbb{H}
  • We know \(\vec{a}\) and \(\vec{b}\) such that \(c = \langle \vec{a}, \vec{b} \rangle\)
  • To prove this using KZG, convert \(\vec{a}, \vec{b}\) to polynomials
a(X) = \sum_{i=1}^{8} \textcolor{lightgreen}{a_i} \cdot \textcolor{gray}{L_{\mathbb{H},i}(X)}
\begin{aligned} \textcolor{gray}{\textsf{KZG.open}}\left(m(X), \omega^0, c\right) \end{aligned}
b(X) = \sum_{i=1}^{8} \textcolor{orange}{b_i} \cdot \textcolor{gray}{L_{\mathbb{H},i}(X)}
  • Define a polynomial \(m(X) := \sum_{i=1}^{8} \textcolor{lightgreen}{a_i} \textcolor{orange}{b_i} \cdot \textcolor{gray}{L_{\mathbb{H},i}(X)}\)
  • Define \(r(X) = m(X) - a(z)b(X)\) for some \(z \in \mathbb{F}\)
  • Finally, just open the polynomials \(a, b, m, r\):
\begin{aligned} \textcolor{gray}{\textsf{KZG.open}}\Big(\big\{a(X), b(X), r(X)\big\}, z, \big\{\bar{a}, \bar{b}, 0\big\}\Big) \end{aligned}
  • Drawback: the trusted setup!

Inner Product: Main Idea

a_{1}
a_{2}
a_{3}
a_{5}
a_{6}
a_{8}
a_{4}
a_{7}
b_{1}
b_{2}
b_{3}
b_{4}
b_{5}
b_{6}
b_{7}
b_{8}
\vec{a}
\vec{b}
G_1
G_2
G_3
G_4
G_5
G_6
G_7
G_8
\vec{G}
  • Naive way: just send \(\vec{a},\vec{b}\) to the verifier
  • Randomly sample generators \(\vec{G}, \vec{H} \in \mathbb{G}^8\) and \(Q \in \mathbb{G}\)
  • Pedersen commitment to the vectors \(\vec{a}, \vec{b}\) as:
P := \langle \textcolor{lightgreen}{\vec{a}}, \textcolor{darkgreen}{\vec{G}} \rangle + \langle \textcolor{orange}{\vec{b}}, \textcolor{sienna}{\vec{H}} \rangle + \langle \textcolor{lightgreen}{\vec{a}}, \textcolor{orange}{\vec{b}} \rangle \textcolor{gray}{Q}
H_1
H_2
H_3
H_4
H_5
H_6
H_7
H_8
\vec{H}
x
x
x
x
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}
x
x
x
x
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}
= \langle \textcolor{gray}{x} \textcolor{red}{\vec{a}}, \textcolor{gray}{x^{\tiny-1}} \textcolor{red}{\vec{G}} \rangle + \langle \textcolor{gray}{x^{\tiny-1}} \textcolor{cyan}{\vec{a}}, \textcolor{gray}{x} \textcolor{cyan}{\vec{G}} \rangle \ +
\langle \textcolor{gray}{x^{\tiny-1}} \textcolor{red}{\vec{b}}, \textcolor{gray}{x} \textcolor{red}{\vec{H}} \rangle + \langle \textcolor{gray}{x} \textcolor{cyan}{\vec{b}}, \textcolor{gray}{x^{\tiny-1}} \textcolor{cyan}{\vec{H}} \rangle \ +
\big( \langle \textcolor{gray}{x} \textcolor{red}{\vec{a}}, \textcolor{gray}{x^{\tiny-1}} \textcolor{red}{\vec{b}} \rangle + \langle \textcolor{gray}{x^{\tiny-1}} \textcolor{cyan}{\vec{a}}, \textcolor{gray}{x} \textcolor{cyan}{\vec{b}} \rangle \big) \textcolor{gray}{Q}
= \Big\langle \big(\textcolor{gray}{x} \textcolor{red}{\vec{a}} + \textcolor{gray}{x^{\tiny-1}} \textcolor{cyan}{\vec{a}} \big), \big(\textcolor{gray}{x^{\tiny-1}} \textcolor{red}{\vec{G}} + \textcolor{gray}{x} \textcolor{cyan}{\vec{G}} \big) \Big\rangle - \textcolor{gray}{x^{\tiny2}} \langle \textcolor{red}{\vec{a}}, \textcolor{cyan}{\vec{G}} \rangle - \textcolor{gray}{x^{\tiny-2}} \langle \textcolor{cyan}{\vec{a}}, \textcolor{red}{\vec{G}} \rangle +
\Big\langle \big(\textcolor{gray}{x^{\tiny-1}} \textcolor{red}{\vec{b}} + \textcolor{gray}{x} \textcolor{cyan}{\vec{b}} \big), \big(\textcolor{gray}{x} \textcolor{red}{\vec{H}} + \textcolor{gray}{x^{\tiny-1}} \textcolor{cyan}{\vec{H}} \big) \Big\rangle - \textcolor{gray}{x^{\tiny2}} \langle \textcolor{cyan}{\vec{b}}, \textcolor{red}{\vec{H}} \rangle - \textcolor{gray}{x^{\tiny-2}} \langle \textcolor{red}{\vec{b}}, \textcolor{cyan}{\vec{H}} \rangle +
\Big\langle \big(\textcolor{gray}{x} \textcolor{red}{\vec{a}} + \textcolor{gray}{x^{\tiny-1}} \textcolor{cyan}{\vec{a}} \big), \big(\textcolor{gray}{x^{\tiny-1}} \textcolor{red}{\vec{b}} + \textcolor{gray}{x} \textcolor{cyan}{\vec{b}} \big) \Big\rangle \textcolor{gray}{Q} - \textcolor{gray}{x^{\tiny2}} \langle \textcolor{red}{\vec{a}}, \textcolor{cyan}{\vec{b}} \rangle \textcolor{gray}{Q} - \textcolor{gray}{x^{\tiny-2}} \langle \textcolor{cyan}{\vec{a}}, \textcolor{red}{\vec{b}} \rangle \textcolor{gray}{Q}
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}
x
x
x
x
x
x
x
x
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}

Inner Product: Main Idea

a_{1}
a_{2}
a_{3}
a_{5}
a_{6}
a_{8}
a_{4}
a_{7}
b_{1}
b_{2}
b_{3}
b_{4}
b_{5}
b_{6}
b_{7}
b_{8}
\vec{a}
\vec{b}
G_1
G_2
G_3
G_4
G_5
G_6
G_7
G_8
\vec{G}
  • Naive way: just send \(\vec{a},\vec{b}\) to the verifier
  • Randomly sample generators \(\vec{G}, \vec{H} \in \mathbb{G}^8\) and \(Q \in \mathbb{G}\)
  • Pedersen commitment to the vectors \(\vec{a}, \vec{b}\) as:
P := \langle \textcolor{lightgreen}{\vec{a}}, \textcolor{darkgreen}{\vec{G}} \rangle + \langle \textcolor{orange}{\vec{b}}, \textcolor{sienna}{\vec{H}} \rangle + \langle \textcolor{lightgreen}{\vec{a}}, \textcolor{orange}{\vec{b}} \rangle \textcolor{gray}{Q}
H_1
H_2
H_3
H_4
H_5
H_6
H_7
H_8
\vec{H}
x
x
x
x
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}
x
x
x
x
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}
= \Big\langle \big(\textcolor{gray}{x} \textcolor{red}{\vec{a}} + \textcolor{gray}{x^{\tiny-1}} \textcolor{cyan}{\vec{a}} \big), \big(\textcolor{gray}{x^{\tiny-1}} \textcolor{red}{\vec{G}} + \textcolor{gray}{x} \textcolor{cyan}{\vec{G}} \big) \Big\rangle - \textcolor{gray}{x^{\tiny2}} \langle \textcolor{red}{\vec{a}}, \textcolor{cyan}{\vec{G}} \rangle - \textcolor{gray}{x^{\tiny-2}} \langle \textcolor{cyan}{\vec{a}}, \textcolor{red}{\vec{G}} \rangle +
\Big\langle \big(\textcolor{gray}{x^{\tiny-1}} \textcolor{red}{\vec{b}} + \textcolor{gray}{x} \textcolor{cyan}{\vec{b}} \big), \big(\textcolor{gray}{x} \textcolor{red}{\vec{H}} + \textcolor{gray}{x^{\tiny-1}} \textcolor{cyan}{\vec{H}} \big) \Big\rangle - \textcolor{gray}{x^{\tiny2}} \langle \textcolor{cyan}{\vec{b}}, \textcolor{red}{\vec{H}} \rangle - \textcolor{gray}{x^{\tiny-2}} \langle \textcolor{red}{\vec{b}}, \textcolor{cyan}{\vec{H}} \rangle +
\Big\langle \big(\textcolor{gray}{x} \textcolor{red}{\vec{a}} + \textcolor{gray}{x^{\tiny-1}} \textcolor{cyan}{\vec{a}} \big), \big(\textcolor{gray}{x^{\tiny-1}} \textcolor{red}{\vec{b}} + \textcolor{gray}{x} \textcolor{cyan}{\vec{b}} \big) \Big\rangle \textcolor{gray}{Q} - \textcolor{gray}{x^{\tiny2}} \langle \textcolor{red}{\vec{a}}, \textcolor{cyan}{\vec{b}} \rangle \textcolor{gray}{Q} - \textcolor{gray}{x^{\tiny-2}} \langle \textcolor{cyan}{\vec{a}}, \textcolor{red}{\vec{b}} \rangle \textcolor{gray}{Q}
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}
x
x
x
x
x
x
x
x
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}
x^{\tiny -1}
= \textcolor{gray}{\textsf{PED.commit}(} \textcolor{lightgreen}{\vec{a}_{\textsf{half}}}, \textcolor{darkgreen}{\vec{G}_{\textsf{half}}}, \textcolor{orange}{\vec{b}_{\textsf{half}}}, \textcolor{sienna}{\vec{H}_{\textsf{half}}} \textcolor{gray}{)} - \textcolor{gray}{x^{\tiny 2}}L_1 - \textcolor{gray}{x^{\tiny -2}}R_1
  • Now we only need to send \((\textcolor{lightgreen}{\vec{a}_{\textsf{half}}}, \textcolor{sienna}{\vec{b}_{\textsf{half}}}, L_1, R_1)\)
  • Recursion leads to \((L_1, R_1, L_2, R_2, L_3, R_3, \textcolor{lightgreen}{a_{\textsf{last}}}, \textcolor{sienna}{b_{\textsf{last}}})\)

IPA Prover

  • For \(j\in \lceil \text{log}_2(N) \rceil\), the prover starts by setting \(n = N/2\):
{\small\circ} \ L_j = \langle \textcolor{red}{\vec{a}}, \textcolor{cyan}{\vec{G}} \rangle + \langle \textcolor{cyan}{\vec{b}}, \textcolor{red}{\vec{H}} \rangle + \langle \textcolor{red}{\vec{a}}, \textcolor{cyan}{\vec{b}} \rangle \textcolor{gray}{Q}
{\small\circ} \ (\textcolor{red}{\vec{a}} \ \| \ \textcolor{cyan}{\vec{a}}) \leftarrow \textcolor{lightgreen}{\vec{a}}, \quad (\textcolor{red}{\vec{b}} \ \| \ \textcolor{cyan}{\vec{b}}) \leftarrow \textcolor{orange}{\vec{b}}
{\small\circ} \ (\textcolor{red}{\vec{G}} \ \| \ \textcolor{cyan}{\vec{G}}) \leftarrow \textcolor{darkgreen}{\vec{G}}, \quad (\textcolor{red}{\vec{H}} \ \| \ \textcolor{cyan}{\vec{H}}) \leftarrow \textcolor{sienna}{\vec{H}}
{\small\circ} \ R_j = \langle \textcolor{cyan}{\vec{a}}, \textcolor{red}{\vec{G}} \rangle + \langle \textcolor{red}{\vec{b}}, \textcolor{cyan}{\vec{H}} \rangle + \langle \textcolor{cyan}{\vec{a}}, \textcolor{red}{\vec{b}} \rangle \textcolor{gray}{Q}
{\small\circ} \ \textcolor{lightgreen}{\vec{a}_{\textsf{next}}} = \big(\textcolor{gray}{x} \textcolor{red}{\vec{a}} + \textcolor{gray}{x^{\tiny-1}} \textcolor{cyan}{\vec{a}} \big), \quad \textcolor{darkgreen}{\vec{G}_{\textsf{next}}} = \big(\textcolor{gray}{x^{\tiny-1}} \textcolor{red}{\vec{G}} + \textcolor{gray}{x} \textcolor{cyan}{\vec{G}} \big)
{\small\circ} \ \textcolor{orange}{\vec{b}_{\textsf{next}}} = \big(\textcolor{gray}{x^{\tiny-1}} \textcolor{red}{\vec{b}} + \textcolor{gray}{x} \textcolor{cyan}{\vec{b}} \big), \quad \ \textcolor{sienna}{\vec{H}_{\textsf{next}}} = \big(\textcolor{gray}{x} \textcolor{red}{\vec{H}} + \textcolor{gray}{x^{\tiny-1}} \textcolor{cyan}{\vec{H}} \big)
  • Prover work: \(\mathcal{O}(N) \equiv \sum_{j \in  \lceil \text{log}_2(N) \rceil}4n_j\)
  • Proof size: \(\mathbb{G} \rightarrow 2 \lceil \text{log}_2(N) \rceil, \ \mathbb{F} \rightarrow 2\)
\textcolor{gray}{\textsf{MSM}:} (2n+1)
\textcolor{gray}{\textsf{MSM}:} (2n+1)
\textcolor{gray}{\textsf{MSM}:} (2n)
\textcolor{gray}{\textsf{MSM}:} (2n)

IPA Verifier

  • Given a proof \((\{L_j,R_j\}_{j \in  \lceil \text{log}_2(N) \rceil}, a, b)\), verifier starts by setting: \(P_{\textsf{acc}} = P\)
{\small\circ} \ \textcolor{darkgreen}{\vec{G}_{\textsf{next}}} = \big(\textcolor{gray}{x^{\tiny-1}} \textcolor{red}{\vec{G}} + \textcolor{gray}{x} \textcolor{cyan}{\vec{G}} \big)
{\small\circ} \ \textcolor{sienna}{\vec{H}_{\textsf{next}}} = \big(\textcolor{gray}{x} \textcolor{red}{\vec{H}} + \textcolor{gray}{x^{\tiny-1}} \textcolor{cyan}{\vec{H}} \big)
  • Verifier work: \(\mathcal{O}(N) \equiv \sum_{j \in  \lceil \text{log}_2(N) \rceil}2n_j\)
  • Verifier in KZG was \(\mathcal{O}(1)\) 😳
\textcolor{gray}{\textsf{MSM}:} (2n)
\textcolor{gray}{\textsf{MSM}:} (2n)
{\small\circ} \ P_{\textsf{next}} = \textcolor{gray}{x^2}L_j + P_{\textsf{acc}} + \textcolor{gray}{x^{-2}}R_j
{\small\circ} \ P_{\textsf{acc}} \leftarrow P_{\textsf{next}}
{\small\circ} \ P_{\textsf{acc}} \stackrel{?}{=} a \textcolor{darkgreen}{G_{\textsf{last}}} + b \textcolor{sienna}{H_{\textsf{last}}} + \langle a, b \rangle \textcolor{gray}{Q}
  • After \(\lceil \text{log}_2(N) \rceil\) rounds, final verification check:

IPA Efficient Verifier

  • Verifier needs \(\textcolor{gray}{\textsf{MSM:}} \ 2\lceil \text{log}_2(N) \rceil+1\) to compute \(P_{\textsf{acc}}\)
  • Note that \(\textcolor{darkgreen}{G_{\textsf{last}}}\) and \(\textcolor{sienna}{H_{\textsf{last}}}\) only depend on \(\textcolor{darkgreen}{\vec{G}}, \textcolor{sienna}{\vec{H}}\) and challenges
a \textcolor{darkgreen}{G_{\textsf{last}}} + b \textcolor{sienna}{H_{\textsf{last}}} + \langle a, b \rangle \textcolor{gray}{Q} \stackrel{?}{=} P_{\textsf{acc}}
  • After \(\lceil \text{log}_2(N) \rceil\) rounds, final verification check:
\bigg( \textcolor{gray}{x_m^2}L_m + \dots + \Big( \textcolor{gray}{x_2^2}L_2 + \big(\textcolor{gray}{x_1^2}L_1 + P + \textcolor{gray}{x_1^{-2}}R_1\big) + \textcolor{gray}{x_2^{-2}}R_2 \Big) + \dots + \textcolor{gray}{x_m^2}L_m \bigg)
\underbrace{\hspace{5cm}}_{P_1}
\underbrace{\hspace{10cm}}_{P_2}
\underbrace{\hspace{19cm}}_{P_m}
\textcolor{darkgreen}{G_{\textsf{last}}} = \textcolor{gray}{x_1^{-1}x_2^{-1}x_3^{-1}}G_1 + \textcolor{gray}{x_1^{-1}x_2^{-1}x_3^{1}}G_2 + \textcolor{gray}{x_1^{-1}x_2^{1}x_3^{-1}}G_3 + \textcolor{gray}{x_1^{-1}x_2^{1}x_3^{1}}G_4 \ +
\textcolor{gray}{x_1^{1}x_2^{-1}x_3^{-1}}G_5 + \textcolor{gray}{x_1^{1}x_2^{-1}x_3^{1}}G_6 + \textcolor{gray}{x_1^{1}x_2^{1}x_3^{-1}}G_7 + \textcolor{gray}{x_1^{1}x_2^{1}x_3^{1}}G_8.
  • Total verifier work \(\textcolor{gray}{\textsf{MSM:}} \ 2N + 2\lceil \text{log}_2(N) \rceil+1\)

Impact of IPA

Trustless

Trusted

Setup

IPA to PCS

f(X) = a_1 + a_2X + a_3X^2 + \dots + a_{d-1}X^{d-1}
v := f(z) = a_1 + a_2z + a_3z^2 + \dots + a_{d-1}z^{d-1}
= \langle \vec{a}, \vec{z} \rangle
\begin{aligned} \textcolor{gray}{\textsf{IPApoly.commit}}\left(f(X)\right) \equiv \quad P := \langle \vec{a}, \textcolor{darkgreen}{\vec{G}} \rangle \end{aligned}
\begin{aligned} \textcolor{gray}{\textsf{IPApoly.open}}\left(f(X), z, v\right) \equiv \ \pi_{\textsf{IPA}} = \textcolor{gray}{\textsf{IPA}}(\mathcal{R}) \end{aligned}
\mathcal{R} = \left\{ ((P, z, v); \ \vec{a}) \ | \ P = \langle \vec{a}, \textcolor{darkgreen}{\vec{G}} \rangle \ \wedge \ v = \langle \vec{a}, \vec{z} \rangle \right\}
\begin{aligned} \textcolor{gray}{\textsf{IPApoly.verify}}\left(\pi_{\textsf{IPA}}, z, v\right) \equiv \ \{0,1\} \leftarrow \textcolor{gray}{\textsf{IPA.verify}}(\mathcal{R}) \end{aligned}
  • Here, we just need one generator vector \(\textcolor{darkgreen}{\vec{G}}\) (read: smaller overall MSM)
  • With the Inner-product argument, we can derive a PCS:

Halo2 Recursion

\begin{aligned} a \textcolor{red}{G_{\textsf{last}}} + a\textcolor{red}{b}\textcolor{gray}{Q} \stackrel{?}{=} P + v\textcolor{gray}{Q} \sum_{j \in \lceil \text{log}(d) \rceil} (\textcolor{gray}{x_j^2} L_j + \textcolor{gray}{x_j^{-2}}R_j) \end{aligned}
  • RHS is \(\mathcal{O}(\text{log}(d))\) but LHS is still \(\mathcal{O}(d)\) as \(\textcolor{darkgreen}{G_{\textsf{last}}} = \langle \vec{s}, \textcolor{darkgreen}{\vec{G}} \rangle,  b = \langle \vec{s}, \vec{z} \rangle\)
  • We can write \(\vec{s}\) as the polynomial:
  • The IPA PCS verification equation:
\textcolor{darkgreen}{G_{\textsf{last}}} = \langle \overbrace{ \begin{pmatrix} \textcolor{gray}{x_m^{-1}} \textcolor{gray}{x_{m-1}^{-1}} \textcolor{gray}{\dots} \textcolor{gray}{x_3^{-1}} \textcolor{gray}{x_2^{-1}} \textcolor{gray}{x_1^{-1}} \\[5pt] \textcolor{gray}{x_m^{-1}} \textcolor{gray}{x_{m-1}^{-1}} \textcolor{gray}{\dots} \textcolor{gray}{x_3^{-1}} \textcolor{gray}{x_2^{-1}} \textcolor{gray}{x_1}^{1} \\[5pt] \textcolor{gray}{x_m^{-1}} \textcolor{gray}{x_{m-1}^{-1}} \textcolor{gray}{\dots} \textcolor{gray}{x_3^{-1}} \textcolor{gray}{x_2}^{1} \textcolor{gray}{x_1}^{1} \\[5pt] \textcolor{gray}{x_m^{-1}} \textcolor{gray}{x_{m-1}^{-1}} \textcolor{gray}{\dots} \textcolor{gray}{x_3}^{1} \textcolor{gray}{x_2^{-1}} \textcolor{gray}{x_1^{-1}} \\ \textcolor{gray}{\vdots} \\ \textcolor{gray}{x_m}^1 \textcolor{gray}{x_{m-1}}^1 \textcolor{gray}{\dots} \textcolor{gray}{x_3}^1 \textcolor{gray}{x_2}^{1} \textcolor{gray}{x_1^{-1}} \\[5pt] \textcolor{gray}{x_m}^1 \textcolor{gray}{x_{m-1}}^1 \textcolor{gray}{\dots} \textcolor{gray}{x_3}^1 \textcolor{gray}{x_2}^{1} \textcolor{gray}{x_1}^{1} \end{pmatrix} }^{\vec{s}}, \textcolor{darkgreen}{\vec{G}} \rangle
\begin{aligned} s(X) = \prod_{j\in [k]} \left(\textcolor{gray}{x_{j}^{1}} + \textcolor{gray}{x_{j}^{-1}}X^{2^{i-1}} \right) \end{aligned}
  • Thus, the verifier can compute \(b\) in \(\mathcal{O}(\text{log}(d))\)
  • What about \(\textcolor{darkgreen}{G_{\textsf{last}}}\)? It cannot!
  • But the prover can send \(\textcolor{darkgreen}{G_{\textsf{last}}}\) with a proof that it was correctly computed!

Halo2 Recursion

\begin{aligned} a^{(1)} \textcolor{orange}{G_{\textsf{last}}^{(1)}} + a^{(1)}\textcolor{red}{b^{(1)}}\textcolor{gray}{Q} \stackrel{?}{=} P^{(1)} + v^{(1)}\textcolor{gray}{Q} + \sum_{j \in [m]} \left( \textcolor{gray}{\big(x_j^{\tiny(1)}\big)^2} L_j^{(1)} + \textcolor{gray}{\big(x_j^{\tiny(1)}\big)^{-2}}R_j^{(1)} \right) \end{aligned}
\begin{aligned} \pi_1 = \left\{ \left\{ L_j^{(1)}, R_j^{(1)} \right\}_{j \in [m]}, a^{(1)}, \textcolor{orange}{G_{\textsf{last}}^{(1)}} \right\} \end{aligned}
\begin{aligned} \pi_2 = \left\{ \left\{ L_j^{(2)}, R_j^{(2)} \right\}_{j \in [m]}, a^{(2)}, \textcolor{lightgreen}{G_{\textsf{last}}^{(2)}}, \ \pi_{\textcolor{orange}{G_\textsf{last}^{(1)}}} \right\} \end{aligned}
\begin{aligned} \pi_3 = \left\{ \left\{ L_j^{(3)}, R_j^{(3)} \right\}_{j \in [m]}, a^{(3)}, \textcolor{yellow}{G_{\textsf{last}}^{(3)}}, \ \pi_{\textcolor{lightgreen}{G_\textsf{last}^{(2)}}} \right\} \end{aligned}
\begin{aligned} \pi_4 = \left\{ \left\{ L_j^{(4)}, R_j^{(4)} \right\}_{j \in [m]}, a^{(4)}, \textcolor{violet}{G_{\textsf{last}}^{(4)}}, \ \pi_{\textcolor{yellow}{G_\textsf{last}^{(3)}}} \right\} \end{aligned}
\begin{aligned} a^{(2)} \textcolor{lightgreen}{G_{\textsf{last}}^{(2)}} + a^{(2)}\textcolor{red}{b^{(2)}}\textcolor{gray}{Q} \stackrel{?}{=} P^{(2)} + v^{(2)}\textcolor{gray}{Q} + \sum_{j \in [m]} \left( \textcolor{gray}{\big(x_j^{\tiny(2)}\big)^2} L_j^{(2)} + \textcolor{gray}{\big(x_j^{\tiny(2)}\big)^{-2}}R_j^{(2)} \right) \end{aligned}
\begin{aligned} a^{(3)} \textcolor{yellow}{G_{\textsf{last}}^{(3)}} + a^{(3)}\textcolor{red}{b^{(3)}}\textcolor{gray}{Q} \stackrel{?}{=} P^{(3)} + v^{(3)}\textcolor{gray}{Q} + \sum_{j \in [m]} \left( \textcolor{gray}{\big(x_j^{\tiny(3)}\big)^2} L_j^{(3)} + \textcolor{gray}{\big(x_j^{\tiny(3)}\big)^{-2}}R_j^{(3)} \right) \end{aligned}
\begin{aligned} a^{(4)} \textcolor{violet}{G_{\textsf{last}}^{(4)}} + a^{(4)}\textcolor{red}{b^{(4)}}\textcolor{gray}{Q} \stackrel{?}{=} P^{(4)} + v^{(4)}\textcolor{gray}{Q} + \sum_{j \in [m]} \left( \textcolor{gray}{\big(x_j^{\tiny(4)}\big)^2} L_j^{(4)} + \textcolor{gray}{\big(x_j^{\tiny(4)}\big)^{-2}}R_j^{(4)} \right) \end{aligned}
\begin{aligned} \pi_M = \left\{ \left\{ L_j^{(M)}, R_j^{(M)} \right\}_{j \in [m]}, a^{(M)}, \textcolor{blue}{G_{\textsf{last}}^{(M)}} \right\} \end{aligned}
\vdots
\begin{aligned} a^{(M)} \textcolor{blue}{G_{\textsf{last}}^{(M)}} + a^{(M)}\textcolor{red}{b^{(M)}}\textcolor{gray}{Q} \stackrel{?}{=} P^{(M)} + v^{(M)}\textcolor{gray}{Q} + \sum_{j \in [m]} \left( \textcolor{gray}{\big(x_j^{\tiny(M)}\big)^2} L_j^{(M)} + \textcolor{gray}{\big(x_j^{\tiny(M)}\big)^{-2}}R_j^{(M)} \right) \end{aligned}
\begin{aligned} \textcolor{red}{G_{\textsf{last}}^{(M)}} \stackrel{?}{=} \textcolor{blue}{G_{\textsf{last}}^{(M)}} \end{aligned}

Trustless (S)NARKs

By Suyash Bagad