{%hackmd theme-dark %} $$ \DeclareMathOperator{\originpoints}{\texttt{origin_points}} \DeclareMathOperator{\ladder}{\texttt{ladder}} \DeclareMathOperator{\idaccum}{\texttt{accumulator_identity}} \DeclareMathOperator{\idxalpha}{\texttt{x_alpha_identity}} \DeclareMathOperator{\idxaccum}{\texttt{x_accumulator_identity}} \DeclareMathOperator{\idyaccum}{\texttt{y_accumulator_identity}} \DeclareMathOperator{\idaccuminit}{\texttt{accumulator_init_identity}} \DeclareMathOperator{\idxinit}{\texttt{x_init_identity}} \DeclareMathOperator{\idyinit}{\texttt{y_init_identity}} \DeclareMathOperator{\idgate}{\texttt{gate_identity}} \DeclareMathOperator{\ecc}{\text{ecc}} \DeclareMathOperator{\grumpkin}{\text{grumpkin}} $$ # Gates in Turbo Plonk **Disclaimer:** This documentation was written on July, 2021. It is intended to give readers a high-level understanding. The codebase is the canonical source of truth, and over time this document might fall behind the implementation details of the code. ###### tags: `plookup` Original author: Cody ## TurboFixedBaseWidget A reference for this widget is https://app.gitbook.com/@aztec-protocol/s/zkproofs-proposal/. This is the basis of the fixed group addition implementation. What follows uses the notation in Barretenberg. Preliminaries: $\delta = w_{4\omega} - 4w_4$ and $b_{\grumpkin} = -17$. ### Linear terms The contribution to the quotient polynomial is $q_{\ecc, 1}$ times the sum of the products formed by multiplying the non-$i$ row values of the table that follows. | $i$ | selector | $\alpha^?$ | coefficient | | --- | -------- | ---------- | ----------------------------------------------- | | 0 | $q_m$ | $\alpha^6$ | $w_3 q_c$ | | 1 | $q_1$ | $\alpha^1$ | $\delta^2$ | | 2 | $q_2$ | $\alpha^1$ | $1$ | | 3 | $q_3$ | $\alpha^2$ | $\delta w_{3,\omega} \cdot 2w_2$ | | 3 | $q_3$ | $\alpha^3$ | $\delta w_{3,\omega} \cdot (w_{1,\omega}-w_1)$ | | 4 | $q_4$ | $\alpha^5$ | $w_3 q_c$ | | 5 | $q_5$ | $\alpha^5$ | $(1-w_4) q_c$ | ### Nonlinear terms This is a sum of seven terms. The contribution to the quotient polynomial is \begin{aligned} q_{\ecc, 1}\cdot \Big(&q_c\cdot(\idaccuminit + \idxinit + \idyinit) \\ &+\idaccum + \idxalpha \\ &+ \idxaccum + \idyaccum\Big), \end{aligned} where the terms that appear are obtained by multiplying the non-name columns of a given row in the table that follows. | identity name | $\alpha^?$ | coefficient | | ------------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------- | | $\idaccum$ | $1$ | $(\delta-1)(\delta+1)(\delta-3)(\delta+3)$ | | $\idxalpha$ | $\alpha^1$ | $-w_{3,\omega}$ | | $\idxaccum$ | $\alpha^2$ | $(w_{3,\omega}-w_1)^2 (w_{3,\omega}+w_{1,\omega}+w_1) - (w_{3,\omega}^3 + w_{2}^2 + b_{\grumpkin}) + 2\delta w_{2}q_{\ecc,1}$ | | $\idyaccum$ | $\alpha^3$ | $(w_{2, \omega} + w_2)(w_{3,\omega}-w_1) + (w_2-q_{\ecc,1}\delta)(w_{1}-w_{1,\omega})$ | | $\idaccuminit$ | $\alpha^4$ | $(w_{4}-1)(w_{4}-1-w_{3})$ | | $\idxinit$ | $\alpha^5$ | $-w_{1}w_{3}$ | | $\idyinit$ | $\alpha^6$ | $(1-w_{4})q_{c}-w_{2}w_{3}$ | ## Altogether The contribution to the quotient polynomial is $q_{\ecc,1}$ times the expression that follows. \begin{aligned} 1 & \cdot (\delta-1)(\delta+1)(\delta-3)(\delta+3) + \\ \alpha \cdot & (q_1\delta^2 + q_2 - w_{3,\omega}) +\\ \alpha^{2} \cdot &((w_{3,\omega}-w_1)^2 (w_{3,\omega}+w_{1,\omega}+w_1) - (w_{3,\omega}^3 + w_{2}^2 + b_{\grumpkin}) + 2\delta w_2 q_{\ecc,1} + q_3\delta w_{3,\omega} \cdot 2w_2) + \\ \alpha^{3} \cdot &\big((w_{2, \omega} + w_2)(w_{3,\omega}-w_1) + (w_2-q_{\ecc,1}\delta)(w_{1}-w_{1,\omega})+ q_3\delta w_{3,\omega} \cdot (w_{1,\omega}-w_1)\big) + \\ \alpha^{4} \cdot &q_c\cdot(w_{4}-1)(w_{4}-1-w_{3})+ \\ \alpha^{5} \cdot &q_c\cdot(q_4 w_3 + q_5(1-w_4)-w_{1}w_{3})+ \\ \alpha^{6} \cdot &q_c\cdot((1-w_{4})q_{c}-w_{2}w_{3} + q_m w_3) \\ \end{aligned} Slightly cleaned to match with gitbook: \begin{aligned} &\texttt{// accumulated digit is one of $\pm 1,\, \pm 3$} \\ 1 \cdot & (\delta-1)(\delta+1)(\delta-3)(\delta+3) \\ +&\texttt{ // $w_{3,\omega}$ is the $x$-coordinate of the point to be added } \\ \alpha \cdot & (q_1\delta^2 + q_2 - w_{3,\omega}) \\ +&\texttt{ // $w_{1, \omega}$ is the $x$-coordinate of the new point} \\ \alpha^{2} \cdot &((w_{3,\omega}-w_1)^2 (w_{3,\omega}+w_{1,\omega}+w_1) - (w_{3,\omega}^3 + w_{2}^2 + b_{\grumpkin}) + 2\delta w_2 (q_3w_{3,\omega} + q_{\ecc,1})) \\ +&\texttt{ // $w_{2, \omega}$ is the $y$-coordinate of the new point} \\ \alpha^{3} \cdot &\big((w_{2, \omega} + w_2)(w_{3,\omega}-w_1) - (\delta(w_{3,\omega}q_3 + q_{\ecc,1}) - w_2)(w_{1}-w_{1,\omega}) \big)\\ +&\texttt{ // init only: switch $ = 1-w_4$ is $0$ or $-w_3$} \\ \alpha^{4} \cdot &q_c\cdot(1-w_{4})(1-w_{4}+w_{3}) \\ +&\texttt{ // init only: $x$-coordinate is origin_points[0].x or} \\ &\texttt{ // origin_points[1].x, depending on value of switch} \\ \alpha^{5} \cdot &q_c\cdot(w_3 (q_4 - w_1) + q_5(1-w_4)) \\ +&\texttt{ // init only: $y$-coordinate is origin_points[0].y,} \\ &\texttt{ // or origin_points[1].y, depending on value of switch} \\ \alpha^{6} \cdot &q_c\cdot(w_3(q_m - w_{2}) + q_{c}(1-w_{4})) \\ \end{aligned} # Additional commentary ## Initialization Following the notation of `stdlib/pedersen/pedersen.cpp`, this is the case where $i=0$. The code is divided into two branches depending on the parity of `scalar`. Regardless of cases, set $q_{z,j} = \texttt{ladder[1].q_z_j}$ for $z=x,y$ and $j=1,2$. For brevity, set $P_{k,z} := \originpoints[k].z$ for $k=0,\,1$, $z= x,\, y$. Then, when initializing, we set gates as follows: | Selector | $q_4$ | $q_5$ | $q_m$ | $q_c$ | | ------------- | ---- | --- | --- | -------- | | Value at init | $P_{0, x}$ | $P_{0,x}-P_{1,x}$ | $P_{0, y}$ | $P_{0,y}-P_{1,y}$ | The first row the Turbo Plonk execution trace table depends on cases. The special initialization selectors are chosen to allow switching between those cases. ### Case: scalar is even If `scalar` is even, i.e. if `skew=0`, then the first row is set to be (where $n=127$) $$((w_1, w_2), w_3, w_4) = ((4^{n-1}+1)g, 4^{-n}, 1 + 4^{-n}).$$ In this case, $1-w_4 = -w_3$, and the $\alpha^5$ and $\alpha^6$ parts of the polynomial are $$ \alpha^{5} q_cw_3\cdot(q_4 - q_5 - w_1 ) = \alpha^{5} q_{c} 4^{-n}\cdot(P_{1,x}-x) $$ and $$ \alpha^{6} \cdot q_c\cdot w_3 \cdot(q_{m} - q_c - w_{2}) = \alpha^{6} \cdot q_c\cdot 4^{-n} \cdot(P_{1, y} - y) $$ In our implementation, we ensure that $q_c$ is nonzero (by validing our generator choices satisfy this) and that $w_3$ is nonzero (by setting it to a nonzero circuit constant). Hence the two terms above impose that the initial value of $(w_1, w_2)$ is $(4^{n}+1)g$. ### Case: scalar is odd If `scalar` is odd, i.e. if `skew=1`, then the first row is required to be (where $n=127$) $$((w_1, w_2), w_3, w_4) = (4^{n-1}g, 4^{-n}, 1).$$ In this case, $1-w_4 = 0$, and the $\alpha^5$ and $\alpha^6$ parts of the polynomial are $$ \alpha^{5} q_cw_3\cdot(q_4 - w_1 ) = \alpha^{5} q_{c} 4^{-n}\cdot(P_{0,x}-x) $$ and $$ \alpha^{6} \cdot q_c\cdot w_3 \cdot(q_{m} - w_{2}) = \alpha^{6} \cdot q_c\cdot 4^{-n} \cdot(P_{0, y} - y) $$ In our implementation, we ensure that $q_c$ is nonzero (by validing our generator choices satisfy this) and that $w_3$ is nonzero (by setting it to a nonzero circuit constant). Hence the two terms above impose that the initial value of $(w_1, w_2)$ is $4^{n}g$.