Bulletproofs 是一种无需信任基础设置的范围证明. 其特点在于零知识证明性、与 Pedersen 承诺的兼容性以及应用 Fiat–Shamir 后得到的非交互式证明.
基础知识
以下, 我们约定 (G,+) 是阶为 p 的群, 那么群上有自然的数乘 Zp×G→G:(a,G)↦aG. 我们要求在群 G 上离散对数问题是困难的 (一般采用椭圆曲线上的加法群) .
给定群 G, 群的生成元 G 和群中元素 H, 离散对数问题要求找到 a∈Zp, 使得 H=aG. (作为乘法群时为 H=Ga) 形式化地可以将等式改写为 a=logGH, 离散对数因此得名.
当 G=Zp 时, 我们可以 “计算” 出 a 的值, 这是因为 Zp 不仅是一个群而且是一个域; 但对一般的加法群 (G,+) 我们并没有这一结构.
离散对数问题困难性假设是指, 对于上述的离散对数问题, 不存在 (经典) 概率多项式算法求解. 使用 Shor 算法 (量子算法) 可以在多项式时间内处理这一问题, 但这超出了我们的篇幅.
以下, 我们均假设离散对数问题是困难的.
我们有推论:
给定群 G, 群的生成元 G1,…,Gn 和群中元素 H, 寻找一组解 a1,…,an∈Zp, 使得 H=∑i=1naiGi, 是困难的.
承诺
证明者需要向验证者证明其知道 v∈Zp. 利用群 G 中公开的生成元 A,B, 证明者随机选取致盲因子 v~∈Zp, 计算 V=vA+v~B 并将 V 发送给验证者. 当需要验证时, 证明者将 v,v~ 发送给验证者, 验证者计算并证明等式是否成立.
Pedersen 承诺具有完全掩藏性和计算绑定性. 掩藏性指的是只有承诺
V 的情况下无法直接得到
v 的信息; 绑定性指的是给出承诺
V 后证明者无法更改信息.
Pedersen 承诺具有同态性, 这是因为群 G 有 Zp-模的结构. 同态性的好处是在公开关于初始值的多项式时, 可以只发送致盲因子的多项式 (发送一个值) 达到打开承诺的目的. 比如说证明者生成了 (v1,v1~,V1) 和 (v2,v2~,V2) 两个承诺, 当其需要打开 v1+v2 时, 其只需要发送 v1+v2 和 v1~+v2~ 两个值即可, 这样不会单独暴露 v1 和 v2 的信息.
我们可以把 Pedersen 承诺推广到需要同时证明多个量 vi,i=1,…,n 的情况. 此时我们利用公开的生成元 Ai, i=1,…,n 以及 B, 计算 V=∑iviAi+v~B 并将 V 发送给验证者. 在离散对数困难性假设的前提下, 对于随机选取的 Ai,B, 在多项式时间内无法找到这些生成元之间的线性关系, 从而这一承诺是计算可靠的 (是绑定的) .
内积论证
我们给出内积论证的定义:
给定公开的生成元 C,D, 证明者发给验证者的 P∈G, c∈Zp, 证明者需要向验证者证明其知道两个向量 a,b, 使得 ⟨a,C⟩+⟨b,D⟩=P 且 ⟨a,b⟩=c
一种变种为:
给定公开的生成元 B,C,D, 证明者发给验证者的 P∈G, 证明者需要向验证者证明其知道两个向量 a,b, 使得 P=⟨a,C⟩+⟨b,D⟩+⟨a,b⟩B
范围证明
对于 y∈Zp, 令 yn=(1,y,…,yn−1)∈Zpn. 特别地 1=1n=(1,…,1)∈Zpn.
证明者需要在 Pedersen 承诺的基础上向验证者证明 v∈[0,2n−1], 其中 n 一般取 2 的幂次. 令 aL∈Zpn 为 v 在二进制表示下的各位构成的向量, 即 ⟨aL,2n⟩=v. 令 aR=aL−1, 那么应当有 aL⊙aR=0.
当向量 v=0 时, 对任意的 y 有 ⟨v,yn⟩=0. 反过来对任意取定的 v=0, 当 y 随机选取时, ⟨v,yn⟩=0 的概率不超过 pn (考虑关于 y 的不超过 n 次多项式, 至多有 n 个不重复的根) 对于较大的 p (Bulletproofs 考虑 p=2255−19) 这一情况可以忽略不计.
于是对于验证者提供的随机的 y∈Zp, 只需要验证⟨aL,2n⟩⟨aL,yn⟩−⟨1,yn⊙aR⟩⟨aL,yn⊙aR⟩=v=⟨1,yn⟩=0
对于验证者提供的随机的 z∈Zp, 将上述式子组合得到z2v+z⟨1,yn⟩=z2⟨aL,2n⟩+z⟨aL,yn⟩−z⟨1,yn⊙aR⟩+⟨aL,yn⊙aR⟩等号右边进行一些合并: z2⟨aL,2n⟩+z⟨aL,yn⟩−z⟨1,yn⊙aR⟩+⟨aL,yn⊙aR⟩=⟨aL,z22n+zyn⟩+⟨aL−z1,yn⊙aR⟩=⟨aL−z1,yn⊙(aR+z1)+z22n⟩+z3⟨1,2n⟩+z2⟨1,yn⟩那么⟨aL−z1,yn⊙(aR+z1)+z22n⟩=z2v+δ(y,z)(1)
其中δ(y,z)=(z−z2)⟨1,yn⟩−z3⟨1,2n⟩
注意到 y,z 都由验证者提供, 所以 δ(y,z) 可以由验证者自行算出.
为了验证 (1) 成立, 一般需要将内积的两个向量发给验证者, 但这当然会暴露关于 v 的信息 (想象一下不诚实的验证者使用了 z=0, 从而得到了 aL 的信息) ;
这里采用的处理方法是证明者引入随机的掩盖向量 sL,sR∈Zpn 并承诺; 将原本内积中的 aL,aR 变更为 aL+αsL,aR+αsR. 这样左边的内积记为 t(α)=⟨l(α),r(α)⟩=t0+t1α+t2α2, 其中 l(α)=aL−z1+αsL, r(α)=yn⊙(aR+z1)+z22n+αyn⊙sR.
证明者将 t1,t2 承诺给验证者 (因为这些系数都包含 sL,sR, 所以不会暴露关于 aL,aR 的信息. 对于验证者随机选取的 x∈Zp, 证明者计算 lx=l(x), rx=r(x), tx=⟨l,r⟩, 将 l,r 发送给验证者, 将 tx 和 tx~=z2v~+t1~x+t2~x2 发给验证者.
验证者得到 tx,t1,t2 的 Pedersen 承诺后利用同态可以算出 t0 的 Pedersen 承诺, 但仍然需要验证几件事情:
1. | lx=aL−z1+xsL, rx=yn⊙(aR+z1)+z22n+xyn⊙sR; |
2. | tx=z2v+δ(y,z)+t1x+t2x2; |
3. | ⟨lx,rx⟩=tx |
为了验证 tx=z2v+δ(y,z)+t1x+t2x2, 利用 v 的 Pedersen 承诺 V=vA+v~B, 验证者计算等式txA+tx~B=z2(vA+v~B)+δ(y,z)A+x(t1A+t1~B)+x2(t2A+t2~B)于是证明者需要保证tx~=z2v~+xt1~+x2t2~此时验证者只需验证txA+tx~B=z2V+δ(y,z)A+xT1+x2T2
为了验证 lx=aL+xsL−z1, rx=yn⊙(aR+xsR+z1)+z22n, 我们利用已有的承诺 Ea=⟨aL,C⟩+⟨aR,D⟩+uaB, Es=⟨sL,C⟩+⟨sR,D⟩+usB. 那么Ea+xEs=⟨lx+z1,C⟩+⟨y−n⊙(rx−z22n)−z1,D⟩+(ua+xus)B第一项很容易拆成 ⟨lx,C⟩+z⟨1,C⟩. 第二项较为复杂: ⟨y−n⊙(rx−z22n)−z1,D⟩=⟨y−n⊙(rx−z22n),D⟩−z⟨1,D⟩=⟨rx−z22n,y−n⊙D⟩−z⟨1,D⟩=⟨rx,y−n⊙D⟩−z2⟨2n,y−n⊙D⟩−z⟨1,D⟩第三项中注意到 ua 与 us 同时出现, 所以可以设 u=ua+xus, 此时有⟨lx,C⟩+⟨rx,y−n⊙D⟩=Q(x,y,z)−uB(2)其中 Q(x,y,z)=Ea+xEs+z⟨1,D−C⟩+z2⟨2n,y−n⊙D⟩ 可以由验证者得到 Ea,Es 后自行计算, u 需要由证明者发给验证者.
以下我们写出具体的协议步骤. (待整理) 记证明者为 P, 验证者为 V, 公开的生成元为 A,B,C,D.
1. | P: v~←Zp, V=vA+v~B |
2. | P→V: V |
3. | P: sL,sR←Zpn |
4. | P: ua,us←Zp, Ea=⟨aL,C⟩+⟨aR,D⟩+uaB, Es=⟨sL,C⟩+⟨sR,D⟩+usB |
5. | P→V: Ea,Es |
6. | V: y,z←Zp |
7. | V→P: y,z |
8. | P: t1=⟨sL,yn⊙(aR+z1)+z22n⟩+⟨aL−z1,sR⟩, t2=⟨sL,sR⟩ |
9. | P: t1~,t2~←Zp, T1=t1A+t1~B, T2=t2A+t2~B. |
10. | P→V: T1,T2 |
11. | V: x←Zp |
12. | V→P: x |
13. | P: lx=aL−z1+xsL, rx=yn⊙(aR+z1)+z22n+xyn⊙sR; tx=⟨lx,rx⟩; |
14. | P: tx~=z2v~+xt1~+x2t2~, u=ua+xus |
15. | P→V: tx~,lx,rx,u,tx |
16. | V: Q(x,y,z)=Ea+xEs+z⟨1,D−C⟩+z2⟨2n,y−n⊙D⟩, δ(y,z)=(z−z2)⟨1,yn⟩−z3⟨1,2n⟩ |
17. | V 验证: txA+tx~B=z2V+δ(y,z)A+xT1+x2T2, ⟨lx,C⟩+⟨rx,y−n⊙D⟩=Q(x,y,z)−uB, ⟨lx,rx⟩=tx |
基于对数内积证明的改进
注意到最后一步中后两个式子形同于在 (C,y−n⊙D,Q(x,y,z)−uB,tx) 处对 lx,rx 的内积论证, 所以可以调用优化, 不直接发送 lx,rx, 将发送的元素个数从 2n 降低到 2log2(n)+2.