# PLONK ## What's PLONK? PLONK, viết tắt của "Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge," là một zero-knowledge proof scheme đa dụng do Ariel Gabizon, Zac Williamson và Oana Ciobotaru phát triển. ## From program to polynomials ### Arithmetic circuit **Arithmetic circuit** là một mô hình biểu diễn chương trình/toán học dưới dạng **cổng cộng (+)** và **nhân (×)** trên một trường số hữu hạn (finite field). Nó giống như mạch logic (logic circuit) nhưng thay vì **AND/OR/NOT**, ở đây ta chỉ có **add gate** và **mul gate**. **Ví dụ**: Ta có: $b = a^2 + 1$ <center> <img src="https://hackmd.io/_uploads/HyfGe0Loxe.png" width="30%"> </center> ### Constraint systems Từ **arithmetic circuit**, ta sinh ra **constraint system** – một tập hợp các phương trình phải thoả mãn nếu mạch chạy đúng. - Gate constraint: ràng buộc trong từng cổng (gate) - Copy constraint: ràng buộc giữa các dây (wire) **Ví dụ:** - Lấy lại biểu thức trên $b = a^2 + 1$ <center> <img src="https://hackmd.io/_uploads/ByEL-A8ilg.png" width="50%"> </center> **Gate constrait:** $\begin{cases} l_1 * r_1 - o_1 = 0 \\ l_2 - 1 - o_2 = 0 \end{cases}$ **Copy constraint:** $\begin{cases} l_1 = r_1 = a \\ l_2 = o_1 \\ \end{cases}$ Ta có thể viết dưới dạng tổng quát cho **constraint systems**: $$ Q_L a + Q_R b + Q_O c + Q_M ab + Q_C = 0 $$ Trong đó, $a, b, c$ lần lượt là **left, right, and output wire** của từng **gate**. Tất cả $Q$ đều là hằng số. Ví dụ như: <center> <img src="https://hackmd.io/_uploads/H18flrdoeg.png" width="70%"> </center> Từ các phương trình trên $Q$ có thể viết lại dưới dạng vector: $$ \begin{aligned} Q_L &= (0, 0, 1, 1) \\ Q_R &= (0, 0, 1, 0) \\ Q_O &= (-1, -1, -1, 0) \\ Q_M &= (1, 1, 0, 0) \\ Q_C &= (0, 0, 0, -30) \end{aligned} $$ Và những vector $Q$ này được gọi là **selector** và mã hoá **circuit structure**. Tương tự, ta cũng có thể viết $a, b, c$ dưới dạng vector $$ \begin{aligned} a &= (a_0, a_1, a_2, a_3) \\ b &= (b_0, b_1, b_2, b_3) \\ c &= (c_0, c_1, c_2, c_3) \\ \end{aligned} $$ Các vector này được gọi là **witness assignments** và biểu diễn toàn bộ giá trị của các **dây (wire)** được suy ra từ đầu vào của người dùng, trong đó một số có thể là **private** và chỉ được biết bởi **prover**. ### Polynomials Chúng ta có thể biến một vector thành một danh sách các điểm bằng cách dùng chỉ số của nó làm tọa độ *x*. Ví dụ, $Q_L$ có thể được chuyển thành $(0, 0), (1, 0), (2, 1), (3, 1)$. Sẽ tồn tại một đa thức bậc 3 duy nhất đi qua các điểm này. Tập $\{0, 1, 2, 3\}$ được gọi là **evaluation domain**. $Q_L$ đang ở dạng **“evaluation form”**, trong khi dạng **“coefficient form”** của nó có thể thu được bằng cách **nội suy (interpolation)**. $$Q_L(x) = -\frac{1}{3}x^3 + \frac{1}{2}x^2 - \frac{7}{6}x$$ <center> <img src="https://hackmd.io/_uploads/BJBucHOoeg.png" width="70%"> </center> Tương tự, chúng ta có thể chuyển đổi các vector khác thành các đa thức, được tính trên cùng một miền. Hãy định nghĩa $f(x)$ như sau: $$ f(x) = Q_L(x)a(x) + Q_R(x)b(x) + Q_O(x)c(x) + Q_M(x)a(x)b(x) + Q_C(x) $$ $f(0)$ có giá trị bằng 0, vì: $$ \begin{aligned} f(0) &= Q_L(0)a(0) + Q_R(0)b(0) + Q_O(0)c(0) + Q_M(0)a(0)b(0) + Q_C(0) \\ &= (0)a_0 + (0)b_0 + (-1)c_0 + (1)a_0 b_0 + (0) \\ &= 0 \end{aligned} $$ Tương tự, bạn có thể tính $f$ tại $1, 2, 3$, và tất cả đều cho kết quả bằng 0. Mọi ràng buộc trong hình: <center> <img src="https://hackmd.io/_uploads/H18flrdoeg.png" width="70%"> </center> sẽ được thỏa mãn khi và chỉ khi điều kiện sau đúng: $$ f(x) = 0, \quad \forall x \in \{0, 1, 2, 3\} $$ --- Chúng ta gom tất cả các ràng buộc vào một đa thức duy nhất $f(x)$, có thể biểu diễn như sau: $$ f(x) = Z(x)H(x) $$ trong đó $$ Z(x) = x(x-1)(x-2)(x-3) $$ --- **Giải thích:** - Các điểm $0,1,2,3$ đều là nghiệm (roots) của $f(x)$. - Do đó, tồn tại một đa thức $H(x)$ sao cho $f(x)$ chia hết cho $Z(x)$ mà không dư. - $Z(x)$ được gọi là *vanishing polynomial* , còn $H(x)$ gọi là *quotient polynomial*. --- Định nghĩa thêm một đa thức $g(x)$: $$ g(x) = f(x) - Z(x)H(x) $$ Nếu $f(x) = Z(x)H(x)$ thực sự đúng, thì ta có: $$ g(x) = 0 $$ tại mọi điểm, tức là $g(x)$ chính là *zero polynomial*. ### Định lý Schwartz–Zippel #### Phát biểu Cho đa thức không đồng không $P(x_1, \ldots, x_n)$ trên trường $\mathbb{F}$, với bậc $\deg(P) = d$. Xét một tập hữu hạn $S \subseteq \mathbb{F}$. Nếu chọn ngẫu nhiên một điểm $(a_1, \ldots, a_n) \in S^n$, thì ta có: $$ \Pr[P(a_1, \ldots, a_n) = 0] \leq \frac{d}{|S|} $$ với điều kiện $P \not\equiv 0$ (không phải đa thức đồng không). --- #### Giải thích dễ hiểu - Một đa thức bậc $d$ có nhiều nhất $d$ nghiệm. - Nếu ta chọn giá trị ngẫu nhiên trong một tập rất lớn (ví dụ $|S| \approx 2^{256})$, thì tỉ lệ $\tfrac{d}{|S|}$ gần như bằng 0. - Do đó, nếu $P$ cho kết quả bằng 0 tại một điểm ngẫu nhiên, thì gần như chắc chắn rằng $P \equiv 0$. --- #### Ý nghĩa - Nếu $P \equiv 0$ thì tất nhiên nó bằng 0 ở mọi điểm. - Nếu $P \not\equiv 0$, thì xác suất để nó “vô tình” bằng 0 ở một điểm ngẫu nhiên là rất nhỏ $(\le \tfrac{d}{|S|})$. - Điều này dẫn đến hệ quả quan trọng trong kiểm chứng đa thức: - Nếu đánh giá hai đa thức tại một điểm ngẫu nhiên và kết quả bằng nhau, thì gần như chắc chắn chúng bằng nhau ở mọi điểm. ## Polynomial commitment scheme