使用内积证明的多项式承诺
我们欲对 进行承诺,并且可以在任意一点验证承诺的多项式的正确性。 最简单的解决方案就是证明者将多项式的系数发给验证者。但是这种方法需要 次通信。我们的 多项式承诺机制可以仅用 次通信就完成工作。
Setup
给定一个参数 ,并且生成了CRS(common reference string), 并定义了该机制中的一些常数:
- 是一个 阶的群,其中 为一个素数;
- 是 维向量,它的元素都是在群元素中随机挑选;
- 是一个随机的群元素;
- 一个 -阶有限域。
Commit
定义Pedersen向量承诺为
其中 是欲承诺的多项式, 是盲化因子。 向量 中的每一个元素 就是多项式 ,的第 项的系数。而 的最大次数是 。
Open
(prover) and OpenVerify
(verifier)
经过修改的内积证明是对如下关系信息的一种证明:
其中 而 是欲求值的点。 内积证明就使证明者能够向验证者证明,承诺 中所承诺的多项式,在 处的值就是 ,还有 承诺的多项式的最大阶数是 。
内积证明将进行 轮。就我们的目的来说,我们只要知道最终输出就足够了,所以我们只是对 中间轮提供一个直观的描述。(请参考 Halo 论文,以获取全面的解释)。
在开始证明之前,验证者要随机选取一个群元素 并将它发送给证明者。 我们在第 轮将对所需向量做如下初始化, , 。在每一轮 :
- 证明者都要用 , 和 进行内积计算得到两个值 和 。 这里要“交叉项”("cross-terms")有个概念,即: 的低半部分与 和 的高半部分运算,反之亦然。
-
验证者发送一个随机挑战 ;
-
证明者就使用 将 的低半部分与高半部分压缩乘只有原向量一半的新的向量。 向量 和 也进行类似的压缩,从而得到 和 .
-
, and 是下一轮,即 轮的输入。
注意在最后一轮,即 轮,我们只剩下 , , 每个向量的长度都是1。直观讲, 这些最终的标量,和每一轮的 以及每一轮的“交叉项” , 实际上是编码了每一轮的压缩操作。由于证明者并不能事先知道挑战 ,他们就不能人为操控每一轮的压缩。因此,验证最后这些项的约束就能证明每一轮的压缩都是正确的, 同时也证明了在压缩开始前原始 就满足特定的关系。
事实上,每一轮的 就是公开信息 与 计算出来的, 因此验证者可以自己计算每一轮的 ,以验证证明者是否提供了正确的值(二者值应该相等)。