译自 halo2 book:https://zcash.github.io/halo2/design/proving-system/multipoint-opening.html
多点打开论证(Multipoint opening argument)
考虑对多项式 的承诺 。假设 和 在点 处被查询,而 和 在 与 两个点处都被查询。(这里, 是我们用来构造这些多项式的乘法子群中的本原单位根(primitive root of unity)。)
为了打开(open)这些承诺,我们可以为每个查询的点(对应电路中使用的每个相对旋转)创建一个多项式 。但这在电路中并不高效;例如, 会出现在多个多项式中。
我们改为按照查询点的集合对承诺进行分组:
对于这些分组中的每一个,我们把它们合并成一个多项式集合,并为该集合创建单个 ,然后在每个旋转处打开它。
优化步骤
多点打开优化以下列内容作为输入:
- 由验证者采样的随机 ,我们在该点对 求值。
- 由证明者提供的、每个多项式在每个相关点处的求值:
这些是消失论证(vanishing argument)的输出。
多点打开优化按如下方式进行:
-
采样随机 ,以保持 线性无关。
-
根据多项式被查询时所在的点集,累加多项式及其对应的求值:
q_polys:q_eval_sets:[ [a(x) + x_1 b(x)], [ c(x) + x_1 d(x), c(\omega x) + x_1 d(\omega x) ] ]注:
q_eval_sets是一个由求值集合构成的向量,其中外层向量对应点集(本例中为 和 ),内层向量对应每个集合中的点。 -
对
q_eval_sets中的每个值集合做插值(interpolate):r_polys: -
构造
f_polys,用于检查q_polys的正确性:f_polys如果 ,那么 应当是一个多项式。 如果 且 , 那么 应当是一个多项式。
-
采样随机 以保持
f_polys线性无关。 -
构造 。
-
采样随机 ,我们在该点对 求值:
-
采样随机 以保持 与
q_polys线性无关。 -
构造
final_poly, 这就是我们在内积论证(inner product argument)中要承诺的多项式。