查找表(Lookup)论据
halo2实现任意集合的数据查找,相比Plookup简单。
语言(Language)说明
除了 语言的一般说明:
- 多项式(针对置换论据的大乘积论据多项式)称为“置换乘积”列。
技术描述
为了解释简单,我们先描述一个忽略零知识证明的论据描述的简单版本。
查找可以表示成 行表(编号从0开始)的“子集”。和列分别是“子集”和“全集”。
“子集”论据保证列中的元素都在 列中。这意味着,列中多个位置的元素对应着列中同一位置的元素,并且列中的某些元素可以不出现在列的任何位置上。
- 列并不一定是固定的。也就是说,我们可以支持固定元素的查找或者动态查找(后者采用advice列)。
- 和列中的元素可以重复。如果 和列中的元素个数不正好是的话,可以用 和列中任意元素进行扩展。
- 或者我们可以增加一个“查找选择子”,控制在列中的哪些元素参与查找。采用这种方法可以替换下述公式中的 。如果一个元素不需要查找,用替换。
假设 是拉格朗日基多项式,在行多项式为1,其他行为0。
从 和列的置换开始。假设它们的置换分别为 和 列。我们可以通过置换论据约束它们之间的置换关系:
也就是说,在除以0不发生的情况下,对所有的满足:
这个版本的论据证明 和 列是 和列的置换,但是并没有指明具体的置换关系。 和 是独立因子。采用这两个因子,可以将两个置换论据组合在一起,不需要担心相互干扰。
这些置换的目的是让证明者提供的 和 列满足一定的条件:
- 列中相同的元素位置靠在一起。这可以通过某种排序算法实现。重要的是,相同的元素在列中挨在一起,并且列是列的置换。
- 列中挨在一起的相同元素的第一个元素存在于列中。除去这个限制外,列是列的一个任意置换。
现在我们通过如下的规则限制 或者 :
除此之外,我们通过如下的规则限制:
由于第二个规则,第一个规则中的( 这一项在行没有效果,尽管 “能反转”。
这些约束规则一起有效的限制了列(也就是列)中的每个元素都存在于 列中(也就是列)。
加入零知识
为了在PLONK算法为基础的证明系统中加入零知识,我们需要在每列的最后加入个随机元素。这些需要对查找论据进行调整,因为这些随机的元素并不满足之前的约束。
我们限制有效的行数为。我们增加两个选择子:
- 在最后 行设置为1,其他行设置为0;
- 只在行设置为1,其他行设置为0 (也就是说,它设置在有效行和盲化行的交界处)。
我们将之前的规则限制在有效行上:
在行的限制规则保持不变:
因为我们不能再依赖在 点的环绕保证为1,相反我们要约束 为1。这里有个难点:如果在任意, 或者 为0的话,置换论据可能不成立。虽然这种情况在 和的取值下概率可以忽略,但是,对于完美零知识和完备性来说是个障碍(攻击者可以构造这样的情况)。
确保完美的完备性和零知识,我们允许为0或者1:
如果 和 在某些 上为0,我们可以在范围设置,满足上述的约束。
注意的是,挑战因子 和 是在 和列(以及 和 列)承诺后生成的,证明者无法伪造 和 为0的情况。因为这种情况的概率可以忽略,可行性不受影响。
开销
- 原始列和固定列。
- 置换函数 。
- 两个置换 和 列。
- 约束方程(门)的阶都不高。
泛化
halo2的查找论据实现实现了上述技术的泛化:
- 和列扩展为多列,这些列之间通过随机挑战因子进行组合。 和 列还是单列。
- 列的各列承诺可以提前计算。这样在挑战因子确定后,利用Pedersen承诺的同态性质,可以很简便的组合成列的承诺。
- 列可以是采用相对引用的任意多项式表达式。这些可以替换到约束规则中去,受制于最大的阶。这样可能可以省去一个或者多个advice列。
- 这样的话,查找论据可以通过子集论据实现任意长度的关系。也就是说,为了约束,将看成是(通过前面的方法),并且检查关系成立 。
- 如果代表一个函数,同样需要检查输入是否在域中。这是我们想要的,经常会省去额外的范围检查。
- 我们可以在同一个电路中支持多表。利用标示列将多个表组合成一张表。
- 标示列可以和之前提到的“查找选择子”合并。
这些泛化和Plookup论文的第4和第5节中的技术类似。和Plookup的区别是子集论据。相关技术,子集论据也适用;举个例子,Plookup论文的第5节中的优化范围检查技术同样可以用在子集论据中。