文章

04. PLONK 算术化:门约束、wiring permutation 与 grand product

04. PLONK 算术化:门约束、wiring permutation 与 grand product

1. 把电路排成三列

原始 PLONK 用 $n$ 行、三条 witness wires:

row $i$left $a_i$right $b_i$output $c_i$
0$a_0$$b_0$$c_0$
1$a_1$$b_1$$c_1$
$\vdots$$\vdots$$\vdots$$\vdots$
$n-1$$a_{n-1}$$b_{n-1}$$c_{n-1}$

每行有五个 fixed selector:

\[q_{L,i},q_{R,i},q_{M,i},q_{O,i},q_{C,i},\]

并要求

\[q_{L,i}a_i +q_{R,i}b_i +q_{M,i}a_ib_i +q_{O,i}c_i +q_{C,i}=0.\]

同一个通用公式可表达:

$q_L$$q_R$$q_M$$q_O$$q_C$
$c=a+b$110-10
$c=ab$001-10
$a=k$1000$-k$
noop00000

因此 selector 是“电路程序”,witness columns 是“这次执行的数据”。

2. 从逐行门到 polynomial identity

\[H=\{1,\omega,\ldots,\omega^{n-1}\}.\]

插值 witness:

\[A(\omega^i)=a_i,\quad B(\omega^i)=b_i,\quad C(\omega^i)=c_i,\]

以及 fixed selectors:

\[Q_L(\omega^i)=q_{L,i},\ldots, Q_C(\omega^i)=q_{C,i}.\]

定义 gate polynomial

\[\begin{aligned} G(X) ={}&Q_L(X)A(X) +Q_R(X)B(X)\\ &+Q_M(X)A(X)B(X) +Q_O(X)C(X) +Q_C(X). \end{aligned}\]

所有门成立当且仅当

\[G(h)=0\qquad\forall h\in H,\]

也就是

\[Z_H(X)=X^n-1 \quad\text{整除}\quad G(X).\]

2.1 public input

可定义一个 public-input polynomial $PI(X)$,在使用公开输入的行取约定的正/负值,其余行为 0,并把

\[G(X)\leftarrow G(X)+PI(X).\]

不同实现对符号和 public input 所在列的约定不同;安全要求只有两条:

  1. public values 确实进入 vanishing identity;
  2. 它们及其顺序进入 Fiat–Shamir transcript。

3. 门约束没有解决 wiring

考虑两行:

  • 第 0 行计算 $c_0=a_0b_0$;
  • 第 1 行计算 $c_1=a_1+7$;
  • 电路希望 $a_1=c_0$。

每行 gate equation 分别成立,不能证明 $a_1$ 与 $c_0$ 是同一个 wire。若不加 copy constraint,prover 可为两格填不同值。

R1CS 常通过同一变量索引表达 wiring;PLONK 把每个 cell 先视作独立位置,再用一个全局 permutation 编码哪些位置属于同一 wire。

flowchart LR
    A0["row 0: a_0"] --> M["乘法门"]
    B0["row 0: b_0"] --> M
    M --> C0["row 0: c_0"]
    C0 -. "copy constraint" .-> A1["row 1: a_1"]
    A1 --> ADD["加常数门"]
    K["7"] --> ADD
    ADD --> C1["row 1: c_1"]

4. 给每个 cell 一个唯一标签

选择 $k_1,k_2\in\mathbb F^*$,使三个 cosets

\[H,\qquad k_1H,\qquad k_2H\]

两两不交。定义 identity polynomials

\[\operatorname{id}_1(X)=X,\qquad \operatorname{id}_2(X)=k_1X,\qquad \operatorname{id}_3(X)=k_2X.\]

于是第 $i$ 行三个 cell 的标签是

\[\omega^i,\qquad k_1\omega^i,\qquad k_2\omega^i.\]

所有 $3n$ 个标签互异。

4.1 wiring permutation

把属于同一逻辑 wire 的 cell 连成 cycle,得到标签集合上的 permutation $\sigma$。例如只要求 $c_0=a_1$,可有二环

\[k_2\omega^0 \;\xleftrightarrow{\ \sigma\ }\; \omega^1.\]

未参与 copy 的位置可为 fixed points。

将 permutation 在三列上的像插值为:

