论文笔记: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,...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 mu_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 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)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太高。

一个通常的直觉性的做法是:

以上是关于论文笔记:Succinct Zero-Knowledge Batch Proofs for Set Accumulators的主要内容,如果未能解决你的问题,请参考以下文章

论文阅读笔记

论文笔记-Deep Learning on Graphs: A Survey(上)

ILSVRC历届冠军论文笔记

Focal Loss 论文笔记

论文笔记之GPT-GNN: Generative Pre-Training of Graph Neural Networks

论文笔记目录