ZKP proof聚合技术

1. 引言

SNARKs (succinct, non-interactive arguments of knowledge) 和 STARKs (scalable, transparent arguments of knowledge),因其在去中心化私有计算和区块链扩容等领域的应用,而备受关注。

  • 支持一方(Prover),向另一方(Verifier),证明某计算的正确性
  • Verifier验证proof,要比重新执行该计算,快得多。
  • proof size,要比证明该计算所需的信息量,小得多。

如:

  • 可在不提供整个Sudoku游戏结果的情况下,证明知道该游戏的解。
  • 为证明某虚拟机执行的正确性,Verifier无需知道该虚拟机在每个cycle的寄存器值,仅需query寄存器在某些时刻的值即可。

更多关于SNARKs/STARKs影响力的讨论,可参看:

证明大型程序或计算是非常昂贵的,因为运行其本身会引入开销。在某些情况下,可将大型计算切分为多个更小的计算,如,”证明某区块内的交易,可转为,分别证明每笔交易“,但这样有2个缺陷:

  • 1)proof size 会随切分的计算份数线性增加
  • 2)verification time 会随切分的计算份数线性增加

这2个缺陷会影响可扩展性,因需要更多的时间来验证整个计算,且会增加所需内存。
可将所有proof打包,然后仅做一次验证。具体有多种可用技术:

  • 最佳技术取决于所用的proof system类型,以及实际需求。

本文重点讨论几种可用技术,及其在prover time、verification time和proof size方面的权衡。

2. proof聚合技术

proof聚合技术支持同时证明多个statements,降低,因引入多个statements check,所导致的proof size和verification time的扩大。
具体proof聚合技术,可参看:

其中涉及的技术点有:

  • 1)Proof recursion
  • 2)Cycles of curves
  • 3)Folding and accumulation schemes
  • 4)SNARKPack
  • 5)Continuations

2.1 Proof recursion

SNARKs/STARKs支持以时间和内存高效的方式来检查任意NP statement的有效性。验证某statement所需的信息量,要远小于,检查该statement所需的witness size。如

  • 在STARKs中,Verifier无需知道program的整个execution trace,仅需要做随机query。
  • 在Plonk中,Verifier知道trace polynomials在随机点的evaluations,要远小于该trace内的 3 n 3n 3n个值。

递归的工作原理为:

  • Prover,证明,其验证了,具有public input u u u的某计算的proof π \pi π
    在这里插入图片描述

其中:

  • 1)Prover:根据public input、witness、待证明program,来生成proof π \pi π,以证明该计算的有效性。
  • 2)Prover:将proof π \pi π和原始program电路作为witness,再根据public input、proof π \pi π的验证电路(即Verifier检查该statement所需做的操作),来获得新的proof π ′ \pi' π——证明该Prover知道,该proof π \pi π满足指定input下的验证电路。
  • 3)Verifier:检查proof π ′ \pi' π π ′ \pi' π可展示:
    • 3.1)Prover所做的验证是有效的,从而意味着第一次计算的正确性。

对于STARKs场景,若验证操作的trace,短于,原始program的trace,则proof size和verification time都会减少——因为二者都取决于trace length n n n

实际也可以使用2种不同的Prover。如:

  • 1)证明第一个program使用STARKs Prover,其证明速度快,但proof size大。
  • 2)第二个使用Groth16/Plonk Prover,其具有更小的proof size。
    • 因为第二种情况下,无需处理任意计算,因此可为针对STARK proof verification的优化电路。
    • 最终,具有可快速验证的small proof。

也可使用相同的结构,并证明多个proof的验证:
在这里插入图片描述
但这样存在的问题在于:

  • 尽管proof size会减小,但public input会线性增加。

可通过,将所有public input的hash/commitment作为witness的一部分,来解决该问题。在验证时:

  • 需检查witness中public input的哈希值,对应于public input的hash/commitment。

借助proof recursion,可构建树结构,以增加并行度,来更高效的处理:
在这里插入图片描述
proof recursion已被用于多个项目中来降低proof size并让验证更便宜,如:

即便proof recursion有很多优势,但其给Prover增加了负担。
在类似STARKs的证明系统中,Prover需要计算大量非常昂贵的运算——哈希运算。幸好:

对于基于椭圆曲线的SNARKs中,其proof包含椭圆曲线内的元素——其坐标是基于域 F p \mathbb{F}_p Fp的,scalar以 F r \mathbb{F}_r Fr表示。SNARKs中做递归证明的问题在于:

  • 为计算基于曲线的运算,不得不做基于 F p \mathbb{F}_p Fp的运算。
  • 电路中的scalars位于 F r \mathbb{F}_r Fr,从而导致non-native域运算。如:

2.2 Cycles of curves

由上可知,椭圆曲线 E E E的坐标位于 F p \mathbb{F}_p Fp域,而scalar域为 F r \mathbb{F}_r Fr,在做递归证明时,会存在non-native域运算问题。

若能找到基于 F r \mathbb{F}_r Fr域的曲线 E ′ E' E,且其scalar域为 F p \mathbb{F}_p Fp,则可使用 E ′ E' E来检查基于 E E E的proofs。

具有这些特征的曲线对称为cycle of curves。

幸运的是,某些形如 y 2 = x 3 + b y^2=x^3+b y2=x3+b的曲线可满足该条件。

  • Pallas和Vesta曲线(又名Pasta曲线对)构成了该cycle,已用于Mina的PicklesHalo2中。

