---
tags: note
---
# Note - Plonk / TurboPlonk / UltraPlonk
## Plonk
$$
\mathcal{R}\mathsf{snark}(\lambda) =
\left\{
\begin{array}{l}
\\
(x, w, crs) =
\left(
\begin{array}{l}
(w_i)_{i \in [\ell]}, \\
(w_i)_{i = 1, i \not\in [\ell]}^{3n}, \\
(q_{M_i}, q_{L_i}, q_{R_i}, q_{O_i}, q_{C_i})_{i=1}^{n}, n, \sigma(x)
\end{array}
\right) \\\\
\begin{align}
\text{For all}\ i \in \{1, \dots, 3n\} &: w_i \in \mathbb{F}_p, \text{and} \\
\text{for all}\ i \in \{1, \dots, 3n\} &: w_i = w_{\sigma(i)}, \text{and} \\
\text{for all}\ i \in \{1, \dots, n\} &:
w_iw_{n+i}q_{M_i} + w_iq_{L_i} + w_{n+i}q_{R_i} + w_{2n+i}q_{O_i} + q_{C_i} = 0 \\
\end{align}
\end{array}
\right\}
$$
### Setup
==TODO==
### Prove
1. Compute wire polynomials $\mathsf{a}(X)$, $\mathsf{b}(X)$, $\mathsf{c}(X)$ with randomnesses $b_{1-6}$
$$
\begin{align}
& \mathsf{a}(X) = (b_1X + b_2)\mathsf{Z_H}(X) + \sum_{i=1}^nw_i\mathsf{L_i}(X) \\
& \mathsf{b}(X) = (b_3X + b_4)\mathsf{Z_H}(X) + \sum_{i=1}^nw_{n+i}\mathsf{L_i}(X) \\
& \mathsf{c}(X) = (b_5X + b_6)\mathsf{Z_H}(X) + \sum_{i=1}^nw_{2n+i}\mathsf{L_i}(X) \\
\end{align}
$$
Output $[a]_1 = [\mathsf{a}(x)]_1$, $[b]_1 = [\mathsf{b}(x)]_1$, $[c]_1 = [\mathsf{c}(x)]_1$
2. Compute permutation polynomial $\mathsf{z}(X)$ with randomnesses $b_{7-9}$ and challenge $(\beta, \gamma)$
$$
\begin{align}
\mathsf{z}(X) & = (b_7X^2 + b_8X + b9)Z_H(X) + \mathsf{L_1}(X) \\
& \quad + \sum_{i=1}^{n-1}\big(\mathsf{L_{i+1}}(X)\prod_{j=1}^i\frac{w_j + \beta\omega^{j-1} + \gamma}{w_j + \sigma(j)\beta + \gamma}\frac{w_{n+j} + \beta k_1\omega^{j-1} + \gamma}{w_{n+j} + \sigma(n+j)\beta + \gamma}\frac{w_{2n+j} + \beta k_2\omega^{j-1} + \gamma}{w_{2n+j} + \sigma(2n+j)\beta + \gamma} \big)
\end{align}
$$
Output $[z]_1 = [\mathsf{z}(x)]_1$
3. Compute quotient polynomial $\mathsf{t}(X)$ with challenge $\alpha$
$$
\begin{align}
\mathsf{t}(X) & = (\mathsf{a}(X)\mathsf{b}(X)\mathsf{q_M}(X) + \mathsf{a}(X)\mathsf{q_L}(X) + \mathsf{b}(X)\mathsf{q_R}(X) + \mathsf{c}(X)\mathsf{q_O}(X) + \mathsf{PI}(X) + \mathsf{q_C}(X))\frac{1}{\mathsf{Z_H}(X)} \\
& \quad + ((\mathsf{a}(X) + \beta X + \gamma)(\mathsf{b}(X) + \beta k_1X + \gamma)(\mathsf{c} + \beta k_2X + \gamma)\mathsf{z}(X))\frac{\alpha}{\mathsf{Z_H}(X)} \\
& \quad - ((\mathsf{a}(X) + \beta \mathsf{S_{\sigma_1}}(X) + \gamma)(\mathsf{b}(X) + \beta \mathsf{S_{\sigma_2}}(X) + \gamma)(\mathsf{c} + \beta \mathsf{S_{\sigma_3}}(X) + \gamma)\mathsf{z}(X\omega))\frac{\alpha}{\mathsf{Z_H}(X)} \\
& \quad + (\mathsf{z}(X) - 1)\mathsf{L_1}(X)\frac{\alpha^2}{\mathsf{Z_H}(X)} \\
\end{align}
$$
Output $[t_{lo}]_1 = [\mathsf{t_{lo}}(x)]_1$, $[t_{mid}]_1 = [\mathsf{t_{mid}}(x)]_1$, $[t_{hi}]_1 = [\mathsf{t_{hi}}(x)]_1$
4. Compute linearisation polynomial $\mathsf{r}(X)$ with challenge $\mathfrak{z}$
$$
\begin{array}{l}
\bar{a} = \mathsf{a}(\mathfrak{z}) \\
\bar{b} = \mathsf{b}(\mathfrak{z}) \\
\bar{c} = \mathsf{c}(\mathfrak{z}) \\
\end{array}
\quad
\begin{array}{l}
\bar{s}_{\sigma_1} = \mathsf{S_{\sigma_1}}(\mathfrak{z}) \\
\bar{s}_{\sigma_2} = \mathsf{S_{\sigma_2}}(\mathfrak{z}) \\\\
\end{array}
\quad
\begin{array}{l}
\bar{t} = \mathsf{t}(\mathfrak{z}) \\
\bar{z}_{\omega} = \mathsf{z}(\mathfrak{z}\omega) \\\\
\end{array}
$$
$$
\begin{align}
\mathsf{r}(X) & = (\bar{a}\bar{b}\cdot \mathsf{q_M}(X) + \bar{a}\cdot \mathsf{q_L}(X) + \bar{b}\cdot \mathsf{q_R}(X) + \bar{c} \cdot \mathsf{q_O}(X) + \mathsf{q_C}(X)) \\
& \quad + ((\bar{a} + \beta\mathfrak{z} + \gamma)(\bar{b} + \beta k_1\mathfrak{z} + \gamma)(\bar{c} + \beta k_2\mathfrak{z} + \gamma)\cdot \mathsf{z}(X))\alpha \\
& \quad - ((\bar{a} + \beta\bar{s}_{\sigma_1} + \gamma)(\bar{a} + \beta\bar{s}_{\sigma_2} + \gamma)\beta\bar{z}_\omega\cdot \mathsf{S_{\sigma_3}}(X))\alpha \\
& \quad + \mathsf{z}(X)\mathsf{L_1}(\mathfrak{z})\alpha^2 \\
\end{align}
$$
Output $\bar{a}$, $\bar{b}$, $\bar{c}$, $\bar{s}_{\sigma_1}$, $\bar{s}_{\sigma_2}$, $\bar{t}$, $\bar{z}_{\omega}$, $\bar{r} = \mathsf{r}(\mathfrak{z})$
5. Compute opening proof polynomial $\mathsf{W}_{\mathfrak{z}}(X)$ with challenge $v$
$$
\begin{align}
& \mathsf{W}_{\mathfrak{z}}(X) = \frac{1}{X-\mathfrak{z}}
\left(
\begin{array}{l}
(\mathsf{t_{lo}}(X) + \mathfrak{z}^n\mathsf{t_{mid}}(X) + \mathfrak{z}^{2n}\mathsf{t_{hi}}(X) - \bar{t}) \\
+ v(\mathsf{r}(X) - \bar{r}) \\
+ v^2(\mathsf{a}(X) - \bar{a}) \\
+ v^3(\mathsf{b}(X) - \bar{b}) \\
+ v^4(\mathsf{c}(X) - \bar{c}) \\
+ v^5(\mathsf{S}_{\sigma_1}(X) - \bar{s}_{\sigma_1}) \\
+ v^6(\mathsf{S}_{\sigma_2}(X) - \bar{s}_{\sigma_2}) \\
\end{array}
\right) \\\\
& \mathsf{W}_{\mathfrak{z}\omega}(X) = \frac{\mathsf{z}(X) - \bar{z}_\omega}{X - \mathfrak{z}\omega}
\end{align}
$$
Output $[W_{\mathfrak{z}}]_1 = [\mathsf{W}_{\mathfrak{z}}(x)]_1$, $[W_{\mathfrak{z}\omega}]_1 = [\mathsf{W}_{\mathfrak{z}\omega}(x)]_1$
:::info
When we want to access adjacent gate, for example $\mathsf{a}(X\omega)$, we only need to add extra evaluations and aggregate them in commit $[\mathsf{W}_{\mathfrak{z}\omega}]_1$.
For Dusk Network's [implementation](https://github.com/dusk-network/plonk/blob/master/src/proof_system/prover.rs#L369-L373) as example, they access next gate's $w_l$, $w_r$, $w_4$, so they have to aggregate them into $[\mathsf{W}_{\mathfrak{z}\omega}]_1$.
:::
6. Submit proof
$$
\begin{align}
\pi_{SNARK} =
\left(
\begin{array}{c}
[a]_1, [b]_1, [c]_1, [z]_1, [t_{lo}]_1, [t_{mid}]_1, [t_{hi}]_1, [W_{\mathfrak{z}}]_1, [W_{\mathfrak{z}\omega}]_1, \\
\bar{a}, \bar{b}, \bar{c}, \bar{s}_{\sigma_1}, \bar{s}_{\sigma_2}, \bar{r}, \bar{z}_\omega
\end{array}
\right)
\end{align}
$$
### Verify
==TODO==
### Question
- [x] Why is $\mathsf{L_1}(\mathfrak{z}) = \frac{\mathfrak{z}^n-1}{n(\mathfrak{z}-1)}$ (Why is $\mathsf{L_1}(X) = \frac{X^n-1}{n(X-1)}$)
> [name=liangcc]
$$
\begin{align}
& X^n - 1 = (X-1)(X-\omega)(X-\omega^2)\dots(X-\omega^{n-1}) \\\
& X^n - 1 = (X - 1)(X^{n-1}+ X^{n-2} + \dots + 1) \\
& \frac{X^n - 1}{X -1} = (X^{n-1}+ X^{n-2} + \dots + 1) = (X-\omega)(X-\omega^2)\dots(X-\omega^{n-1})
\end{align}
$$
$$
\begin{align}
\mathsf{L_1}(X) & = \frac{(X-\omega)(X-\omega^2)\dots(X-\omega^{n-1})}{(1-\omega)(1-\omega^2)\dots(1-\omega^{n-1})} \\\\
& = \frac{\frac{X^n-1}{X-1}}{(1-\omega)(1-\omega^2)\dots(1-\omega^{n-1})} \\\\
& = \frac{\frac{X^n-1}{X-1}}{1^{n-1}+ 1^{n-2} + \dots + 1} \\\\
& = \frac{X^n-1}{n(X-1)}
\end{align}
$$
- [x] Why we use $2$ randomnesses in $\mathsf{a}(X)$, $\mathsf{b}(X)$ and $\mathsf{c}(X)$ but $3$ in $\mathsf{z}(X)$?
> [name=Cited Ariel Gabizon from <a href="https://www.plonk.cafe/t/noob-questions-plonk-paper/73">plonk.cafe #73</a>] The rule is that if the poly is opened at $d$ points you need $d+1$ blinding factors; to hide both the commitment (which is an evaluation at a secret point in the exponent, but still to prove zk holds you’ll need this to be totally random, this proof that zk holds is quite similar to existing proofs - e.g. in Marlin, but is a missing hole in the paper right now) and the $d$ evaluation points.
So $\mathsf{z}(X)$ is opened at $2$ points and hence needs $3$ blinding factors.
- [ ] Why bother including $\bar{s}_{\sigma_1}$ and $\bar{s}_{\sigma_2}$ in proof and check them in pairing if verifier can calculate himself.
> [name=han] Guessing it's the reason that verification complexity is polylogarithmic $\mathcal{O}((\log n)^k)$, because evaluation is linear time.
- [ ] Why $\mathsf{r}(X)$ is lack of $((\bar{a}+\beta\bar{s}_{\sigma_1}+\gamma)(\bar{b}+\beta\bar{s}_{\sigma_2}+\gamma)(\bar{c}+\gamma)\bar{z}_\omega)\alpha$ and $\mathsf{L_1}(\mathfrak{z})\alpha^2$
> [name=han] Guessing it's because we need to ensure prover is using the $\alpha$, $\mathsf{S}_{\sigma_1}(X)$ and $\mathsf{S}_{\sigma_2}(X)$ as we expected, so we let verifier compute these part.
- [ ] How to constraint prover to use right $\mathsf{S}_{\sigma_1}(X)$ and $\mathsf{S}_{\sigma_2}(X)$ in $\mathsf{t}(X)$ and $\mathsf{r}(X)$ as verifier expected
> [name=han] Guessing it's constrainted by the lack part of $\mathsf{r}(X)$. If prover uses different $\mathsf{S}_{\sigma_1}(X)$ and $\mathsf{S}_{\sigma_2}(X)$, then reconstructed $\bar{t}$ by verifier will not equal to prover's $\bar{t}$.
## TurboPlonk
Take [Dusk Network](https://github.com/dusk-network/plonk) implementation as an example
:::spoiler {state="open"} **Relation in paper's notations**
<div style="margin-bottom: -10em; overflow: hidden; display: inline-block;">
<div style="transform: translateY(-12em)">
$$
\mathcal{R}\mathsf{snark}(\lambda) =
\left\{
\begin{array}{l}
\\\\\\\\\\\\\\\\
(x, w, crs) =
\left(
\begin{array}{l}
(w_i)_{i \in [\ell]}, \\
(w_i)_{i = 1, i \not\in [\ell]}^{4n}, \\
\left(
\begin{array}{c}
q_{M_i}, q_{L_i}, q_{R_i}, q_{O_i}, q_{C_i}, q_{4_i}, \\
q_{Arith_i}, q_{Range_i}, q_{Logic_i}, q_{FixedGroupAdd_i}, q_{VariableGroupAdd_i}
\end{array}
\right)_{i=1}^{n}, n, \sigma(x)
\end{array}
\right) \\\\
\begin{align}
\text{For all}\ i \in \{1, \dots, 4n\} &: w_i \in \mathbb{F}_p, \text{and} \\
\text{for all}\ i \in \{1, \dots, 4n\} &: w_i = w_{\sigma(i)}, \text{and} \\
\text{for all}\ i \in \{1, \dots, n\} &:
q_{Arith_i} = 0 \vee (w_iw_{n+i}q_{M_i} + w_iq_{L_i} + w_{n+i}q_{R_i} + w_{2n+i}q_{O_i} + w_{3n+i}q_{4_i} + q_{C_i}) = 0, \text{and} \\
\\
\text{for all}\ i \in \{1, \dots, n-1\} &:
q_{Range_i} = 0 \vee \left(
\begin{array}{r}
(w_{2n+i} - 4w_{3n+i}) \in \{0,1,2,3\} \ \wedge \\
(w_{n+i} - 4w_{2n+i}) \in \{0,1,2,3\} \ \wedge \\
(w_{i} - 4w_{n+i}) \in \{0,1,2,3\} \ \wedge \\
(w_{3n+i+1} - 4w_{i}) \in \{0,1,2,3\} \,\ \ \
\end{array}
\right) , \text{and} \\
\\
\text{for all}\ i \in \{1, \dots, n-1\} &:
q_{Logic_i} = 0 \vee \left(
\begin{array}{r}
(w_{i+1} - 4w_{i}) \in \{0,1,2,3\} \ \wedge \\
(w_{n+i+1} - 4w_{n+i}) \in \{0,1,2,3\} \ \wedge \\
(w_{3n+i+1} - 4w_{3n+i}) \in \{0,1,2,3\} \ \wedge \\
(w_{2n+i} - w_{i}w_{n+i}) = 0 \ \wedge \\
\left(
\begin{array}{r}
q_{C_i} [9w_{3n+i} - 3(w_{i}+w_{n+i})] + \\
3(w_{i}+w_{n+i}+w_{3n+i}) - \\
2 w_{2n+i}\left(
\begin{array}{r}
w_{2n+i}(4w_{2n+i} - 18(w_{i}+w_{n+i}) + 81) + \\
18(w_{i}^2 + w_{n+i}^2) - 81(w_{i}+w_{n+i}) + 83
\end{array}
\right)
\end{array}
\right) = 0 \,\ \ \
\end{array}
\right), \text{and} \\
\\
\text{for all}\ i \in \{1, \dots, n-1\} &:
q_{FixedGroupAdd_i} = 0 \vee \left(
\begin{array}{r}
(w_{3n+i+1} - 2w_{3n+i}) \in \{-1,0,1\} \ \wedge \\
(q_{C_i} (w_{3n+i+1} - 2w_{3n+i}) - w_{2n+i}) = 0 \ \wedge \\
\left(
\begin{array}{r}
w_{i+1}(1 + \mathcal{D}w_{i}w_{n+i}w_{2n+i}) - \\
w_{n+i}(w_{3n+i+1} - 2w_{3n+i}) q_{L_i} - \\
w_{i}((w_{3n+i+1} - 2w_{3n+i})^2 (q_{R_i}-1) + 1)
\end{array}
\right) = 0 \ \wedge \\
\left(
\begin{array}{r}
w_{n+i+1}(1 - \mathcal{D}w_{i}w_{n+i}w_{2n+i}) - \\
w_{i}(w_{3n+i+1} - 2w_{3n+i}) q_{L_i} - \\
w_{n+i}((w_{3n+i+1} - 2w_{3n+i})^2 (q_{R_i}-1) + 1)
\end{array}
\right) = 0 \,\ \ \
\end{array}
\right), \text{and} \\
\\
\text{for all}\ i \in \{1, \dots, n-1\} &:
q_{VariableGroupAdd_i} = 0 \vee \left(
\begin{array}{r}
(w_{3n+i+1} - w_{i}w_{3n+i}) = 0 \ \wedge \\
\left(
\begin{array}{r}
w_{i}w_{3n+i} + w_{n+i}w_{2n+i} - \\
w_{i+1}(1 + \mathcal{D}w_{i}w_{n+i}w_{2n+i}w_{3n+i})
\end{array}
\right) = 0 \ \wedge \\
\left(
\begin{array}{r}
w_{i}w_{2n+i} + w_{n+i}w_{3n+i} - \\
w_{n+i+1}(1 - \mathcal{D}w_{i}w_{n+i}w_{2n+i}w_{3n+i})
\end{array}
\right) = 0 \,\ \ \
\end{array}
\right) \\
\end{align}
\end{array}
\right\}
$$
</div>
</div>
:::
:::spoiler {state="open"} **Relation in more readable notations**
<div style="margin-bottom: -10em; overflow: hidden; display: inline-block;">
<div style="transform: translateY(-12em)">
$$
\mathcal{R}\mathsf{snark}(\lambda) =
\left\{
\begin{array}{l}
\\\\\\\\\\\\\\\\
(x, w, crs) =
\left(
\begin{array}{l}
(w_{i})_{i \in [\ell]}, \\
(w_i)_{i = 1, i \not\in [\ell]}^{4n} = (a_i)_{i = 1, i \not\in [\ell]}^{n} || (b_i)_{i = 1, i \not\in [\ell]}^{n} || (c_i)_{i = 1, i \not\in [\ell]}^{n} || (d_i)_{i = 1, i \not\in [\ell]}^{n}, \\
\left(
\begin{array}{c}
q_{M_i}, q_{L_i}, q_{R_i}, q_{O_i}, q_{C_i}, q_{4_i}, \\
q_{Arith_i}, q_{Range_i}, q_{Logic_i}, q_{FixedGroupAdd_i}, q_{VariableGroupAdd_i}
\end{array}
\right)_{i=1}^{n}, n, \sigma(x)
\end{array}
\right) \\\\
\begin{align}
\text{For all}\ i \in \{1, \dots, 4n\} &: w_i \in \mathbb{F}_p, \text{and} \\
\text{for all}\ i \in \{1, \dots, 4n\} &: w_i = w_{\sigma(i)}, \text{and} \\
\text{for all}\ i \in \{1, \dots, n\} &:
q_{Arith_i} = 0 \vee (a_{i}b_{i}q_{M_i} + a_{i}q_{L_i} + b_{i}q_{R_i} + c_{i}q_{O_i} + d_{i}q_{4_i} + q_{C_i}) = 0, \text{and} \\
\\
\text{for all}\ i \in \{1, \dots, n-1\} &:
q_{Range_i} = 0 \vee \left(
\begin{array}{r}
(c_{i} - 4d_{i}) \in \{0,1,2,3\} \ \wedge \\
(b_{i} - 4c_{i}) \in \{0,1,2,3\} \ \wedge \\
(a_{i} - 4b_{i}) \in \{0,1,2,3\} \ \wedge \\
(d_{i+1} - 4a_{i}) \in \{0,1,2,3\} \,\ \ \
\end{array}
\right) , \text{and} \\
\\
\text{for all}\ i \in \{1, \dots, n-1\} &:
q_{Logic_i} = 0 \vee \left(
\begin{array}{r}
(a_{i+1} - 4a_{i}) \in \{0,1,2,3\} \ \wedge \\
(b_{i+1} - 4b_{i}) \in \{0,1,2,3\} \ \wedge \\
(d_{i+1} - 4d_{i}) \in \{0,1,2,3\} \ \wedge \\
(c_{i} - a_{i}b_{i}) = 0 \ \wedge \\
\left(
\begin{array}{r}
q_{C_i} [9d_{i} - 3(a_{i}+b_{i})] + \\
3(a_{i}+b_{i}+d_{i}) - \\
2 c_{i}\left(
\begin{array}{r}
c_{i}(4c_{i} - 18(a_{i}+b_{i}) + 81) + \\
18(a_{i}^2 + b_{i}^2) - 81(a_{i}+b_{i}) + 83
\end{array}
\right)
\end{array}
\right) = 0 \,\ \ \
\end{array}
\right), \text{and} \\
\\
\text{for all}\ i \in \{1, \dots, n-1\} &:
q_{FixedGroupAdd_i} = 0 \vee \left(
\begin{array}{r}
(d_{i+1} - 2d_{i}) \in \{-1,0,1\} \ \wedge \\
(q_{C_i} (d_{i+1} - 2d_{i}) - c_{i}) = 0 \ \wedge \\
\left(
\begin{array}{r}
a_{i+1}(1 + \mathcal{D}a_{i}b_{i}c_{i}) - \\
b_{i}(d_{i+1} - 2d_{i}) q_{L_i} - \\
a_{i}((d_{i+1} - 2d_{i})^2 (q_{R_i}-1) + 1)
\end{array}
\right) = 0 \ \wedge \\
\left(
\begin{array}{r}
b_{i+1}(1 - \mathcal{D}a_{i}b_{i}c_{i}) - \\
a_{i}(d_{i+1} - 2d_{i}) q_{L_i} - \\
b_{i}((d_{i+1} - 2d_{i})^2 (q_{R_i}-1) + 1)
\end{array}
\right) = 0 \,\ \ \
\end{array}
\right), \text{and} \\
\\
\text{for all}\ i \in \{1, \dots, n-1\} &:
q_{VariableGroupAdd_i} = 0 \vee \left(
\begin{array}{r}
(d_{i+1} - a_{i}d_{i}) = 0 \ \wedge \\
\left(
\begin{array}{r}
a_{i}d_{i} + b_{i}c_{i} - \\
a_{i+1}(1 + \mathcal{D}a_{i}b_{i}c_{i}d_{i})
\end{array}
\right) = 0 \ \wedge \\
\left(
\begin{array}{r}
a_{i}c_{i} + b_{i}d_{i} - \\
b_{i+1}(1 - \mathcal{D}a_{i}b_{i}c_{i}d_{i})
\end{array}
\right) = 0 \,\ \ \
\end{array}
\right) \\
\end{align}
\end{array}
\right\}
$$
</div>
</div>
:::
<br>
:::info
They split wire value into base-4, which makes $x = \sum_{i=0}^nq_i4^i$, in range widget and logic widget to reduce gate number. For the reason that using base-4 is to make use of the max available degree of the permutation grand product in $\mathsf{t}(X)$, which $4n$ (4 wires).
:::
### Setup
==TODO==
### Prove
==TODO==
### Verify
==TODO==
### Question
- [ ] How does [logic widget](https://github.com/dusk-network/plonk/blob/master/src/proof_system/widget/logic/proverkey.rs) work? (It checks `AND` and `XOR` at the same time)
- [ ] Why adding dummy gates like [this](https://github.com/dusk-network/plonk/blob/master/src/constraint_system/composer.rs#L423) can serve as blind factor? How could it be used to prove Zero-Knowledge property of $\mathcal{P}\mathfrak{lon}\mathcal{K}$ ?
Compared to [barretenberg's implementation](https://github.com/AztecProtocol/aztec-2-bug-bounty/blob/master/barretenberg/src/aztec/plonk/proof_system/prover/prover.cpp#L181-L183), they use randomness wire values and cut the $\mathsf{Z_H}(X)$'s last $k$ roots to achieve Zero-Knowledge and not make $\mathsf{Z_H}(X)$'s degree over $4n$ at the same time. See [Adding zero-knowledge into PLONK](https://hackmd.io/@zacwilliamson/r1dm8Rj7D) by [@zacwilliamson](https://hackmd.io/@zacwilliamson) for more details.
## UltraPlonk
==TODO==
## Reference
- Plonk
- [PlonK: Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge](https://eprint.iacr.org/2019/953.pdf)
- [Understanding PLONK](https://vitalik.ca/general/2019/09/22/plonk.html) by Vitalik
- [Simplified Plonk Tutorial](https://github.com/barryWhiteHat/plonk_tutorial) by BarryWhiteHat
- Plonk By Hand Series by [METASTATE TEAM](https://research.metastate.dev/)
- [Part1](https://research.metastate.dev/plonk-by-hand-part-1)
- [Part2 - Proof](https://research.metastate.dev/plonk-by-hand-part-2-the-proof)
- [Part3 - Verification](https://research.metastate.dev/plonk-by-hand-part-3-verification)
- [Adding zero knowledge to Plonk-Halo](https://mirprotocol.org/blog/Adding-zero-knowledge-to-Plonk-Halo) by Mir Protocol
- [ZK Study Club - Plonk with Zac Williamson](https://www.youtube.com/watch?v=NqrVcDuQ8hM&list=PLj80z0cJm8QHm_9BdZ1BqcGbgE-BEn-3Y&index=22)
- TurboPlonk
- [Proposal: The Turbo-PLONK program syntax for specifying SNARK programs](https://docs.zkproof.org/pages/standards/accepted-workshop3/proposal-turbo_plonk.pdf)
- [PLONK custom gates design considerations](https://hackmd.io/@kobigurk/HJgsycL0H)
- [Into the deep end: making sense of PLONK - Zac Williamson (CTO, Aztec Protocol)](https://www.youtube.com/watch?v=ty-LZf0YCK0&t=1482s)
- [Adding zero-knowledge into PLONK](https://hackmd.io/@zacwilliamson/r1dm8Rj7D)
- Plookup
- [plookup: A simplified polynomial protocol for lookup tables](https://eprint.iacr.org/2020/315.pdf)
- [Prover and Verifier algorithms with Plookup](https://hackmd.io/gMXxXhCXQ8GFb1bvnFgOIA?view)
- [On PLONK and plookup](https://research.metastate.dev/on-plonk-and-plookup/)
- [Multiset checks in PLONK and Plookup](https://hackmd.io/Iuu9P7S5Sca0TCoYJ-sFdA)
- [zkSummit: plookup: Speeding up the PLONK prover - Zac Williamson & Ariel Gabizon](https://www.youtube.com/watch?v=Vdlc1CmRYRY)
- [Range Polynomial Protocols](https://www.youtube.com/watch?v=GVByGIhQq68)
- Implementation
- [github.com/AZTECProtocol/barretenberg](https://github.com/AZTECProtocol/barretenberg)
- [github.com/dusk-network/plonk](https://github.com/dusk-network/plonk)
- [github.com/zcash/halo2](https://github.com/zcash/halo2)