理解 PLONK(二):多项式编码

在上篇文章里,我们可以把电路的计算的「合法性检查」转换成一组加法/乘法约束。假如总共有 N 个约束,那么Prover 可以通过多项式编码的方式把多个约束压缩成一个约束,让 Verifier 轻松检查。

多项式的概率检查

把多个约束验证合并的神奇能力来自于「多项式随机挑战」。如果有两个多项式 同为两个次数不超过 的多项式。那么 Verifier 只需要给出一个随机挑战值 ,计算 是否等于 即可大概率得知 ,其中出错的概率 。只要保证 足够大,那么检查出错的概率就可以忽略不计。

这个原理被称为 Schwartz-Zippel 定理。

假如要验证两个向量 是否等于 ,为了可以一步挑战验证,我们要先把三个向量编码成多项式。

一种最直接的方案是把向量当作多项式的「系数」进行编码

显然,如果 ,那么 。然后我们可以通过挑战一个随机数 来检验三个多项式在 处的取值,验证:

如果上式成立,那么

Lagrange 插值 与 Evaluation Form

假如我们要验证 ,用系数编码的方式就不容易处理了,因为 会产生很多的交叉项。并且 的项并不对应到 的系数,比如 的系数出现在 上,但同时 项的系数组成还有 。而 的系数。

我们需要另一种多项式编码方案,利用 Lagrange Basis。如果我们要构造多项式 ,使得它在定义域 上的取值为 ,即

插值需要用到一组插值多项式: ,其中 ,并且 。然后 可以按如下方式编码:

可以简单心算一下,当 时,等式右边除了第一项之外,其他项都等于零,于是 。看起来 像是一个选择器,这组多项式又被称为 Lagrange Polynomials。

我们用同样的方法来编码

如果 成立,那么 。如果 ,那么

我们现在已经把两个向量的按位乘积问题转换到了三个多项式之间的关系,接下来的问题是如何进行随机挑战验证。

我们发现:如果直接让 Verifier 发送随机数 挑战上面的等式,那么 只能属于 。如果只存在一个 使得 ,那么 Verifier 的一次挑战能发现这个错误的概率只有 ,这样 Verifier 需要挑战多次才能缩小检测出错的概率。不过这样不满足我们的要求,我们希望只通过一次挑战来检测出 Prover 的作弊行为。

我们可以把上面的等式的 取值范围去除,换成下面的等式:

这个等式在整个 定义域上都成立。这是为何?

首先我们看等式左边的多项式: ,不妨定义为 。我们可以看到 上等于零,那么意味着 恰好是 的「根集合」。于是 可以按照下面的方式进行因式分解:

换个说法, 可以被多项式 整除,并得到一个商多项式 。零多项式 又被称为 Vanishing Polynomial。

如果我们让 Prover 计算出这个 ,并且发送给 Verifier,又因为 是已知的系统参数,Verifier 可以自行计算 ,那么 Verifier 只需要一次随机检测即可判断 是否在 处等零。

进一步,如果我们使用多项式承诺(Polynomial Commitment),Verifier 可以让 Prover 来帮忙计算这些多项式在 处的取值,发送并证明这些值的正确性,这样能最大限度地减少 Verifier 的工作量。

但是, Verifier 计算 需要 的计算量。

那能否让 Verifier 继续减少工作量?答案是可以的,只要我们选择特殊的

单位根 Roots of Unity

如果我们选择单位根作为 ,那么 的计算量会降为

对于任何有限域 ,其中阶数 为素数。那么去除零之后剩下的元素构成了乘法群 ,阶数为 。由于 一定为偶数,那么 的乘法因子中一定包含若干个 ,假设记为 。那么 一定包含一个阶数为 的乘法子群。不妨设 ,那么一定存在一个阶数为 的乘法子群,记为 。 该乘法子群必然含有一个生成元,记为 ,并且 。这相当于把 次方根,因此被称为单位根。不过单位根不只有一个 ,我们会发现 都满足单位根的特性,即 。那么所有这些由 产生的单位根就组成了乘法子群

这些元素满足一定的对称性:比如 。又比如把所有的单位根求和,我们会得到零:

举一个简单的例子,我们可以在 中找到一个阶数为

其中乘法群的生成元为 。由于 13-1=3*2*2,所以存在一个阶数为 的乘法子群,其生成元为

在实际应用中,我们会选择一个较大的有限域,它能有一个较大的 Powers-of-2 乘法子群。比如椭圆曲线 BN254 的 Scalar Field,含有一个阶数为 的乘法子群,BLS-12-381 的Scalar Field 含有一个阶数为 的乘法子群。

在乘法子群 上,具有下面的性质:

我们可以进行简单的推导,假设 ,由于 的对称性,这个计算过程可以不断化简:

Lagrange Basis

对于 Lagrange 多项式, ,并且 。接下来,我们给出 的构造。

为了构造 ,先构造不等于零的多项式部分。由于 ,因此他一定包含 这个多项式因子。但该因子显然在 处可能不等于 ,即可能 。然后,我们只要让该因子除以这个可能不等于 的值即可,于是 定义如下:

不难发现, 处等于 ,其它位置 处等于

对于任意次数小于 的多项式 ,那么它都可以唯一地表示为:

我们可以用多项式在 上的值 来表示 。这被称为 多项式的求值形式(Evaluation Form),区别于系数形式(Coefficient Form)。

两种形式可以在 上可以通过 (Inverse) Fast Fourier Transform 算法来回转换,计算复杂度为

多项式的约束

利用 Lagrange Basis 我们可以方便地对各种向量计算进行约束。

比如我们想约束 向量的第一个元素为 。那么我们可以对这个向量进行编码,得到 ,并且进行如下约束:

Verifier 可以挑战验证下面的多项式等式:

再比如,我们想约束 向量的第一个元素为 ,最后一个元素为 ,其它元素任意。那么 应该满足下面两个约束。

那么通过 Verifier 给一个随机挑战数( ),上面两个约束可以合并为一个多项式约束:

接下来,Verifier 只要挑战下面的多项式等式即可:

如果想验证 两个等长向量除第一个元素之外,其它元素都相等,那要如何约束呢?假设 为两个向量的多项式编码,那么它们应该满足:

时,左边多项式的第一个因子等于零,而 时,则左边第二因子等于零,即表达了除第一项可以不等之外,其它点取值都必须相等。

可以看出,采用 Lagrange 多项式,我们可以灵活地约束多个向量之间的关系,并且可以把多个约束合并在一起,让 Verifier 仅通过很少的随机挑战就可验证多个向量约束。

Coset

在素数有限域的乘法群中,对于每一个乘法子群 ,都有多个等长的陪集(Coset),这些 Coset 具有和 类似的性质,在 Plonk 中也会用到 Coset 的概念,这里只做部分性质的介绍。

还拿 为例,我们取 ,并且乘法群的生成元 。于是我们可以得到下面两个 Coset:

\begin{split} H_1 &= g\cdot H = (g, g\omega, g\omega^2, g\omega^3) &= (2,10,11,3) \ H_2 &= g^2\cdot H = (g^2, g^2\omega, g^2\omega^2, g^2\omega^3) &= (4,7,9,6) \ \end{split}

可以看到 ,并且它们交集为空,没有任何重叠。并且它们的 Vanishing Polynomial 也可以快速计算:

References

  • Schwartz–Zippel lemma. https://en.wikipedia.org/wiki/Schwartz%E2%80%93Zippel_lemma