Bulletproof范围证明之优化

主页

微信公众号:密码应用技术实战
博客园首页:https://www.cnblogs.com/informatics/
GIT地址:https://github.com/warm3snow

简介

Bulletproof将范围证明转换为二次多项式表达t(X)=t0+t1X+t2X2,并通过多项式承诺和内积承诺的验证,完成了范围证明。回顾《Bulletproof范围证明之原理》,我们详细介绍了Bulletproof范围证明的构造和验证流程。本文将进一步介绍Bulletproof范围证明的优化技术 - 折半算法

本文组织如下:

  • 术语定义
  • Bulletproof复杂度分析
  • Bulletproof折半算法
  • 总结
  • 参考文献

术语定义

  • pq:分别表示两个大素数
  • Zp:表示模p的整数环
  • Zp:表示模p的整数环中的所有与p互素的元素, 即非零元素
  • G:阶为p的循环群, 如果:gG,G={1,g,g2,...,gp1}Zp, 则gG的生成元
  • GnZpn:分别表示群G上的n维向量空间和Zp上的n维向量空间
  • hrgx = hri=1ngixi=hrg1x1g2x2...gnxn: 表示向量x的Pedersen承诺值
  • gahb=i=1ngiaihibi: 表示向量ab的Pedersen承诺值
  • a,b=ab=i=1naibi: 表示向量ab的内积。
  • ab=(a1b1,a2b2,...,anbn): 表示向量ab的哈达玛积。
  • a[:n]=(a1,a2,...,an)Fna[n:]=(an+1,an+2,...,an)Fnn: 表示向量a的前n个元素和后nn个元素。
  • PV: 分别表示证明生成者Prover和证明验证者Verifier

Bulletproof复杂度分析

在上一篇文章《Bulletproof范围证明之原理》中,我们介绍了Bulletproof向量内积证明,Bulletproof使用向量内积证明来进行范围证明,流程如下:

image

分析上图中的通信数据包可以发现,交互式Bulletproof向量内积证明过程中,Prover和Verifier需要发送的数据包包括:

  • 承诺C=(V,A,S,T1,T2), 其中V,A,S,T1,T2G, 复杂度为O(1)
  • Verifier需要发送的数据包括:挑战(x,y,z), 其中x,y,zZp, 复杂度为O(1)
  • 响应(τx,μ,t,l,r), 其中τx,μ,tZp, l,rZpn, 复杂度为O(2n)

综上,未优化版本的Bulletproof向量内积证明通信复杂度O(2n)。复杂度主要来自于Prover发送的响应(l,r),其中lr是长度为n的向量。

Bulletproof折半算法

Bulletproof折半算法是Bulletproof的一种优化技木,主要用于减少Bulletproof范围证明的通信复杂度,并实现了O(2log2n)的通信复杂度。Bulletproof折半算法的核心思想是通过递归的方式,不断将向量lr折半,直到两个向量长度都为1,最终发送O(2log2n)个长度为1的数据包,从而实现了数据的压缩。

折半算法

Bulletproof折半算法基于改进的向量内积证明,下面我们将详细介绍Bulletproof折半算法的优化原理。

改进的向量内积

假设gh是两个独立的G生成元,标量cZp,并有PG,向量内积证明的目标是Prover向Verifier证明自己知道向量a,bZpn, 满足以下关系:

P=gahbandc=a,b

其中:

  • Pa,b的向量Pedersen承诺。
  • c表示a,b的向量内积

以上的向量关系可以转换为下面的证明系统

{(g,hGn,PG,cZp;a,bZpn):P=gahbc=a,b}

在上述证明系统中:

  • Prover可以直接将a,bZpn发送给Verifier, Verifier重新计算P并检查是否正确,这种承诺的明文打开和验证方式显然是可以的。
  • Prover需要向Verifier发送2n个元素。

在Bulletproof中,将以上证明系统转换为以下等价的证明系统:

{(g,hGn,u,PG,cZp;a,bZpn):P=gahbua,b}

其中uG的独立且公开的生成元。

折半算法

H函数

在Bulletproof折半算法中,引入了一个特殊的功能函数H:Zp2n+1G

H(w,x,y,z,c)=g[:n]wg[n:]xh[:n]yh[n:]zucG

其中:

  • n=n/2, 即g[:n]表示向量g的前n/2个元素,g[n:]表示向量g的后n/2个元素。h[:n],h[n:]同理
  • 输入参数为五元组{w,x,y,zZpn,cZp}
  • 输出为群G中的元素

上述H函数有一个重要性质: 加法同态。即:

H(w1,x1,y1,z1,c1)H(w2,x2,y2,z2,c2)=H(w1+w2,x1+x2,y1+y2,z1+z2,c1+c2)

同态性证明

H(w1,x1,y1,z1,c1)H(w2,x2,y2,z2,c2)

=g[:n]w1g[n:]x1h[:n]y1h[n:]z1uc1g[:n]w2g[n:]x2h[:n]y2h[n:]z2uc2

