在可信设置 (trusted setup) 上评估 Quadratic Arithmetic Program (QAP) 使得证明者能够在不泄露 witness 的情况下,使用固定大小的证明来证明 QAP 已被满足。
具体来说,QAP 多项式在一个未知点 处进行评估。如果向量 满足方程,则 QAP 方程
将会是平衡的(等式两边相等);否则,它以压倒性的概率是不平衡的。
此处展示的方案并不是一个安全的 ZK Proof,但它是展示 Groth16 工作原理的垫脚石。
一个具体示例
为了让这不那么抽象,假设 Rank 1 Constraint System (R1CS) 的矩阵 、 和 有 3 行 4 列。
由于我们有 3 行,这意味着我们的插值多项式的最高次数将是 2。因为我们有 4 列,每个矩阵将产生 4 个多项式(总共 12 个多项式)。
我们的 QAP 将会是
符号与预备知识
我们将群 和 中的生成器椭圆曲线点分别称为 和 。 中的元素记为 。 中的元素记为 。当涉及列表中索引的下标可能引起歧义时,我们会写成 或 。两点之间的椭圆曲线配对 记作 。
设 为 的第 列。在我们的示例中,行是 ,列是 。设 为使用 值 以及作为第 列的 值,对 的第 列进行拉格朗日插值计算所得到的多项式。
因为我们有 4 列,所以我们从 中获得了四个多项式:
从 中获得的四个多项式:
以及从 中获得的四个多项式:
多项式 表示第 个多项式和第 个系数(幂)。例如, 表示与 关联的系数。
我们示例的 QAP 是
其中 且 为
QAP 中多项式的次数与 R1CS 大小的关系
关于一般情况下多项式次数的几点观察:
- 和 的次数最高可达 ,因为它们对 个点进行了插值,其中 是 R1CS 中的行数。
- 如果多项式之和 的结果为零多项式,即系数相加后相互抵消, 的次数可能会低至 0。
- 根据定义, 的次数为 。
- 多项式相乘会将其次数相加,而多项式相除会将其次数相减。
因此, 的次数最多为 ,因为
展开各项
如果我们展开前面示例中的求和公式,我们会得到以下结果:
在每种情况下,由于我们将 4 个最高次数为 2 的多项式相加,我们会得到一个次数为 2 的多项式。
在一般表达式中, 产生的多项式最高次数不超过 (可能会更小,例如如果 的和恰好为 0)。为了方便起见,我们引入了系数 ,其中 是系数对应的幂,而 表示我们将这些多项式与 witness 结合在了一起。
以下是以这种方式化简后的多项式:
将可信设置与 QAP 结合
我们现在可以应用从可信设置中获取的结构化参考字符串 (structured reference string) 来评估这些多项式。
也就是说,给定一个结构化参考字符串
它在可信设置中是这样计算得出的:
我们可以计算:
在这里, 的意思是使用可信设置中由 生成的结构化参考字符串对多项式进行了评估,这并不意味着“将 代入并求值多项式”。由于 在可信设置后已被销毁,因此 的值是未知的。
我们已经使用 srs 计算了 QAP 的大部分内容,但我们还没有计算 :
计算
回顾一下, 的次数为 3(通常为 ), 的次数为 1(通常为 )。如果将它们相乘,我们最高可能会得到一个次数为 3 的多项式,这超过了 powers of tau 仪式所提供的项数。因此,必须对 powers of tau 仪式进行调整,以为 提供结构化参考字符串。
执行可信设置的人知道 ,它仅仅是 。然而, 是由证明者计算出的多项式,并且会根据 的值而变化,因此它在可信设置期间是未知的。
请注意,我们不能分别评估 和 (使用结构化参考字符串),然后再将它们配对在一起。那样做不会产生我们所需要的 元素。
多项式乘积的 SRS
观察到以下计算都会得出相同的值:
- 多项式 在 处求值,即
- 乘以 ,即 ( 在 处求值且 在 处求值)
- 乘以 的求值结果,然后对多项式在 处求值,即
我们将使用第三种方法来计算 。不失一般性地假设, 是 且 。计算过程将是
如果我们将 代入 ,那就是 。
然而,在 处评估此多项式将需要证明者知道 。这里的关键见解是,上述计算可以构造为:
如果可信设置提供 ,而证明者提供 ,那么证明者可以在不知道 的情况下计算出 ,因为任何涉及 的内容都在内积的右向量中。
用于 的结构化参考字符串
为了给 创建结构化参考字符串,我们生成 个评估值,由 乘以 的连续幂次得出。
(有点令人困惑的是,一个 次多项式有 项,因此我们为一个 次的多项式生成 个求值。请注意,Upsilon 从 开始,并在 0 结束)。
在这里, 是 R1CS 中的行数,并且我们已确定 的次数不能大于 。
为了使用结构化参考字符串计算 ,证明者执行以下操作:
在可信设置上评估 QAP
我们现在将一切联系起来。假设我们有一个 R1CS,其矩阵有 行和 列。由此,我们可以应用拉格朗日插值将其转换为 QAP:
每个求和项将产生一个最高次数为 的多项式(拉格朗日多项式的次数比其插值的点数少一), 多项式的次数最高为 , 的次数为 。
可信设置生成一个随机域元素 并计算:
请注意,结构化参考字符串需要有足够的项来容纳 QAP 中的多项式。
然后,可信设置销毁 并公开发布结构化参考字符串:
证明者对 QAP 的各个组成部分进行如下评估:
证明者发布 ,验证者可以检查以下等式:
如果 witness 满足 QAP,那么上述方程将是平衡的。但是,方程平衡并不能确保证明者知道一个令人满意的 ,因为证明者可以发布任意的椭圆曲线点,而验证者并不知道它们是否真正推导自 QAP。
证明非常小
观察到证明仅由三个椭圆曲线点组成。如果一个 元素的大小为 64 字节,而一个 元素的大小为 128 字节,那么该证明只有 256 字节。无论 R1CS 的大小如何,这都是成立的!
R1CS 越大,证明者的工作量就越大,但验证者的工作量保持不变。
解决此问题的方法在下一章关于 Groth16 protocol 中有描述。
在 Groth16 中,证明仍然保持固定大小,这可以从 Tornado Cash 源代码中名为 Proof 的 struct 处看到。
最初发布于 2023 年 8 月 28 日