\[\begin{aligned} S_{\sigma,1}(\omega^i)&=\sigma(\omega^i),\\ S_{\sigma,2}(\omega^i)&=\sigma(k_1\omega^i),\\ S_{\sigma,3}(\omega^i)&=\sigma(k_2\omega^i). \end{aligned}\]

这些是 circuit-fixed polynomials,可进入 verification key。

5. 从 copy constraints 到 multiset equality

把所有 cells 统一记为 label $\ell$ 与 value $w_\ell$。copy constraints 意味着

\[w_\ell=w_{\sigma(\ell)} \qquad\forall\ell.\]

采样随机 $\beta,\gamma$,比较两个 multisets:

\[\left\{ w_\ell+\beta\ell+\gamma \right\}_{\ell}\]

\[\left\{ w_\ell+\beta\sigma(\ell)+\gamma \right\}_{\ell}.\]

若 value 沿每个 permutation cycle 相同,第二个 multiset 只是第一个重排。故总乘积相同:

\[\prod_\ell (w_\ell+\beta\ell+\gamma) = \prod_\ell (w_\ell+\beta\sigma(\ell)+\gamma).\]

反向上,若 copy constraint 被破坏,随机 $\beta,\gamma$ 让错误 multisets 仍具有相同压缩乘积的概率很小。$\beta$ 把 label 和 value 绑定;$\gamma$ 起随机平移和批处理防退化作用。

6. 三列形式的 numerator 与 denominator

对 $X\in H$,定义 identity-side product

\[\begin{aligned} N(X) ={}& \bigl(A(X)+\beta X+\gamma\bigr)\\ &\cdot \bigl(B(X)+\beta k_1X+\gamma\bigr)\\ &\cdot \bigl(C(X)+\beta k_2X+\gamma\bigr), \end{aligned}\]

和 permutation-side product

\[\begin{aligned} D(X) ={}& \bigl(A(X)+\beta S_{\sigma,1}(X)+\gamma\bigr)\\ &\cdot \bigl(B(X)+\beta S_{\sigma,2}(X)+\gamma\bigr)\\ &\cdot \bigl(C(X)+\beta S_{\sigma,3}(X)+\gamma\bigr). \end{aligned}\]

目标是证明

\[\prod_{x\in H}N(x) = \prod_{x\in H}D(x).\]

直接验证两个大乘积是 $O(n)$。grand product polynomial 把它改写为局部递推。

7. Grand product polynomial $Z(X)$

定义 accumulator:

\[Z(1)=1,\]

并对 $x=\omega^i$ 递推

\[Z(\omega x) =Z(x)\frac{N(x)}{D(x)}.\]

于是

\[Z(\omega^i) = \prod_{j=0}^{i-1} \frac{N(\omega^j)}{D(\omega^j)}.\]

走完一圈:

\[Z(\omega^n)=Z(1)=1\]

当且仅当 numerator/denominator 总乘积闭合。

7.1 不用除法写成约束

协议实际约束

\[P_{\mathrm{perm}}(X) = Z(\omega X)D(X)-Z(X)N(X)\]

在 $H$ 上为零,并约束起点

\[L_0(X)\bigl(Z(X)-1\bigr)=0,\]

其中 $L_0$ 是 $X=1$ 对应的 Lagrange basis。

flowchart LR
    ZI["Z(ω^i)"] --> R["乘 N(ω^i)"]
    DI["除 D(ω^i)"] --> R
    R --> ZN["Z(ω^(i+1))"]
    ZN --> C["走完 n 行回到 Z(1)=1"]

使用 polynomial identity 而非真的在 verifier 中逐行除法,也避免把 “某个 factor 为 0” 直接当未定义。随机 $\beta,\gamma$ 使异常退化事件概率很小;具体 completeness/ZK 处理依实现的 reserved rows 而异。

8. 把 gate 与 permutation 合成一个 vanishing identity

在 witness commitments 绑定后取得 $\beta,\gamma$,构造/承诺 $Z$;再取得随机 $\alpha$,定义简化 numerator:

\[\begin{aligned} P_{\mathrm{all}}(X) ={}&G(X)\\ &+\alpha\,P_{\mathrm{perm}}(X)\\ &+\alpha^2L_0(X)\bigl(Z(X)-1\bigr). \end{aligned}\]

若所有约束成立,

\[Z_H(X)\mid P_{\mathrm{all}}(X).\]

所以存在 quotient

\[t(X)=\frac{P_{\mathrm{all}}(X)}{Z_H(X)}.\]