其中,在LambdaClass团队2024年2月5日博客Mina to Ethereum ZK bridge中,有详细介绍Mina的Pickles证明系统。
Pickles使用2个accumulators,每个曲线对应一个accumulator,并将某些检查推迟到下一个step。这样,可避免昂贵的雁阵个,并高效传递递归可验证计算。
在这里插入图片描述

2.3 Folding and accumulation schemes

full recursion的缺陷之一在于:

  • 需证明整个验证,那非常昂贵。

如在递归STARKs中,必须计算所有哈希并验证所有代数运算来获取新的proof。

Folding schemes提供了一种完全验证的替代方案,其将多个实例结合并累加。

  • Nova 介绍了一种针对R1CS的folding scheme方案。其核心思想为,若有针对R1CS的2个解 ( u 1 , w 1 ) (u_1,w_1) (u1,w1) ( u 2 , w 2 ) (u_2,w_2) (u2,w2),将二者结合为针对某committed relaxed-R1CS的单个claim ( u , w ) (u,w) (u,w)。所谓relaxed-R1CS,是指更通用的R1CS。然后为该unified claim生成proof,相当于证明所有实例的有效性。
    在这里插入图片描述

2.4 SNARKPack

某些证明系统的proofs可通过其它方式来聚合,如针对Groth16的SNARKPack

Groth16 proof中包含3个元素:

  • Π = ( π 1 , π 2 , π 3 ) \Pi=(\pi_1,\pi_2,\pi_3) Π=(π1,π2,π3),其中 π 1 , π 3 \pi_1,\pi_3 π1,π3属于曲线的group G 1 G_1 G1 π 2 \pi_2 π2属于group G 2 G_2 G2

Groth16 proof验证会检查如下pairing等式:

  • e ( π 1 , π 2 ) = Y e ( π 3 , D ) e(\pi_1,\pi_2)=Y e(\pi_3,D) e(π1,π2)=Ye(π3,D)

其中:

  • Y Y Y:取决于public input和Groth16 trusted setup中的参数。
  • D D D:为Groth16 trusted setup中的部分参数。

若有多个Groth16 proofs Π k = ( π 1 k , π 2 k , π 3 k ) \Pi_k=(\pi_{1k},\pi_{2k},\pi_{3k}) Πk=(π1k,π2k,π3k),对于这些不同的checks e ( π 1 k , π 2 k ) = Y k e ( π 3 k , D ) e(\pi_{1k},\pi_{2k})=Y_k e(\pi_{3k},D) e(π1k,π2k)=Yke(π3k,D),可使用随机值 r k r_k rk来组合为:

  • ∏ e ( π 1 k , π 2 k ) r k = ∏ Y k r k e ( π 3 k , D ) r k \prod e(\pi_{1k},\pi_{2k})^{r_k}=\prod Y_k^{r_k} e(\pi_{3k},D)^{r_k} e(π1k,π2k)rk=Ykrke(π3k,D)rk

可将其重写为:

  • Z A B = Y ′ e ( Z C , D ) Z_{AB}=Y'e(Z_C,D) ZAB=Ye(ZC,D)

其中:

  • Z A B = ∏ e ( π 1 k , π 2 k ) r k Z_{AB}=\prod e(\pi_{1k},\pi_{2k})^{r_k} ZAB=e(π1k,π2k)rk
  • Y ′ = ∏ Y k r k Y'=\prod Y_k^{r_k} Y=Ykrk
  • Z C = ∏ π 3 k r k Z_C=\prod \pi_{3k}^{r_k} ZC=π3krk

Verifier需检查 Z A B , Z C Z_{AB},Z_C ZAB,ZC与所提供的proofs π k \pi_k πk一致。

  • 可通过一次target inner pairing product,和,一次multiexponentiation inner product来实现。
  • 其优势在于:所组合的proof size,与其实际所聚合的proof个数无关。

2.5 Continuations

Continuations 为一种机制,来将复杂的计算,切分为更小的segments,这些segments可独立计算和证明。从而:

  • 借助并行化,可有更快的证明速度
  • 降低Prover的内存开销
  • 缺点为:除非以rollup形式来实现,否则proof size会blowup。
  • 但可借助独立proofs的优势,使用folding scheme来组合所有claims到同一验证电路,或使用递归证明。
  • 可将所有segments包裹仅单个proof——即最终的proof可为具有constant proof size的SNARK。

3. 总结

过去10年来,看到了新证明系统和技术的发展,以内存和时间高效的方式来证明计算的有效性。

但需要将大型计算切分为独立的、更小的计算,如为证明某区块内交易,可分别证明每笔交易。其缺点在于proof size和verification time的blowup,从而会影响可扩展性,或,增加开销。

幸运的是,有多种技术来聚合证明,因此验证单个proof,即意味着验证了所有其它proofs的有效性。而递归证明可提供高效并行方式来聚合证明,其包含了昂贵的操作——如field emulation和哈希函数。
accumulation或folding schemes则提供了不同于完全验证的另一种方式,将某些checks推迟,直到验证的最后一步。

在这里插入图片描述
上图摘自:LambdaClass团队2024年5月3日博客 Aligned Layer: First Aligned Testnet in EigenLayer

参考资料

[1] LambdaClass团队2024年3月25日博客 Proof aggregation techniques
[2] LambdaClass团队2024年5月3日博客 Aligned Layer: First Aligned Testnet in EigenLayer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值