BulletProof 中的范围证明
本文主要对BulletProofs的这篇论文1中的范围证明进行了一些梳理和学习。
改进的内积证明
在bulletproof论文中的第三章,提出了一种改进的内积证明,虽然不是零知识的,但是可以将通信复杂度降低到 2 l o g 2 ( n ) 2log_2(n) 2log2(n),如果在零知识证明中使用这种内积证明,需要在两个向量中加入盲因子。
内积证明所要证明的是以下关系:
{ ( g , h ∈ G n , P ∈ G , c ∈ Z p ; a , b ∈ Z p n ) : P = g a h b ∩ c = < a , b > } \{ (\pmb g, \pmb h \in G^n,P\in G,c\in Z_p;\pmb a, \pmb b \in Z_p^n): P=\pmb g^{\pmb a}\pmb h^{\pmb b} ∩ c = <\pmb a, \pmb b> \} {
(ggg,hhh∈Gn,P∈G,c∈Zp;aaa,bbb∈Zpn):P=gggaaahhhbbb∩c=<aaa,bbb>}
通过协议1将以上关系转变为以下的关系:
{ ( g , h ∈ G n , P ∈ G , c ∈ Z p ; a , b ∈ Z p n ) : P = g a h b ⋅ u < a , b > } \{ (\pmb g, \pmb h \in G^n,P\in G,c\in Z_p;\pmb a, \pmb b \in Z_p^n): P=\pmb g^{\pmb a}\pmb h^{\pmb b} \cdot u^{<\pmb a, \pmb b>} \} {
(ggg,hhh∈Gn,P∈G,c∈Zp;aaa,bbb∈Zpn):P=gggaaahhhbbb⋅u<aaa,bbb>}
对 a , b \pmb a, \pmb b aaa,bbb两个向量二分再合并,使其通信复杂度下降。
算法实现
算法分作两个部分,protocol 1将证明的两个等式合并成一个,protocol 2通过一个递归算法将需要证明的两个向量,不断二分合并,最后在两个向量为1的时候,给出验证的结果。
运行Protocol 1
为证
{ ( g , h ∈ G n , P ∈ G , c ∈ Z p ; a , b ∈ Z p n ) : P = g a h b ∩ c = < a , b > } \{ (\pmb g, \pmb h \in G^n,P\in G,c\in Z_p;\pmb a, \pmb b \in Z_p^n): P=\pmb g^{\pmb a}\pmb h^{\pmb b}∩ c = <\pmb a, \pmb b> \} {
(ggg,hhh∈Gn,P∈G,c∈Zp;aaa,bbb∈Zpn):P=gggaaahhhbbb∩c=<aaa,bbb>}
verifier:
随机选取x和u,将x发送给prover,再将 P ‘ P^` P‘发送给prover。
P ‘ = P ⋅ u x ⋅ c P^` = P \cdot u^{x \cdot c} P‘=P⋅ux⋅c
协议2得到的输入是 ( g , h , u x , P ‘ ; a , b ) (\pmb g, \pmb h, u^x,P^`;\pmb a, \pmb b) (ggg,hhh,ux,P‘;aa