理解 Plonk(六):实现 Zero Knowledge

在前文的 Plonk 协议中,所有的多项式承诺都没有混入额外的随机数进行保护,因此当一个未被随机化的多 项式承诺 经过一次或者多次 Open,会泄露 自身的信息,这会限制协议在需要隐私保护的 场景中应用。

考虑一个 次多项式 ,只要它在四个不同的点上 Open ,多项式就可以通过 Lagrange 插值来复原。 然而即使一个次数超过一百万的多项式,哪怕被打开一次也会泄漏关于原多项式的部分信息。

为了实现 Zero Knowledge 性质的 Plonk,我们需要在多项式中加入足够多的随机因子,确保在多项式 打开 次之后,仍然不会泄漏原多项式的信息,保证没有知识泄漏。

Plonk 协议的大致流程为:Prover 构造多项式,然后发送多项式的承诺给 Verifier。然后 Verfier 挑战两个随机挑战点 ,其中 为 子群 的生成元。下面是 Prover 需要构造的多项式列表:

  • Witness 多项式:
  • 置换累乘多项式:
  • 商多项式:

其中三个 Witness 多项式要在 这一个点处打开,置换累乘多项式 要在 两个点处打开,而三个商多项式则不需要被打开。

Prover 要混入两类随机因子,第一类是保护承诺本身,满足信息隐藏 Hiding,一个承诺一般只需要混入一个随机数即可; 第二类是保护多项式承诺在打开之后仍然保证原多项式信息不会泄漏。如果多项式打开的次数越多(假设每次打开的位置都不同), Prover 就要混入越多的随机因子。

第一类的随机因子,也可以用多项式承诺方案来实现,比如 Bulletproof-IPA,或者 KZG10-with-Hiding,这些多项式承诺方案本身已经支持 Hiding 。如果 Plonk 后端采用的是朴素的 KZG10,那么就需要在 Plonk 协议层面增加足够的随机因子,不仅保证承诺自身的 Hiding 性质,还要保护承诺的打开。

下面我们介绍两个不同的混入随机因子方案实现 Zero Knowledge 的方法。第一个方法比较经典,是为多项式加上一个盲化(Blinding)用途的多项式,GWC19 论文[3](或其它学术论文)中正是采用的这种方法。而第二个方法是在向量的对齐填充空间里面填入随机数,再插值产生多项式的,这是工程实现中的常见方法。

方法一:Blinding 多项式

我们先看 Witness 多项式 ,它是由下面的等式计算:

我们假设 ,其中

在 Plonk 协议中,Prover 需要计算 的取值,其中 为 Verifier 给出的随机挑战点。

如果我们直接鲁莽地在 中混入随机数 ,比如 ,那么 可能就不再满足算术约束:

而且也无法满足置换约束。

如果要让随机化后的多项式 满足「算术约束」和「置换约束」,那么我们可以考虑在乘法子群 之外增加一些随机的点,这样可以让随机化后的多项式 整个乘法子群上的取值仍然与 完全相等,但是整个多项式却已经被随机化了。所谓的在 上的取值相等,就是保证随机化后的多项式仍然可以被 整除。下面是随机化多项式的构造:

这里 为 Blinding 多项式,包含两个随机因子 ,它们恰好是自变量的不同次数的系数,这样可以保证线性不相关。换个方式理解,只有对这个 Blinding 多项式打开两次以上,才可以计算出所有的随机因子。如果只打开一次,Blinding 多项式会被消耗掉一个随机因子,还剩下一个起作用的随机因子。

简单检查下,我们可以发现新定义的 符合要求,能满足算术约束。同时因为 ,因此 也一定满足置换关系。

这里 被混入了两个随机因子,其中一个随机因子可以保护 被打开一次,另一个随机因子用来实现承诺 本身的信息隐藏。

考虑下置换累乘多项式 ,假如多项式承诺 被打开两次的话,那么就需要混入三个随机因子,构造一个次数为 的 Blinder 多项式, ,然后混入到 中:

最后考虑商多项式 ,由于他们不需要在任何点打开,因此只要加上随机因子即可,不过这几个商多项式有额外的要求,即他们三个需要一起能拼出真正的商多项式

我们可以采用下面的方式,为每一个多项式分片混入一个随机因子,并且保证他们拼起来之后仍然等于

容易检验:

同理,如果 的次数达到了 ,那么就需要三个随机数给四个 分段加上随机数,实现 Hiding。

这个方法存在一个问题,就是 Blinding 多项式的次数会超过 ,这里 。因为 的次数为 ,因此 次数为 。如果 Plonk 后端采用的是 Bulletproof-IPA 这类的多项式承诺,承诺会要求多项式的次数按 对齐,这样盲化之后的多项式的次数刚刚超出 ,只能对齐到 。一些 Plonk 变种协议可能会把 Witness table 的列数增加,稍稍超出的多项式次数会使 的计算在一个更大的子群上完成。