随后只需在随机点 $\zeta$ 检查

\[P_{\mathrm{all}}(\zeta) \stackrel?= t(\zeta)Z_H(\zeta),\]

并用 PCS 证明所有 evaluations 对应先前 commitments。

8.1 challenge 顺序

sequenceDiagram
    participant P as Prover
    participant T as Transcript
    P->>T: commit A,B,C
    T-->>P: β,γ
    P->>T: commit Z
    T-->>P: α
    P->>T: commit quotient chunks
    T-->>P: ζ
    P->>T: evaluations 与 opening proof
  • 若 $\beta,\gamma$ 在 $A,B,C$ 前产生,prover 可针对压缩随机数选 witness;
  • 若 $\alpha$ 在 $Z$ 前产生,prover 可让 permutation error 与其他约束抵消;
  • 若 $\zeta$ 在 quotient commitment 前产生,prover 可只拟合一个点。

9. Degree 为什么导致 quotient 分块

在无 blinding 的简化三列版本中:

  • $\deg A,B,C,Z<n$;
  • $N,D$ 的 degree 最多约 $3(n-1)$;
  • $Z(\omega X)D(X)$ 最多约 $4(n-1)$;
  • 除以 degree $n$ 的 $Z_H$ 后,$t$ 可能接近 degree $3n$。

如果 PCS/SRS 只高效承诺 degree $<n$ 的 pieces,可写

\[t(X) =t_0(X)+X^nt_1(X)+X^{2n}t_2(X)+\cdots,\]

每个 $t_j$ 次数 $<n$,分别承诺。在随机点:

\[t(\zeta) =t_0(\zeta)+\zeta^nt_1(\zeta) +\zeta^{2n}t_2(\zeta)+\cdots.\]

原始 PLONK 常见 low/mid/high 三块;具体块数会因 blinding degree、custom gate、lookup 与实现 max degree 改变,不能硬编码为“PLONK 永远三个”。

10. permutation soundness 的核心条件

grand product 不是无条件的集合定理。可靠性依赖:

  1. 标签唯一:$H,k_1H,k_2H$ 两两不交;
  2. witness 先绑定:$A,B,C$ commitments 早于 $\beta,\gamma$;
  3. permutation 固定:$S_{\sigma,j}$ 来自 circuit key,不能由 prover 临时改;
  4. 随机压缩域足够大:错误 multiset 通过随机 identity 的概率可忽略;
  5. 起点/闭合被约束:只检查递推而不约束 boundary 会留下自由 scaling;
  6. degree bound 被证明:否则 prover 可提交只在 $H$ 上拟合递推的高次对象。

10.1 为什么必须有 $Z(1)=1$

若 $Z$ 满足递推,则对任意常数 $c$,$cZ$ 也满足同次递推。boundary 消除这个 scaling freedom,并与绕一圈闭合共同绑定总乘积。

11. 一个两格 copy 的微型例子

设 permutation 只有二环

\[\ell_1\leftrightarrow\ell_2\]

而两格值为 $u,v$。对应两边乘积包含:

\[\begin{aligned} L&=(u+\beta\ell_1+\gamma) (v+\beta\ell_2+\gamma),\\ R&=(u+\beta\ell_2+\gamma) (v+\beta\ell_1+\gamma). \end{aligned}\]

相减可因式分解:

\[L-R=\beta(u-v)(\ell_2-\ell_1).\]

标签互异且 $\beta\ne0$ 时,$L=R$ 强制 $u=v$。大 permutation 可视为这个机制的随机多项式推广。

12. 从原始 PLONK 到 PLONKish

现代 PLONKish 一般把电路视为矩阵,列分三类:

  • fixed columns:selector、常量表、电路结构;
  • advice columns:prover witness 与辅助值;
  • instance columns:public input/output。

约束可读取相对 rotation:

\[q(X)\cdot P\bigl( A_0(\omega^{-1}X), A_1(X), A_2(\omega X) \bigr)=0.\]

copy constraints 只对明确启用 equality 的列建立 permutation。lookup 则是另一个 argument。

flowchart TB
    F["fixed columns<br/>selectors / tables"] --> G["custom gate expressions"]
    A["advice columns<br/>witness"] --> G
    I["instance columns<br/>public values"] --> G
    A --> P["equality permutation"]
    F --> L["lookup tables"]
    A --> L
    G --> V["vanishing argument"]
    P --> V
    L --> V

