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