1. 引言
Recursive SNARKs又名Incrementally Verifiable Computation(IVC)、Proof Carrying Data(PCD)或 inductive SNARKs。
上图摘自 zkStudyClub: Halo Infinite with Ben Fisch (Stanford)。
下图摘自 微软团队2021年论文 《Nova: Recursive Zero-Knowledge Arguments from Folding Schemes》,其中:
- [BCTV14]:为Ben-Sasson等人2014年论文《Scalable zero knowledge via cycles of elliptic curves》
- [Gro16]:为Groth 2016年论文《On the size of pairing-based non-interactive arguments》。可参看博客:
- [Set20]:为微软团队Setty 2019年论文《Spartan: Efficient and general-purpose zkSNARKs without trusted setup》。可参看博客:
- [COS20]:Chiesa等人2019年论文 《Fractal: Postquantum and transparent recursive proofs from holography》
- [BGH19]:Bowe等人2019年论文《Halo: Recursive proof composition without a trusted setup》。可参看博客:
- [BCL+20]:B¨unz等人2020年论文《Proof-carrying data without succinct arguments》。可参看博客:
Mina团队在其 pickles库 中实现了inductive proof systems。
2. 何为Recursive SNARKs?
2.1 何为SNARK?
2.2 何为SNARK of a SNARK proof?
2.3 何为SNARK of multiple SNARK proofs?
注意,
C
′
C'
C′仅依赖
V
V
V和
S
V
S_V
SV(而不是
C
1
,
C
2
C_1,C_2
C1,C2)。
可将
V
V
V以circuit表示为:【
w
′
=
π
′
w'=\pi'
w′=π′,独立于
w
1
,
w
2
w_1,w_2
w1,w2。且有
∣
C
′
∣
=
2
∗
∣
V
∣
<
∣
2
∗
C
∣
|C'|=2*|V|<|2*C|
∣C′∣=2∗∣V∣<∣2∗C∣】
C
′
C'
C′有多大呢?以
C
C
C为SHA256 circuit为例,其具有2万个gate。
当以
C
′
C'
C′来表示SNARK of SHA256 SNARKs时:
- [BCTV14]:为Ben-Sasson等人2014年论文《Scalable zero knowledge via cycles of elliptic curves》。该方案需要trusted setup,为第一个SNARK of SNARK方案,需要约100万个gate。
- [Halo,BCLMS20,Nova]:这些方案均不需要trusted setup,当用于证明SNARK of SNARKs时其需要约少于5万个gate。该值与其内部的SNARK circuits无关。
3. Recursive SNARKs应用场景
Recursive SNARKs可用于如下场景:
- 1)Zk-zk-Rollup 和 zk 3 ^3 3-Rollup
- 2)隐私计算ZEXE
- 3)长计算验证
- 4)PhotoProof:验证照片的真实性,即使照片已被多人多次编辑(并附有编辑人日志)。
- 5)恒定大小区块链
- 6)隐私、可验证选举
- 7)隐私、可扩展DEX
- 8)可审计机器学习
- 9)隐私、可验证的社会财富基金
- 10)一个web app:可向其用户证明其已删除了1年前的所有信息(或至少不会再使用这些一年前的信息)。
3.1 用于Zk-zk-Rollup 和 zk 3 ^3 3-Rollup
相比于zkRollup,Zk-zk-Rollup具有如下特征:
- 1)具有多个server,每个server负责不同的无重叠的用户组。
- 2)具有Rollup aggregator(可为server中的一个),负责汇总(balance table)并创建一个相应的proof。
相应的Zk-zk-Rollup circuit表示为:【其中的
r
o
o
t
1
,
r
o
o
t
2
,
⋯
,
π
1
,
π
2
,
⋯
root_1,root_2,\cdots, \pi_1,\pi_2,\cdots
root1,root2,⋯,π1,π2,⋯ 均为witness】
以Tornado Cash为例:
经zk
3
^3
3-Rollup,Tornado Cash可实现shielded transfer以及任意金额。【为每笔交易添加zk-SNARKs实现了隐私交易。】
其中:
- 1)隐私交易需要零知识证明,为每笔交易添加zk-SNARKs。
- 2)一级coordinators通过验证交易的zk-SNARKs来验证交易。
- 3)此外,可有更复杂的交易(如智能合约)。交易的验证应为constant time,与proof complexity无关。
是否可实现智能合约的隐藏呢?——可借助隐私计算ZEXE实现。
3.2 用于隐私计算ZEXE
ZEXE为一种计算模型(类似于UTXO链的Scripts和EVM链的Accounts)。因此可将ZEXE看成是 智能合约 或 复杂交易 的抽象。
ZEXE的基本单位为record(类似于UTXO)。
每笔交易会消耗records,也会创建records。
以UTXO为例,相应的ZEXE表述为:
- Universal predicate(通用表述)为:防止双花。
- Birth predicate(出生表述)为:某record是如何创建的。
- Death predicate(死亡表述)为:某record是如何消耗掉的。
基于Record 1和Record 2 生成Record 3的交易流程可表示为:
通用表述(类似Tornado Cash):
- 1)使用nullifiers。
- 2)检查 nullifier=H(sk, records) 正确创建。
- 3)检查该nullifier仅出现了一次。
- 4)可防止双花。
3.2.1 基于ZEXE实现assets
基于ZEXE实现assets时,Record payload中包含了:
- value v v v
- asset id
相应Birth predicate中:
- 定义了该token
- 新的record id需要与consumed predicate ids匹配
- 新的record value为sum of inputs
相应Death predicate中:
- 定义了SCRIPT
- 如可通过 签名 花费
- 如可通过 多重签名+hash preimage 花费
3.2.2 基于ZEXE实现智能合约
基于ZEXE实现智能合约时,Record payload中包含了:
- smart contract state
- smart contract instance id
相应Birth predicate中:
- 要么创建智能合约
- 要么输入之一为the old smart contract record
相应Death predicate中:
- 定义了智能合约的逻辑。
如以智能合约实现国际象棋游戏为例:
- Record palyload中包含了:
- smart contract state
- smart contract instance id
- 相应Birth predicate中:
- 要么开始新的一局游戏(给pks分配黑/白)
- 要么输入之一为the old chess game
- 相应Death predicate中:
- 若游戏结束,则给赢家钱。
- 否则,输入record必须为game record + one move record。
- move record必须由正确的玩家提供,move record中必须包含a valid move。
3.2.3 使ZEXE具有隐私性
即为ZEXE实现zero-knowledge:
3.3 用于长计算验证
将该长计算以circuit
C
C
C表示有:
- S ( C ) → ( S P , S V ) S(C)\rightarrow(S_P,S_V) S(C)→(SP,SV)
- x = ( i n p u t , o u t p u t ) x=(input, output) x=(input,output):公开信息
- w = t r a n s c r i p t w=transcript w=transcript:私有信息,witness。
将SNARK用于长计算验证存在的问题主要有:
- 1) P P P Prover生成proof用时很长。
- 2)需要在长计算完成之后才开始证明。
- 3)中途不能放弃计算。【可将长计算切分为多个短计算】
- 4) S S S的运行时长至少与 ∣ C ∣ |C| ∣C∣呈线性关系。(若会用于很多proofs,则可接受。)
3.3.1 将长计算切分为短计算
以
C
I
C_I
CI来表示中间计算,将长计算切分为多个短计算:
为此,需要由updatable/incremental proofs,将长计算切分为
t
t
t个短计算,可表示为:
3.4 用于PhotoProof
所谓PhotoProof是指支持对signing camera拍的照片进行有效更新,并提供proof(proof支持incremental updatable),使得Viewer仍可对有效更新后的照片验证其真实性。
详细可参看Naveh等人2016年论文《PhotoProof: Cryptographic Image Authentication
for Any Set of Permissible Transformations》。
3.5 用于恒定大小区块链
基本背景为:
- Rollup可降低验证开销,但该开销仍然与更新的状态数呈线性关系。
- 当有新节点加入到网络时,需要验证one rollup proof per block!
- 通常启动全节点需要验证所有的区块,用时需要数天!
3.6 用于隐私、可验证选举
所谓隐私、可验证选举,是指:
- 每张选票都不关联身份信息。
- 完全的隐私选举是只能知道最终的赢家,此处关注的为部分隐私选举,可知道中间和最终的投票数。这有点类似于美国的政府选举,可知道每个地区、州等的投票总数。
- 最终的proof仅为几十kB,可在浏览器或手机等几乎任意设备上验证。
- 假设选举选项仅有0和1。
在该选举系统中,有2个角色:
- 1)投票人:投票人就“我具有投票权,我投选项 c c c,我的票根为 s s s”创建零知识证明。该ZKP的输入有 ( c , s ) (c,s) (c,s)。“票根”将是注册选民独有的数据,不能与该选民的身份联系起来,其他任何人都不知道。可以将其视为“我投了票”信息上带有投票人密钥的一种独特签名。我们将用这个来确保没有人投票超过一次。
- 2)聚合器:聚合器会收集选票,并就“我知道对应一组票根 S S S的选票数为 ( n 0 , n 1 ) (n_0,n_1) (n0,n1)”。该ZKP的输入有 ( ( n 0 , n 1 ) , S ) ((n_0,n_1), S) ((n0,n1),S)创建零知识证明。
以数学方式来表达选票 Vote \text{Vote} Vote,应具有如下属性:
- 存在投票私钥 sk \text{sk} sk,使得 pk=privKeyToPubKey(sk), isEligible(pk)=true, s=ballotStub(sk) \text{pk=privKeyToPubKey(sk), isEligible(pk)=true, s=ballotStub(sk)} pk=privKeyToPubKey(sk), isEligible(pk)=true, s=ballotStub(sk),同时存在签名 sig \text{sig} sig,使得 sigVerify(sig, pk, c)=true \text{sigVerify(sig, pk, c)=true} sigVerify(sig, pk, c)=true,有 ( c , s ) ∈ Vote (c,s)\in \text{Vote} (c,s)∈Vote。
isEligible
\text{isEligible}
isEligible算法可验证某公钥的合法性。
即“若上图上半部分的均正确,则下半部分也为true”,反过来说是“若要证明
(
c
,
s
)
∈
Vote
(c,s)\in\text{Vote}
(c,s)∈Vote,则需要提供上半部分的所有”。
以数学方式来表达聚合投票数
VoteCount
\text{VoteCount}
VoteCount
(
(
n
0
,
n
1
)
,
S
)
((n_0,n_1), S)
((n0,n1),S)应具有如下属性:
举例:
以上,描述
Vote
\text{Vote}
Vote需要一条rule,描述
VoteCount
\text{VoteCount}
VoteCount需要2条rule。需要Prover为这些rule制定prove算法:
- voters需生成voting-proof
- aggregators可将多个voting-proof合并一个proof来证明相应投票数的正确性。
可借助递归证明系统来实现以上prove算法。
参考文献
[1] 微软团队2021年论文 Nova: Recursive Zero-Knowledge Arguments from Folding Schemes
[2] 2021年7月视频 An Overview of Recursive SNARKs
[3] 2021年斯坦福课件 Recursive SNARKs
[4] 2020年Mina在zkproof的博客Inductive Proof Systems and Recursive SNARKs