使用内积证明的多项式承诺

我们欲对 进行承诺,并且可以在任意一点验证承诺的多项式的正确性。 最简单的解决方案就是证明者将多项式的系数发给验证者。但是这种方法需要 次通信。我们的 多项式承诺机制可以仅用 次通信就完成工作。

Setup

给定一个参数 ,并且生成了CRS(common reference string), 并定义了该机制中的一些常数:

  • 是一个 阶的群,其中 为一个素数;
  • 维向量,它的元素都是在群元素中随机挑选;
  • 是一个随机的群元素;
  • 一个 -阶有限域。

Commit

定义Pedersen向量承诺为

其中 是欲承诺的多项式, 是盲化因子。 向量 中的每一个元素 就是多项式 ,的第 项的系数。而 的最大次数是

Open (prover) and OpenVerify (verifier)

经过修改的内积证明是对如下关系信息的一种证明:

其中 是欲求值的点。 内积证明就使证明者能够向验证者证明,承诺 中所承诺的多项式,在 处的值就是 ,还有 承诺的多项式的最大阶数是

内积证明将进行 轮。就我们的目的来说,我们只要知道最终输出就足够了,所以我们只是对 中间轮提供一个直观的描述。(请参考 Halo 论文,以获取全面的解释)。

在开始证明之前,验证者要随机选取一个群元素 并将它发送给证明者。 我们在第 轮将对所需向量做如下初始化, 。在每一轮 :

  • 证明者都要用 进行内积计算得到两个值 。 这里要“交叉项”("cross-terms")有个概念,即: 的低半部分与 的高半部分运算,反之亦然。

  • 验证者发送一个随机挑战

  • 证明者就使用 的低半部分与高半部分压缩乘只有原向量一半的新的向量。 向量 也进行类似的压缩,从而得到 .

  • , and 是下一轮,即 轮的输入。

注意在最后一轮,即 轮,我们只剩下 , , 每个向量的长度都是1。直观讲, 这些最终的标量,和每一轮的 以及每一轮的“交叉项” , 实际上是编码了每一轮的压缩操作。由于证明者并不能事先知道挑战 ,他们就不能人为操控每一轮的压缩。因此,验证最后这些项的约束就能证明每一轮的压缩都是正确的, 同时也证明了在压缩开始前原始 就满足特定的关系。

事实上,每一轮的 就是公开信息 计算出来的, 因此验证者可以自己计算每一轮的 ,以验证证明者是否提供了正确的值(二者值应该相等)。