PLONK化算术化
halo2采用的算术化来自于 PLONK,或者更准确地说,来自它的扩展UltraPLONK,支持自定义门和查找表。我们称之为PLONK化( PLONKish)。
PLONK化电路是用矩形矩阵定义的。矩阵的行,列,单元格 和传统矩阵叫法意义一致。
PLONK化电路依赖配置 (configuation):
-
一个有限域,其中单元格的值(给定论述和论据)是的元素。
-
矩阵中列的个数是固定的。列可能是fixed、advice或者instance。Fixed列在电路中是固定的;advice列是论据信息;instance列通常用作公开输入(技术上讲, 它们可以是证明者和验证者之间共享的任何元素)。
-
一些列参与相等约束。
-
多项式阶的范围。
-
一系列多项式约束。这些多项式每一行在 上的取值为零。多项式约束中的变量可以是给定列当前行中的单元格,也可以是给定列中与这行相关的行(比如模)。每个多项式的最高阶由多项式阶的范围限定。
-
一系列的查找表论据,定义了查找表的输入和查找表相关的列。
PLONK化电路还定义:
-
矩阵的行数为 。 必须对应于的乘法子群的大小;通常是2的幂次。
-
一系列相等约束,指定两个给定单元格必须具有相等的值。
-
固定列中每行的固定值。
根据电路,我们可以生成电路证明和验证操作所需要的证明密钥 和验证密钥。
请注意,我们指定了列的顺序、多项式约束、查找表论据和相等约束,这些并不影响电路的含义。但这些使得证明和验证密钥的确定性的生成过程变得更加容易。
通常,配置将定义多项式约束,这些约束由定义在fixed列中的选择子关闭和开启。例如,一个约束 可以通过在第i行设置来关闭。在这种情况下,我们通常将多个选择子控制的一组约束,称一个门(gate)。通常标准门支持一些通用操作,比如域上的乘法和除法, 自定义门支持更专门的操作。