论文笔记:Succinct Zero-Knowledge Batch Proofs for Set Accumulators
Posted 计划是动力
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了论文笔记:Succinct Zero-Knowledge Batch Proofs for Set Accumulators相关的知识,希望对你有一定的参考价值。
论文笔记: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 mu_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 mu_i = W^r ·W^h·\\Pi_i\\in mu_i \\\\=R·W^\\Pi_i\\in mu_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太高。
一个通常的直觉性的做法是: 以上是关于论文笔记:Succinct Zero-Knowledge Batch Proofs for Set Accumulators的主要内容,如果未能解决你的问题,请参考以下文章 论文笔记-Deep Learning on Graphs: A Survey(上) 论文笔记之GPT-GNN: Generative Pre-Training of Graph Neural Networks