Halo 2 的 regions、chips、floor planner 是构造这张矩阵的工程抽象;底层仍是列多项式、rotation、selector、permutation 和 lookup。

13. Custom gate 的 degree 代价

例如要检查

\[y=x^5,\]

可以:

  • 用若干乘法门和中间 cells,增加 rows;
  • 用一个高次 custom gate,减少 rows 但提高 quotient degree。

这里必须把 selector 也计入 formal degree。若未启用的行靠 selector $q$ 关闭,实际约束是

\[q(X)\bigl(Y(X)-X_{mathrm{wit}}(X)^5\bigr)=0.\]

$Y-X_{mathrm{wit}}^5$ 的 witness-expression degree 是 5,但把 fixed column $q$ 也作为一个多项式 factor 后,完整约束的 formal degree 通常是 6,而不是 5。只有协议用其他机制消去 selector、或该约束在所有行恒启用时,才能按 degree 5 记账。

在单变量 PLONK 中,$d$ 必须定义为乘上所有 selectors 后的完整约束次数。代入 degree $<n$ 的 fixed/witness columns 后,numerator degree 可达约 $d(n-1)$(再按实际常数项和边界项精确计算)。这可能:

  • 增加 quotient chunks;
  • 扩大 SRS degree / FFT domain;
  • 增加 prover MSM 与 FFT。

HyperPlonk 把这一问题移到 multilinear hypercube 与 sumcheck,是后续演进的重要动机。

14. Reserved / blinding rows

理论简化版让 permutation 走完全部 $H$ 并 wrap。实际 ZK PLONKish 系统常保留:

  • unusable row;
  • last row selector;
  • 若干 blinding rows。

然后只在 usable rows 启用 gate/permutation recurrence,并单独约束 accumulator 的末端。这样可给 witness columns 填随机盲值。

因此看到实现中的

\[q_{\mathrm{last}},\quad q_{\mathrm{blind}}\]

不要把它们误认为多余优化;它们影响 completeness、ZK 和 boundary semantics。应按该实现 specification 推导,不能混用原始 PLONK 的 wraparound 公式。

15. 本篇与 PCS 无关的部分

到目前为止只得到一个 polynomial IOP:

  • prover 声称若干 polynomials;
  • verifier 发送 $\beta,\gamma,\alpha,\zeta$;
  • 最终检查若干 random-point identities。

尚未指定这些 polynomials 如何 commitment/open。因此可选择:

  • KZG:短 proof、pairing、universal SRS;
  • IPA:无 structured toxic waste、对数 opening;
  • FRI/WHIR:透明 hash-based、proof 较大;
  • 其他 multilinear PCS:若先改变 arithmetization/PIOP。

这就是“PLONK 不等于 KZG”的精确原因。

16. 边界与常见陷阱

  1. selector 是否在 padding/unusable rows 正确关闭?
  2. 三组 identity labels 是否真正互异?
  3. wiring permutation 是否覆盖每个 equality-enabled cell 且形成双射?
  4. $S_{\sigma,j}$ 是否绑定在 circuit key,而非 prover input?
  5. $\beta,\gamma$ 是否晚于全部 witness commitments?
  6. grand product 是否同时有 recurrence 与正确 boundary/closure?
  7. public inputs 是否进入 gate identity 与 transcript?
  8. quotient degree/chunks 是否包含 permutation、blinding、lookup 的最高次数?
  9. rotation 是否在边界发生意外 wrap,selector 是否关闭?
  10. custom gate 降行数时,是否把 degree/PCS 成本转移算清?

17. 自测

  1. 为 $c=a-b$、$a\in{0,1}$ 分别给出 selector 或 custom constraint。
  2. 证明 $H,k_1H,k_2H$ 不交时所有 $3n$ 个 cell labels 互异。
  3. 推导两格 copy 例子中的 $L-R=\beta(u-v)(\ell_2-\ell_1)$。
  4. 从 grand product recurrence 推导总乘积 equality。
  5. 为什么只检查 $Z(\omega X)D-ZN=0$ 而没有 $Z(1)=1$ 不够?
  6. 一个 degree-7 custom gate 对 quotient degree 有何粗略影响?

参考


上一篇:多项式承诺与 Fiat–Shamir · 下一篇:PLONK 完整协议与 KZG · 返回:总目录

本文由作者按照 CC BY 4.0 进行授权