---
# System prepended metadata

title: Plonky2协议简析
tags: [Plonky2, 协议分析, zkSNARK]

---

# Plonky2协议简析

## 简介
Plonky2 是一个基于多项式承诺和基于 Plonk 的 PIOP 交互式证明的 zkSNARK 协议，致力于通过 FRI 技术实现高效的 zkSNARK。Plonky2 的主要目标是提高传统 zkSNARK 在递归零知识证明场景中的效率，同时增强后量子安全性。其核心理念是利用 FRI（Fast Reed-Solomon Interactive Oracle Proof of Proximity）实现高效的多项式验证，并使用随机抽样来增强协议的完整性和安全性。

在这篇文章中，将分析Plonky2协议的主要步骤和构造逻辑，并探讨如何用抗碰撞的哈希函数代替验证者的随机挑战，从而将协议转变为非交互式证明系统。

## 预处理
### 构造电路和相应的多项式
在预处理阶段，证明者（P）和验证者（V）共同构建电路并计算一组多项式向量$\vec{C}$和$\vec{\sigma}$这些多项式对每个电路门的常数和扩展排列进行编码，这些多项式表示电路内的关系和操作。

具体来说，$\vec{C}$包含对门常数和中间变量的约束（门约束），而$\vec{\sigma}$表示扩展置换的信息，又称复制约束。这些在后面的多项式置换和零知识证明过程中起到关键作用。
### 构建Merkle树
P 和 V 哈希的评估$\vec{C}$和$\vec{\sigma}$构建Merkle树，这棵树不仅压缩了证明的大小，而且在后续的多项式一致性验证中提供了高效的数据认证结构。
### P存储验证密钥
V存储$Com(\vec{C}, \vec{\sigma})$，作为验证密钥，以确保在后续步骤验证多项式与电路的关系时保持一致。

优化：通常，在实现中，我们使用 Merkle 帽（部分子树节点）代替 Merkle 根，以减少最终 Merkle 证明的大小。

## 主要协议
![67ab4f01eadc36f854702a0b_image25](https://hackmd.io/_uploads/HJ07CIJ9Jg.png)
### 生成见证和多项式承诺
证明者生成见证向量$\vec{w}$（电路的私有输入）并计算其多项式形式$w(x)$. 然后，证明者使用 FRI 协议生成对多项式 (Merkle 根)的承诺$Com(\vec{C}, \vec{\sigma})$并将其发送给验证者。
### 验证者样本随机挑战
验证者随机选择$\beta_{1}, \ldots, \beta_{r}, \gamma_{1}, \ldots, \gamma_{r}$在有限域中$\mathbb F_p$这些随机参数将用于后续置换多项式的验证，以保证协议的完备性。
### 发送排列多项式和中间多项式承诺
P 发送置换多项式的承诺$Z(x)$和乘积多项式$\pi(x)$作为$Com(\vec{Z}, \vec{\pi})$，保证副本约束的一致性。

置换多项式是为了验证变量之间的一致性（即复制约束是否成立），乘积多项式是为了验证中间变量计算的正确性（减少多项式次数，允许并行计算以提高效率）。
### 验证者抽样新的随机参数
验证者对另一组随机参数进行采样$\alpha_{1}, \ldots, \alpha_{r}$将多个约束通过随机的线性组合进行组合，通过引入不同的随机系数，简化了验证过程。
### 生成并发送商多项式承诺
证明者使用 FRI 协议构建 Merkle 树并生成商多项式$q_i(x)$并做出相应的承诺Com(\vec{q})。商多项式采用以下形式：
$$
q_i(x) = \frac{C_i(x)}{z_H(x)},
$$
在哪里$C_i(x)$是使用随机线性组合对约束进行组合后的约束多项式。它表示合并后的约束，并且$Z_{H}(x)=x^{n}-1$
是集合上的消失多项式$H$，多项式在特定域上消失$H$（即，它可以被消失多项式分解）。
### 验证者样本验证点
验证者选择一个新的随机点$\zeta \in F_p$验证此时商多项式与约束多项式的一致性。
### P 在验证点发送多项式的求值结果
证明者计算并发送点处所有多项式的求值$\zeta$，表示$\vec{P}(\zeta)$， 在哪里$\vec{P}$表示以下链接多项式：
$$
\vec{P}=(\vec{c},\vec{\sigma},\vec{w},\vec{Z},\vec{\pi},\vec{q}).
$$
此步骤旨在将所有多项式值的验证压缩到单点，避免逐一验证的开销。
### 使用FRI进行验证
Prover 和 Verifier 共同使用 FRI 协议进行批量验证（Batch FRI Protocol），目标是验证如下多项式是否满足一致性条件：
$$
\vec{B}=(\frac{p_{t}(x)-p_{t}(\zeta)}{x-\zeta}|p_{t}\in\vec{P}).
$$
在此步骤中，FRI采用多层折叠和随机系数调整来确保多项式值在验证点处的一致性。
### 验证约束一致性
验证者接收以下值$\vec{P}(\zeta)$并验证合并的约束多项式$c_i(\zeta)$确保$c_i(\zeta) = q_i(x)Z_H(x)$持有。

## 协议摘要和分析
与传统Plonk不同，Plonky2引入置换多项式和商多项式承诺，降低多项式次数，并行化多项式计算，实现电路内多项式关系的高效验证。结合FRI的批量验证，可以大幅降低验证者端的计算开销。协议的优势主要体现在以下几个方面：
1. **高效多项式验证**
FRI技术的引入使得多项式验证更加高效，特别是在递归零知识证明和后量子安全场景中。
2. **灵活随机参数选择**
Plonky2 通过引入多个随机参数来增强安全性（$\beta, \gamma, \alpha$等）贯穿整个协议，确保零知识属性和安全性。
2. **支持递归验证**
Plonky2 的设计旨在在递归场景中表现出色，使其适用于复杂的电路证明和多层验证结构。