Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

译自 halo2 book:https://zcash.github.io/halo2/design/proving-system/multipoint-opening.html

多点打开论证(Multipoint opening argument)

考虑对多项式 的承诺 。假设 在点 处被查询,而 两个点处都被查询。(这里, 是我们用来构造这些多项式的乘法子群中的本原单位根(primitive root of unity)。)

为了打开(open)这些承诺,我们可以为每个查询的点(对应电路中使用的每个相对旋转)创建一个多项式 。但这在电路中并不高效;例如, 会出现在多个多项式中。

我们改为按照查询点的集合对承诺进行分组:

对于这些分组中的每一个,我们把它们合并成一个多项式集合,并为该集合创建单个 ,然后在每个旋转处打开它。

优化步骤

多点打开优化以下列内容作为输入:

  • 由验证者采样的随机 ,我们在该点对 求值。
  • 由证明者提供的、每个多项式在每个相关点处的求值:

这些是消失论证(vanishing argument)的输出。

多点打开优化按如下方式进行:

  1. 采样随机 ,以保持 线性无关。

  2. 根据多项式被查询时所在的点集,累加多项式及其对应的求值: 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 是一个由求值集合构成的向量,其中外层向量对应点集(本例中为 ),内层向量对应每个集合中的点。

  3. q_eval_sets 中的每个值集合做插值(interpolate): r_polys:

  4. 构造 f_polys,用于检查 q_polys 的正确性: f_polys

    如果 ,那么 应当是一个多项式。 如果 , 那么 应当是一个多项式。

  5. 采样随机 以保持 f_polys 线性无关。

  6. 构造

  7. 采样随机 ,我们在该点对 求值:

  8. 采样随机 以保持 q_polys 线性无关。

  9. 构造 final_poly, 这就是我们在内积论证(inner product argument)中要承诺的多项式。