随机线性组合(Random linear combinations)是零知识证明算法中常见的技巧,它能将 个相等性检查以概率的形式合并为单次相等性检查。假设我们有 个需要证明的内积(inner products)。我们不需要创建 个证明,而是可以创建这些等式的随机线性组合并对其进行证明。
Pedersen 承诺的相等性
首先,让我们考虑如何证明多个 Pedersen 承诺的相等性。
如果我们有离散对数未知的椭圆曲线点 和 ,以及盲化因子(blinding terms) 和 ,我们可以构造 Pedersen committments 和 ,其中
如果证明者提供了盲化因子的差值,验证者就可以检查 是否成立。验证者不能简单地检查 ,因为盲化因子通常彼此不相等,即 。
如果证明者希望让验证者相信 和 分别是 和 的承诺,但不泄露 和 ,证明者可以计算
并将 发送给验证者。验证者计算
在底层,这可以展开为
所有的盲化因子都会抵消,剩下 。
但假设证明者希望建立几个承诺的相等性,即 。朴素的解决方案是发送 个盲化因子 ,然后验证者将运行 次相等性检查。这将需要发送 个域元素(),并且验证者的算法运行时间将为 。
为什么证明者不能直接将所有承诺相加
假设我们有 ,它们对应的承诺分别为 。同时假设证明者想要在不泄露它们的情况下证明 且 。
以下检查是不安全的:
其中 是盲化因子的差值。作为一个反例,考虑 的情况。它们的和是相等的,但最初的声明是不正确的。
随机线性组合
然而,如果要求证明者证明:
对于一个他们无法预测的随机值 也成立,那么该方案就是安全的。
具体来说,证明者和验证者执行以下算法:
随机化相等性证明
设置
证明者和验证者就椭圆曲线点 和 达成共识,其中离散对数是未知的。
证明者发送承诺
证明者生成盲化因子 并创建 Pedersen 承诺
并将 发送给验证者。
验证者选取随机数
验证者选择一个随机域元素 并将其发送给证明者。
证明者计算盲化因子的差值
证明者计算 并将 发送给验证者。
最终验证检查
验证者检查以下等式是否成立:
安全性分析
如果 且 ,那么无论 的选择如何,假设证明者正确计算了 ,该等式都将保持平衡。
现在假设 或 。证明者仍然无法生成有效的 ,因为这样做将需要求解 和 的离散对数。
推广到 个检查
如果我们有 个相等性检查,即 ,验证者可以发送 个随机元素 ,且证明者可以提供 ,使得:
然而,这需要验证者发送 个元素,从而导致线性的通信开销。如果验证者只发送 ,并且证明者和验证者用 的连续幂次将承诺隔开,通信开销可以降低到常数级别:
安全性分析
左侧(left-hand-side)和右侧(right-hand-side)都是次数为 的多项式。如果它们彼此不相等,那么根据 Schwartz Zippel Lemma(施瓦茨-齐佩尔引理),它们最多在 个点处相交。如果 (其中 是有限域的阶),那么 成为交点的概率依然可以忽略不计。
内积的随机线性组合
我们可以将上述技术推广,从而将多个内积组合在一起。
假设我们有两个内积
且
因为这两个内积共享一个公共项,在代数上可以将它们组合如下:
然而,从可靠性(soundness)的角度来看,这是不安全的,因为可能存在 且 ,但 的情况。
果然不出所料,我们可以通过使用随机线性组合来解决这个问题。
我们只需为一个内积创建内积证明,而不需要为两个内积分别创建。至关重要的是,证明者必须在发送相关承诺之后才接收到 ,但我们将具体细节留到下一章,届时我们将看到一个使用此技术的算法示例:范围证明(range proofs)。
本教程是 ZK Bulletproofs 系列的一部分。