论文笔记:Succinct Zero-Knowledge Batch Proofs for Set Accumulators
论文介绍
Succinct Zero-Knowledge Batch Proofs for Set Accumulators是CCS信息安全顶会2021的论文
这篇论文目的是利用RSA累加器降低区块链批处理证明的proof size
前置知识
累加器的概念
区块链中的密码累加器通常就是Merkle树
问题:用ZKSNARK结合Merkle证明的时候不适合大批量
ADS的概念
经过身份验证的数据结构,默克尔树就是典型的ADS
ADS的设计问题:
- 如何获得隐私
- 如何提高吞吐量
ADS要么具有简洁的批量证明,但验证者必须知道并接收这些元素(违背隐私性),这两者是矛盾的
问题设定
零知识(ZK)证明可以真正实现这样的用例,同时为相关实体提供数学上可证明的隐私。比如ZK证明将表明一个想要参加音乐会的人P知道一个地址A的密钥,该地址属于BAYC NFT持有者的10,000个地址集。进一步分解:
- 公共输入是在链中某一特定NFT的所有地址的集合S
- 私人输入P为密钥sk
- 我们想在ZK中证明的是,从sk派生的地址在集合S中
G i v e n S = { x 1 , . . . x n } a n d u 1 , . . . , u m P r o v e u 1 , . . . u m ∈ S Given \ S = \{x_1,...x_n\} \ and \ u_1,...,u_m \\Prove \ u_1,...u_m \in S Given S={x1,...xn} and u1,...,umProve u1,...um∈S
在零知识学术文献中,这种证明通常被称为成员证明。有几种方法可以生成这样的证明。如果集合不是太大,可以使用RSA累加器。
使用RSA累加器,集合S可以用一个短值表示——成员证明也很短。
在S中添加或删除地址的代价也很低,与累计值的数量无关。
然而,在最坏的情况下,累积集合S和产生证明所花费的时间可能与S的大小成线性关系(实际的时间范围取决于设置的具体情况,甚至可能是恒定时间)。
技术概述
G i v e n S = { x 1 , . . . x n } a n d u 1 , . . . , u m P r o v e u 1 , . . . u m ∈ S Given \ S = \{x_1,...x_n\} \ and \ u_1,...,u_m \\Prove \ u_1,...u_m \in S Given S={x1,...xn} and u1,...,umProve u1,...um∈S
首先应用RSA累加器将集合压缩成一个简洁的摘要
a
c
c
=
g
x
1
⋅
x
2
⋅
.
.
.
⋅
x
n
acc = g^{x_1·x_2·...·x_n}
acc=gx1⋅x2⋅...⋅xn
此时要证明
t
o
P
r
o
v
e
u
1
,
.
.
.
u
m
∈
S
只需要提供一个单独的组元素就足够了
to \ Prove \ u_1,...u_m \in S \\只需要提供一个单独的组元素就足够了
to Prove u1,...um∈S只需要提供一个单独的组元素就足够了
W = g Π i ∈ [ n ] x i / Π i ∈ [ m ] u j 给 x 中排出 u 的所有元素,也叫余因子 W = g^{\Pi_{i\in[n]}x_i/\Pi_{i\in[m]}u_j} \\给x中排出u的所有元素,也叫余因子 W=gΠi∈[n]xi/Πi∈[m]uj给x中排出u的所有元素,也叫余因子
验证者只需要check
W
u
1
,
.
.
.
u
m
=
a
c
c
W^{u_1,...u_m}=acc
Wu1,...um=acc
虽然简洁,但RSA累加器的批成员证明并不隐藏ui元素,因为验证者应该知道它们以便执行幂运算。为了解决这个问题,我们可以使用非交互式零知识求幂证明。
证明者计算:r是一个足够大的随机数
R
←
W
r
R ← W^r
R←Wr
随机oracle挑战:
h
←
H
(
a
c
c
∣
∣
g
∣
∣
W
∣
∣
R
)
(
为
a
c
c
,
g
,
W
,
R
生成
h
a
s
h
摘要
)
k
←
r
+
h
⋅
Π
i
∈
m
u
i
h ← H(acc||g||W||R) \\(为acc,g,W,R生成hash摘要) \\k ← r +h·\Pi_{i\in m}u_i
h←H(acc∣∣g∣∣W∣∣R)(为acc,g,W,R生成hash摘要)k←r+h⋅Πi∈mui
验证者收到zk-proof的条件是
h
=
H
(
a
c
c
∣
∣
g
∣
∣
W
∣
∣
R
)
R
⋅
a
c
c
h
=
W
k
这里自行推导如下:
R
⋅
a
c
c
h
=
W
k
=
W
r
+
h
⋅
Π
i
∈
m
u
i
=
W
r
⋅
W
h
⋅
Π
i
∈
m
u
i
=
R
⋅
W
Π
i
∈
m
u
i
h
=
R
⋅
a
c
c
h
h = H(acc||g||W||R) \\R·acc^h = W^k \\这里自行推导如下: R·acc^h = W^k = W^{r +h·\Pi_{i\in m}u_i} = W^r ·W^{h·\Pi_{i\in m}u_i} \\={R·W^{\Pi_{i\in m}u_i}}^{h}=R·acc^h
h=H(acc∣∣g∣∣W∣∣R)R⋅acch=Wk这里自行推导如下:R⋅acch=Wk=Wr+h⋅Πi∈mui=Wr⋅Wh⋅Πi∈mui=R⋅WΠi∈muih=R⋅acch
这样的话就可以在不泄露ui元素的情况下执行验证
然而,该协议尚未实现我们的目标,即为提交的ui批成员验证
为实现这一目标,我们需要解决以下技术挑战。
问题
( A ) 验证者需要了解W, 它本身可以泄露有关其证明成员身份的元素的信息,比如m =1(验证成员组的长度) ,那么我可以通过暴力测试集排除法合有效地找到元素u1
遍历成员找到
W
x
i
?
=
a
c
c
遍历成员找到W^{x_i} \ ?= acc
遍历成员找到Wxi ?=acc
( B )
证据
(
R
,
h
,
k
)
上面简单地显示了指数的存在
u
这样
W
u
=
a
c
c
特别是它没有将此声明与提交的
(
u
1..
u
m
)
绑定
即
u
=
u
1
⋅
⋅
⋅
u
m
证据(R, ℎ, k) 上面简单地显示了指数的存在u这样W^u = acc \\特别是它没有将此声明与提交的(u1..u_m)绑定 \\即u = u_1 · · ·u_m
证据(R,h,k)上面简单地显示了指数的存在u这样Wu=acc特别是它没有将此声明与提交的(u1..um)绑定即u=u1⋅⋅⋅um
( C ) 这个证明并不简洁,因为整数k是O(m)位长。
( D ) 最值得注意的是,上述∑-协议甚至不健全,除非challenge是二进制的,即ℎ ∈ {0, 1}
说白了就是可靠性的问题,根据已有论文查询到,RSA累加器上的∑-协议最多可以有1/2的可靠性误差,这意味着它们需要多次重复(例如λ = 128)以使它们充分(具有可忽略的可靠性误差)。这通常会使协议的cost太高。
一个通常的直觉性的做法是:
提取
(
R
,
h
,
k
)
a
n
d
(
R
′
,
h
′
,
k
′
)
a
c
c
h
−
h
′
=
W
k
−
k
′
这样的话真实值
a
c
c
=
W
k
−
k
′
h
−
h
′
但是
(
h
−
h
′
)
−
1
在未知阶数的组中不能有效地计算指数
所以只能有
h
∈
0
,
1
,这样的话
h
−
h
′
=
1
,误差固定为
1
提取(R,h,k) \ and \ (R',h',k') \\acc^{h-h'} = W^{k-k'} \\这样的话真实值acc = W^{\frac{k-k'}{h-h'}} \\但是{(h-h')}^{-1}在未知阶数的组中不能有效地计算指数 \\所以只能有ℎ ∈ {0, 1},这样的话h-h'=1,误差固定为1
提取(R,h,k) and (R′,h′,k′)acch−h′=Wk−k′这样的话真实值acc=Wh−h′k−k′但是(h−h′)−1在未知阶数的组中不能有效地计算指数所以只能有h∈0,1,这样的话h−h′=1,误差固定为1
求解挑战A
关键贡献是使用SNARK有效地证明该∑-协议的验证的有效技术。值得注意的是,我们不需要在SNARK约束系统7中编码任何RSA组操作。
为RSA累加器见证引入了一种新的随机化方法:
W
∣
→
W
^
W {|→} \hat{W}
W∣→W^
我们的隐藏W转换工作如下:
l
e
t
p
1
,
p
2
,
.
.
.
p
2
λ
为
2
λ
个素数
.
let \ p_1,p_2,...p_{2\lambda}为 2\lambda个素数.
let p1,p2,...p2λ为2λ个素数.
我们总是(人为地)将这些素数添加到累加器中,即集合的累加器S 是RSA累加器
a
c
c
^
o
f
S
^
←
S
∪
{
p
1
,
p
2
,
.
.
.
p
2
λ
}
a
c
c
^
←
a
c
c
p
1
.
.
.
p
2
λ
(
只要素数取的好,那我们就可以假定
S
不包含任何
p
i
)
\hat{acc} \ of \ \hat S ← S ∪ \{p_1,p_2,...p_{2\lambda}\} \\\hat{acc} ← acc^{p_1...p_{2\lambda}} \\(只要素数取的好,那我们就可以假定S不包含任何p_i)
acc^ of S^←S∪{p1,p2,...p2λ}acc^←accp1...p2λ(只要素数取的好,那我们就可以假定S不包含任何pi)
然后我们就可以出示隐藏的W(我们将引入素数的概率提到1/2)
更正式一点,我们采样:
b
i
←
{
0
,
1
}
s
e
t
W
^
←
W
Π
i
∈
[
2
λ
]
p
i
1
−
b
i
(
注意
b
i
应保持隐藏
)
b_i ← \{0,1\} \\ set \ \hat W ← W^{\Pi_{i\in[2\lambda]}p_i^{1-b_i}} \\(注意b_i应保持隐藏)
bi←{0,1}set W^←WΠi∈[2λ]pi1−bi(注意bi应保持隐藏)
此时的证明将变成:
W
^
Π
i
∈
[
m
]
u
i
⋅
Π
i
∈
[
2
λ
]
p
i
b
i
=
a
c
c
^
\hat W^{\Pi_{i\in[m]}u_i·\Pi_{i\in[2\lambda]}p_i^{b_i}} = \hat {acc}
W^Πi∈[m]ui⋅Πi∈[2λ]pibi=acc^
因此,我们可以使用NIZK( 非交互式零知识证明)进行上述求幂
该技术解决了挑战(A),因为它将RSA累加器验证转换为ZK验证。
求解挑战B
Σ协议又称为诚实验证者的(特殊)零知识证明
为了解决
B
,我们将
∑
−
协议链接到
c
u
→
即对所有人的承诺
u
i
’
s
通过使用
z
k
S
N
A
R
K
证明
k
来自承诺的合法
u
i
’
s
为了解决B,我们将∑-协议链接到c_{\overset{→}u} \\即对所有人的承诺u_i’s \\通过使用zkSNARK证明k来自承诺的合法u_i’s
为了解决B,我们将∑−协议链接到cu→即对所有人的承诺ui’s通过使用zkSNARK证明k来自承诺的合法ui’s
也就是说,它证明:
c
u
→
(
对所有人的承诺
u
i
’
s
)
a
n
d
c
r
,
s
,
(
s
=
Π
i
∈
[
2
λ
]
p
i
b
i
)
a
n
d
r
,
基于等式
k
=
r
+
h
⋅
s
⋅
Π
i
∈
[
m
]
u
i
保留的整数
a
n
d
u
i
>
p
2
λ
f
o
r
e
a
c
h
i
∈
[
m
]
c_{\overset{→}u}(对所有人的承诺u_i’s) \\and \ c_{r,s} \ ,(s=\Pi_{i\in[2\lambda]}p_i^{b_i}) \\and \ r\ , 基于等式k = r + h·s·\Pi_{i\in[m]} u_i 保留的整数 \\ and \ u_i > p_{2\lambda} \ for \ each \ i \in \ [m]
cu→(对所有人的承诺ui’s)and cr,s ,(s=Πi∈[2λ]pibi)and r ,基于等式k=r+h⋅s⋅Πi∈[m]ui保留的整数and ui>p2λ for each i∈ [m]
我们约定:
p
2
λ
=
a
r
g
m
a
x
(
p
i
′
s
)
p_{2\lambda} = argmax(p_i's)
p2λ=argmax(pi′s)
所以
u
i
>
p
2
λ
转化为
u
i
≠
p
j
f
o
r
a
l
l
j
∈
[
2
λ
]
u_i > p_{2\lambda} 转化为u_i ≠ p_j \ for \ all \ j \in [2\lambda]
ui>p2λ转化为ui=pj for all j∈[2λ]
这意味着e包含元素ui’s,它是先验的,它们是合法的(不是人为添加的pi’s中的一个) 。
解决挑战C
尽管上述RSA累加器、∑-协议、zkSNARK和我们的RSA累加的隐藏技术之间的谨慎相互作用为集合成员身份提供了安全的零知识证明,但它还不够简洁,因为整数k是O(m)位长。
为了解决这一技术难题,我们应用指数PoKE知识的简洁证明(当做一个黑盒工具使用)
不是发送k,而是由证明者发送
B
=
W
^
k
附带有一个整数的简洁证明:存在整数
k
使得
B
=
W
^
k
B = \hat W^k \\附带有一个整数的简洁证明:存在整数k使得B = \hat W^k
B=W^k附带有一个整数的简洁证明:存在整数k使得B=W^k
然而,添加PoKE证明打破了∑协议和zkSNARK之间的联系,因为后者应该为公众生成证明k.
为了解决该问题:
我们“打开PoKE验证的盒子”,观察到验证者收到了短整数
k
^
=
k
m
o
d
l
l
是一个
2
λ
b
i
t
s
的一个随机素数
c
h
a
l
l
e
n
g
e
\hat k = k \ mod \ l \\l是一个2\lambda bits的一个随机素数challenge
k^=k mod ll是一个2λbits的一个随机素数challenge
因此,我们协议的最后一个想法是让zkSNARK证明与上述相同的声明,类似:
k
^
=
r
+
h
⋅
s
⋅
Π
i
∈
[
m
]
u
i
m
o
d
l
\hat k = r + h·s·\Pi_{i\in[m]}u_i \ mod \ l
k^=r+h⋅s⋅Πi∈[m]ui mod l
解决挑战D
具体实现
在我们的解决方案中,(2)中描述的zkSNARK证明使得∑协议的提取成为可能。
这是可能的,因为这个证据保证了在两次执行中:
k
=
r
+
s
u
⋅
h
k
′
=
r
+
s
u
⋅
h
′
这样的话
a
c
c
h
−
h
′
=
W
s
u
(
h
−
h
′
)
可以得到
a
c
c
=
W
s
u
这样误差项被消除
k = r + su·h \\k' = r + su·h' \\这样的话acc^{h-h'} = W^{su(h-h')} \\可以得到acc = W^{su} \\这样误差项被消除
k=r+su⋅hk′=r+su⋅h′这样的话acch−h′=Wsu(h−h′)可以得到acc=Wsu这样误差项被消除
以上讨论是将RSA累加器当做黑盒处理,下面是整个技术的流程图:
(我们将在整个工作中使用的累加器和承诺方案)