=g[:n]w1+w2g[n:]x1+x2h[:n]y1+y2h[n:]z1+z2uc1+c2

=H(w1+w2,x1+x2,y1+y2,z1+z2,c1+c2)

等价转换

按照H函数的定义,我们可以将证明系统中的P重写为:

P=gahbua,b=H(a[:n],a[n:],b[:n],b[n:],a,b)G

等式证明

P=gahbua,b=giaihibiua,b

=i=1ngiaii=n+1ngiaii=1nhibii=n+1nhibiua,b

=g[:n]a[:n]g[n:]a[n:]h[:n]b[:n]h[n:]b[n:]ua,b

=H(a[:n],a[n:],b[:n],b[n:],a,b)G

折半算法构造

Bulletproof折半算法的构造流程如下:

image

  1. Prover计算L,RG, 并发送给Verifier

L=H(0n,a[:n],b[n:],0n,a[:n],b[n:])

=g[:n]0ng[n:]a[:n]h[:n]b[:n]h[n:]0nua[:n],b[n:]

R=H(a[n:],0n,0n,b[:n],a[n:],b[:n])

=g[:n]a[n]g[n:]0nh[:n]0nh[n:]b[:n]ua[n:],b[:n]

  1. Verifier选择随机挑战xZp, 并发送给Prover
  2. Prover计算a,bZpn, 并发送给Verifier

a=xa[:n]+x1a[n:]Zpn

b=x1b[:n]+xb[n:]Zpn

  1. 基于L,R,a,b, Verifier验证以下等式是否成立:

Lx2PRx2=?H(x1a,xa,xb,x1b,a,b)

  • 注:等式中的P是Prover发送的向量内积证明的承诺值

正确性验证

已知:

L=H(0n,a[:n],b[n:],0n,a[:n],b[n:])

P=H(a[:n],a[n:],b[:n],b[n:],a,b)

R=H(a[n:],0n,0n,b[:n],a[n:],b[:n])

根据H函数的同态性质,容易计算:

Lx2PRx2

=H(x20n+a[:n]+x2a[n:],x2a[:n]+a[n:]+x20n,x2b[n]+b[:n]+x20n,x20n+b[n:]+x2b[:n],x2a[:n],b[n:]+a,b+x2a[n:],b[:n])

=H(a[:n]+x2a[n:],x2a[:n]+a[n:],x2b[n]+b[:n],b[n:]+x2b[:n],x2a[:n],b[n:]+a,b+x2a[n:],b[:n])

=H(x1a,xa,xb,x1b,x2a[:n],b[n:]+a,b+x2a[n:],b[:n])

由于:

a,b=xa[:n]+x1a[n:],x1b[:n]+xb[n:]

=(xa[:n]+x1a[n:])(x1b[:n]+xb[n:])

=x2a[:n],b[n:]+a[:n]b[:n]+a[n:]b[n:]+x2a[n:],b[:n]

=x2a[:n],b[n:]+a,b+x2a[n:],b[:n]

因此,我们可以得出:

Lx2PRx2=H(x1a,xa,xb,x1b,a,b)

综上,verifier可以成功验证步骤4中的等式,即折半算法的正确性。

复杂度分析

通过折半算法,在通信过程中,Prover只发送了(P,L,R,a,b), 其中

  • (P,L,R)G, 通信复杂度为O(1)
  • a,bZpn, 通信复杂度为O(n)=O(n/2)

因此通过一轮折半算法,可以将直接发送a,bZpn的复杂度减半。

递归折半算法

通过递归折半的方式,我们可以进一步降低复杂度:

  • Prover可以在(a,b)基础上继续执行折半算法
  • 通过log2n次折半(即:向量长度每次减半),可以将a,bZpn折半为两个元素a,bZp
  • 每次执行折半算法,Prover需要重新生成L,R

由于交互式证明可以通过Fiat-Shamir方法转换为非交互式证明,因此在整个递归折半算法中,Prover仅需要发送以下消息给Verifier:

(L1,R1),...,(Llog2n,Rlog2n),a,b

  • (Li,Ri),i[1:log2n]表示第i次执行折半算法生成, 所有(L,R)复杂度:2log2n
  • a,b为两个元素,复杂度为O(1)

因此Bulletproof通过递归折半算法,成功将通信复杂度降低为2log2n

结语

本文详细分析了Bulletproof范围证明的优化技术 - 折半算法。通过引入H函数和递归折半算法,Bulletproof成功将通信复杂度降低为O(2log2n)。折半算法的优化思想可以应用于其他范围证明系统,从而进一步提高范围证明的效率。除了以上优化技术外,Bulletproof的多个范围证明也可以通过批量验证等技术进一步提高效率。

本文未对Bulletproof递归折半算法构造进行详细证明,感兴趣的读者可以参考《Bulletproofs: Short Proofs for Confidential Transactions and More》进行深入学习。

参考文献

posted @   warm3snow  阅读(155)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示