BulletProof的工作原理
Building on BulletProof
Range Proof
我们要证明一个 statement(论述): 0 ≤ v < 2 n 0 \le v < 2^n 0≤v<2n
我们知道如果这个论述是真的话,那么 v v v 必须是一个 n n n 长度的二进制数。例如,如果 n = 4 n=4 n=4 并且 v = 3 v=3 v=3,那么 v v v 可以被分解为一个二进制数即 4 位长度。
我们想以内积的形式展示这个声明(claim),这是由于 BulletProof 推出的高效率的内积证明(inner product proof)。
首先,让我们定义 v 的比特形式为:
V
b
i
t
s
V_{bits}
Vbits
如果
v
b
i
t
s
v_{bits}
vbits 的确是
v
v
v 的比特形式,
v
v
v 必须与
v
b
i
t
s
v_{bits}
vbits 和 向量
2
n
2^n
2n 的内积相等,
2
n
2^n
2n 向量的展开为长度为
n
n
n 的
(
2
0
,
2
1
,
.
.
.
,
2
n
−
1
)
(2^0, 2^1,...,2^{n-1})
(20,21,...,2n−1)
此外,我们必须要确保
v
b
i
t
s
v_{bits}
vbits 的确是由
{
0
,
1
}
\{0,1\}
{0,1} 构成,不能出现其他数字:
V b i t s ∘ ( V b i t s − 1 n ) = 0 n V_{bits} \circ(V_{bits}-1^n)=0^n Vbits∘(Vbits−1n)=0n 这个等式为什么能够检测其是否是由 0,1 组成?
例如 V b i t s = ( 0 , 0 , 1 , 1 ) V_{bits} = (0,0,1,1) Vbits=(0,0,1,1),那么 ( V b i t s − 1 n ) = ( − 1 , − 1 , 0 , 0 ) (V_{bits} - 1^n) = (-1,-1,0,0) (Vbits−1n)=(−1,−1,0,0),那么这两个向量的内积必须是 0,如果 V b i t s V_{bits} Vbits 出现了 0,1 以外的元素,那么内积结果肯定不为 0。
之后,我们使用挑战标量结合这两个 statements,并且增加盲因子(blinding factors)。
Inner Product Proof
一个 Inner Product Proof 证明 c c c 是向量 a \mathbf{a} a 和 b \mathbf{b} b 的内积,即: c = < a , b > c=<\mathbf{a,b}> c=<a,b>。那么一个向量内积表示为:
简单的版本:Prover 可以通过向 Verifier 发送 a \mathbf{a} a , b \mathbf{b} b 和 c,那么 Verifier 就可以通过计算 c = < a , b > c = <\mathbf{a},\mathbf{b}> c=<a,b> 来验证。然而,这会有 o ( n ) o(n) o(n) 的空间复杂度和 o ( n ) o(n) o(n) 的时间复杂度。 n n n 是 a \mathbf{a} a , b \mathbf{b} b 的长度。但是,bulletproofs inner pruduct 为我们提供了 o(log n) 的空间复杂度。
bullet proof innner product 要求在向 Verifier 之前有 log(n) 的步骤,最后发送给 Verifier 的 a \mathbf{a} a 和 b \mathbf{b} b 的长度都是 1。
在我们开始之前,我们可以将原始向量
a
\mathbf{a}
a 和
b
\mathbf{b}
b 分为 hi
和 lo
两部分:
之后,我们得到一个挑战标量
x
x
x,并结合 hi
和 lo
来创建
a
′
\mathbf{a'}
a′ 和
b
′
\mathbf{b'}
b′,有
c
′
=
<
a
′
,
b
′
>
c'=<\mathbf{a'},\mathbf{b'}>
c′=<a′,b′>。
我们对
c
′
\mathbf{c'}
c′ 进行数学扩展,注意:
c
′
\mathbf{c'}
c′ 的两个元素
a
′
\mathbf{a'}
a′ 和
b
′
\mathbf{b'}
b′ ,也可以划分为 hi
和 lo
两部分,因此我们可以简化
c
′
\mathbf{c'}
c′ 表达式,并将其称为 L
和 R
:
在每一轮中, Prover 发送 L
和 R
给 Verifier,并且使用
a
′
,
b
′
,
c
′
\mathbf{a'},\mathbf{b'},\mathbf{c'}
a′,b′,c′ 作为
a
,
b
,
c
\mathbf{a},\mathbf{b},\mathbf{c}
a,b,c。log n 轮过后,我们得到了我们最开始的假设,
a
′
\mathbf{a'}
a′ 和
b
′
\mathbf{b'}
b′ 的长度都为 1。然后,无需再进行任何压缩,Prover 可以将
a
′
,
b
′
,
c
′
\mathbf{a'},\mathbf{b'},\mathbf{c'}
a′,b′,c′ 发送给 Verifier。
Verifier 现在拥有标量
a
′
,
b
′
,
c
′
\mathbf{a'},\mathbf{b'},\mathbf{c'}
a′,b′,c′ 和每一步产生的 L
和 R
,Verifier 可以反转整个过程,他可以通过验证
c
′
=
a
′
∗
b
′
c' = a' * b'
c′=a′∗b′。Verifier 可以通过每一步产生的
c
′
\mathbf{c'}
c′, L
, R
来验证
c
\mathbf{c}
c,直到完成所有步骤的检查。
链接
Bulletproofs: Short proofs for confidential transactions and more
Building on Bulletproofs
innner product notes