方法二:随机因子对齐

下面介绍的第二种方法不会推高多项式的次数。考虑到 子群的大小 是按 对齐,在实际电路中,一般情况下需要把 Witness Table 的长度对齐到 ,为了对齐,需要把空余的空间用零填满。

那么这里可以用随机数来代替零填充对齐空间,好处是这些随机数可以保护表中的其它正常数据。

Daniel Lubarov 按照这个思路给出了第二种随机数填充实现 Zero-Knowledge 性质的办法[1]。

对于商多项式,因为方法一不会推高他们的次数,因此我们下面只考虑剩下的两类多项式:

  • Witness 多项式:
  • 置换累乘多项式:

先看第一类多项式,以 为例,它编码了 向量。如果本身向量长度不足 ,一般情况下是用零补齐,我们现在可以考虑让 Prover 额外用两个随机数补齐,这样做的效果和方法一的 Blinding 多项式完全一样。 如下所示:

其中 也可以看成是利用 Lagrange Basis 产生的 Blinding 多项式。这里假设 的长度为 为两个随机数。假设 的系数为固定值,那么当 被打开两次之后, 的系数即可被求解,从而失去随机化的能力。因此, 只能承受一次安全的打开操作(假设协议基于 Non-hiding 的多项式承诺)。

对于置换累乘多项式 ,则需要在累乘向量 的尾部引入随机值。考虑下 的计算方式:

列出所有的 的计算如下:

假如我们想设置 为随机值,我们需要让 这两个元素设置一个 Copy Constraint,并填上同一个随机数 。如果 设置为零,那么

又因为

那么 的概率分布与 相同。这样我们通过把 Witness Table 的最后两行用来填入随机数 ,并且设置一个 Copy Constraint 来随机化 。如果要再引入一个随机数 ,一种方法是我们再征用 Witness table 的两行, ,可以让 随机化。或者我们节省下空间,利用 来构造一个随机数 的 Copy Constraint。同理,我们可以再用两行 来引入 。 这样,我们总共征用了四行,引入了三个随机数

最后我们推导一下 ,请注意 ,因为前面的 Permutation 项都已经消完。

于是 中各自包含了一个随机数。请注意这个方法需要在 Witness table 中留有足够的 padding 空间,并且 的盲化因子不能与 的重复,那么总共需要留出 6 排空间,并且把 盲化因子提前到第 排:

满足 Hiding 性质的 KZG10

在 Daniel Lubarov 的 Blog 中讲述的方案是基于带有 Hiding 性质的多项式承诺 IPA(Inner product argument)。因此在 中只需要混入一个随机因子, 中只混入两个随机因子。

但是我们也可以选择一个带有 Hiding 性质的 KZG10 承诺方案,这样也可以按照 Halo2 方式混入较少的随机数实现 Zero-knowledge。

这个方案参考了 Marlin 论文[2]的 Appendix B.3,基于 AGM 模型的 KZG10-with-hiding。

在 Setup 阶段,我们需要产生两倍长的 srs:

如果我们要承诺一个多项式 ,那么需要额外产生一个次数相同的 Blinder 多项式:

然后计算承诺:

如果我们要在 处打开一个多项式承诺,先计算 ,还要计算盲化多项式 的求值, ,然后产生这两个多项式的求值证明:

检查求值证明的方式如下:

我们可以看到为了实现 Hiding,计算承诺和打开承诺的成本会加倍。如果我们限定多项式只能被打开一次(或者有限次),那么我们可以采用更低次数的盲化多项式 。假如我们只考虑多项式最多被打开一次的情况,那么 只需要是一个一次多项式,同时也可以减少 srs 的尺寸。

最后请注意的是,仅有实现 Hiding 的多项式承诺不足以实现 Plonk 的 Zero-knowledge,仍然需要在 Plonk 协议层面混入足够的随机的盲化因子。

参考文献

  • [1] Adding zero knowledge to Plonk-Halo https://mirprotocol.org/blog/Adding-zero-knowledge-to-Plonk-Halo
  • [2] Chiesa, Alessandro, Yuncong Hu, Mary Maller, Pratyush Mishra, Noah Vesely, and Nicholas Ward. “Marlin: Preprocessing zkSNARKs with universal and updatable SRS.” In Advances in Cryptology–EUROCRYPT 2020: 39th Annual International Conference on the Theory and Applications of Cryptographic Techniques, Zagreb, Croatia, May 10–14, 2020, Proceedings, Part I 39, pp. 738-768. Springer International Publishing, 2020. https://eprint.iacr.org/2019/1047.
  • [3] Gabizon, Ariel, Zachary J. Williamson, and Oana Ciobotaru. “Plonk: Permutations over lagrange-bases for oecumenical noninteractive arguments of knowledge.” Cryptology ePrint Archive (2019).