论文笔记: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的设计问题:

  • 如何获得隐私
  • 如何提高吞吐量

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,...umS

在零知识学术文献中,这种证明通常被称为成员证明。有几种方法可以生成这样的证明。如果集合不是太大,可以使用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,...umS

首先应用RSA累加器将集合压缩成一个简洁的摘要
a c c = g x 1 ⋅ x 2 ⋅ . . . ⋅ x n acc = g^{x_1·x_2·...·x_n} acc=gx1x2...xn
此时要证明
t o   P r o v e   u 1 , . . . u m ∈ S 只需要提供一个单独的组元素就足够了 to \ Prove \ u_1,...u_m \in S \\只需要提供一个单独的组元素就足够了 to Prove u1,...umS只需要提供一个单独的组元素就足够了

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]ujx中排出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 RWr
随机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 hH(acc∣∣g∣∣W∣∣R)(acc,g,W,R生成hash摘要)kr+hΠimui
验证者收到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)Racch=Wk这里自行推导如下:Racch=Wk=Wr+hΠimui=WrWhΠimui=RWΠimuih=Racch
这样的话就可以在不泄露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)acchh=Wkk这样的话真实值acc=Whhkk但是(hh)1在未知阶数的组中不能有效地计算指数所以只能有h0,1,这样的话hh=1,误差固定为1

求解挑战A

关键贡献是使用SNARK有效地证明该∑-协议的验证的有效技术。值得注意的是,我们不需要在SNARK约束系统7中编码任何RSA组操作。

为RSA累加器见证引入了一种新的随机化方法:
W ∣ → W ^ W {|→} \hat{W} WW^
我们的隐藏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λ]pi1bi(注意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即对所有人的承诺uis通过使用zkSNARK证明k来自承诺的合法uis
也就是说,它证明:
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(对所有人的承诺uis)and cr,s ,(s=Πi[2λ]pibi)and r ,基于等式k=r+hsΠi[m]ui保留的整数and uip2λ for each i [m]
我们约定:
p 2 λ = a r g m a x ( p i ′ s ) p_{2\lambda} = argmax(p_i's) p2λ=argmax(pis)
所以
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+hsΠ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+suhk=r+suh这样的话acchh=Wsu(hh)可以得到acc=Wsu这样误差项被消除
以上讨论是将RSA累加器当做黑盒处理,下面是整个技术的流程图:
流程
(我们将在整个工作中使用的累加器和承诺方案)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值