RISC Zero提供了开源的虚拟机+零知识证明系统,即zero-knowledge virtual machine(简称zkVM)。当在zkVM中执行某RISC-V二进制文件时,其输出为:
RISC Zero的证明系统采用zk-STARK,基于以下关键要素:
可验证计算的时代即将到来:我们现在生活在这样一个世界里,分布式系统中不受信任方的行为 可 使用计算完整性的证明 快速轻松地被验证为值得信任的。这项技术是零知识密码学和交互式证明领域几十年来不断进步的结果。数年来,在现实世界的应用程序中实现 可验证计算 已经变得实用和有影响力。最初的应用表明,零知识证明是确保区块链隐私的有力工具,该技术已经发展到了计算完整性的证明,并成为数字世界的关键基础设施的地步。我们预计,可验证计算不仅是区块链扩容问题的答案,也是解决推特机器人和垃圾电话等问题的答案。在一个信任越来越稀缺的世界里,可验证计算提供了一条前进的道路。
成千上万的开发人员渴望开始编写可验证的软件。但目前用于编写可验证软件的系统要求开发人员学习具有各种限制和挑战的全新语言。为了使Rust和C++等语言的可验证软件开发成为可能,RISC Zero建立了一种机制来证明任意RISC-V计算的完整性。
当在RISC Zero zkVM中执行某RISC-V二进制文件时,输出结果的同时还会输出一个computational receipt。该receipt中包含了:
通过对可编译为RISC-V的任意代码提供密码学seal,RISC Zero zkVM提供了一个构建真正可信任软件的平台,将信将疑的第三方可在数毫秒内验证其代码执行结果的真实性。
“running a verifier” 以确保大规模计算的完整性的想法是数字安全世界的一个新颖补充。
实际RISC Zero的receipt由3大部分组成:
形式化验证是将代码转换为模型的过程,该模型可以通过数学工具进行推理,以确保与安全性和正确性相关的属性。形式化验证用于确保一段代码确实在做它应该做的事情。为了确保RISC Zero verifier(检查receipts)在没有安全漏洞的情况下运行,RISC Zero团队正在对其verifier实现进行形式化验证。具体见:
RISC Zero zkVM:
RISC Zero receipt背后的证明系统是基于execution trace和一些约束来强化计算完整性checks的。
核心思想为:
当一段代码在机器上运行时,execution trace(或简称trace),记录了该计算在每个clock cycle(时钟周期)的机器完整状态。通常将execution trace写成长方形数组,每一行对应机器在某特定时刻的完整状态,每一列展示了该计算的某些特定方面(如存储在特定RISC-V寄存器中的值)在每个时钟周期的当时记录。
RISC Zero的execution trace列主要分为:
对计算完整性的断言,可重塑为,对“某execution trace满足特定约束集”的断言。这些约束强化了:
示例一:约束 ( k ) ( k − 1 ) = 0 (k)(k-1)=0 (k)(k−1)=0强化了 k k k要么为0,要么为1。
示例二:约束 j − 2 k = 0 j-2k=0 j−2k=0强化了 j = 2 k j=2k j=2k。
在实际实现时,为强化RISC-V指令集架构的计算完整性,包含了数千约束,每个约束都表示为某多变量多项式(其输入可能包含多个(之前)时钟周期的寄存器值)。
从上层来看,约束强制要求zkVM操作的以下每个阶段都按要求执行:
这些约束加在一起,强制要求计算声称的输出与预期的rv32im(The RISC-V Instruction Set Manual Volume I: Unprivileged ISA)执行一致。
RISC Zero receipt中的seal为a STARK——a scalable, transparent argument of knowledge。
An argument of knowledge支持Prover证明某“assertion of knowledge”的正确性。更正式的说话是,Prover断言其知道某witness w \mathbf{w} w满足某些约束 x \mathbf{x} x。当用于对计算完整性的断言时,execution trace为witness,约束为各种定义计算完整性的规则。
在3.3节,将展示Interactive Oracle Proof(IOP)协议((BCS16)Interactive Oracle Proofs)。IOPs中包含了Prover与Verifier之间的一系列交互,整个协议中Prover的消息依赖于Verifier在各个节点提供的随机值。IOP协议为理论模型,事实上,zkVM使用非交互版本的IOP协议,其中Verifier的参与通过Fiat-Shamir transform替换为了HMAC-SHA-256。
在IOP协议上下文中,seal组成了a proof of knowledge。在代码中,proof变成了argument——原因在于,argument依赖于HMAC-SHA-256作为random oracle的安全性,而proof无密码学安全假设。更准确来说,seal是a STARK。Fiat-Shamir Heuristic使得可基于IOP协议的soundness分析来派生出STARK的安全性。
本章将展示交互版本的RISC Zero写意思,并在IOP模型上下文中分析该协议的knowledge soundness。
在交互式oracle proof中,Prover 通过一系列交互使 将信将疑的Verifier 信服 某断言。在每一轮,Prover基于双方已知的某domain 对一个或多个函数的evaluations进行commit。Verifier可能不会读取完整的Prover messages,而是query这些Prover messages。IOP模型使用oracle access的概念将这些query理想化。该理论模型,可在不指向任何密码学原语的情况下,证明本协议的soundness。
RISC Zero receipt中的seal,为交互式协议中的transcript,并以某random oracle作为verifier。当zkVM完成某方法的执行之后,相应的结果seal就用作计算完整性的zero-knowledge proof,将某密码学imageID(用于表示所执行的RISC-V二进制文件) 关联到 所断言的代码输出,这样使得第三方可快速验证。
本协议包含了:
每个程序仅需要做一次Set-up阶段,生成的公共参数可用于生成任意数量的execution proofs。这些公共参数包括:
这些参数要么通过可信通道分发给Provers和Verifiers,要么可根据程序定义(如,源代码)独立计算。
“transparency透明”属性,是指:
set-up完毕之后,Prover运行程序,生成控制列和数据列,然后开始随机化预处理。
随机化预处理,会构建memory accumulators和bytes accumulators。
在随机化预处理阶段,Prover会发送2个trace承诺值:
为生成trace承诺值,会使用Reed-Solomon编码将trace列,编码为,trace blocks,然后将trace blocks承诺到Merkle trees。
以 w c o n t r o l \mathbf{w}_{control} wcontrol和 w d a t a \mathbf{w}_{data} wdata来表示witnesses,以 C o m ( w c o n t r o l ) Com(\mathbf{w}_{control}) Com(wcontrol) 和 C o m ( x c o n t r o l ) Com(\mathbf{x}_{control}) Com(xcontrol) 来表示相应的承诺值。在完成对 w c o n t r o l \mathbf{w}_{control} wcontrol和 w d a t a \mathbf{w}_{data} wdata这2个承诺之后,Prover使用verifier-randomness 来构建 accum blocks,并发送第3个承诺值 C o m ( w a c c u m ) Com(\mathbf{w}_{accum}) Com(waccum),以支持permutation argument和lookup argument。【由于reveal了每棵树的许多分支,RISC Zero commit Merkle caps,而不是Merkle roots,详情见附录B 以及 Alessandro Chiesa等人2021年论文 Subquadratic SNARGs in the Random Oracle Model】
Main主阶段中包含了:
Main主阶段的基本流程为:
回想下 (BCS16)Interactive Oracle Proofs 中的interactive oracle proof。在IOP模式下下,本协议满足 Eli Ben-Sasson等人2018年论文 Scalable, transparent, and post-quantum secure computational integrity 的STIK定义。【STIK和STARK之间缩写词的区别在于用“IOP”代替了“ARgument”。】
借鉴StarkWare团队的2023年 (Sat21) ethSTARK文档第5张的AIR定义和符号,以及,Aztec 2021年的From AIRs to RAPs - how PLONK-style arithmetization works的借助预处理对AIR随机化的概念,RISC Zero的IOP证明了Prover知道某witness满足某RAP(Randomized AIR with Preprocessing)实例,具体定义为:
A R A P = ( F , K , e , w R A P , n σ m e m , n σ b y t e s , h , d , s , w , β , I , C s e t ) A_{RAP}=(\mathbb{F},\mathbb{K}, e, \mathbf{w}_{RAP},\mathbf{n}_{\sigma_{mem}},\mathbf{n}_{\sigma_{bytes}},h,d,s,w,\beta,I,C_{set}) ARAP=(F,K,e,wRAP,nσmem,nσbytes,h,d,s,w,β,I,Cset)
其中:
除了以上列出的RAP instance输入之外,IOP还使用如下辅助输入,表示为 aux = ( D , k , aux F R I ) \text{aux}=(D, k,\text{aux}_{FRI}) aux=(D,k,auxFRI),其中:
透明set-up之后,IOP包含了3个元素:
随机化预处理步骤的流程为:
w R A P = w c o n t r o l ∪ w d a t a ∪ w a c c u m \mathbf{w}_{RAP}=\mathbf{w}_{control}\cup \mathbf{w}_{data}\cup \mathbf{w}_{accum} wRAP=wcontrol∪wdata∪waccum为witness,满足如下RAP instance:
A R A P = ( F , K , e , w R A P , n σ m e m , n σ b y t e s , h , d , s , w , β , I , C s e t ) A_{RAP}=(\mathbb{F},\mathbb{K}, e, \mathbf{w}_{RAP},\mathbf{n}_{\sigma_{mem}},\mathbf{n}_{\sigma_{bytes}},h,d,s,w,\beta,I,C_{set}) ARAP=(F,K,e,wRAP,nσmem,nσbytes,h,d,s,w,β,I,Cset)
与 (Sat21) ethSTARK文档、Eli Ben-Sasson等人2019年论文DEEP-FRI: Sampling Outside the Box Improves Soundness、Eli Ben-Sasson等人2017年论文Fast Reed-Solomon Interactive Oracle Proofs of Proximity,类似,本协议剩余部分为:【不同之处在于,与Plonky2和[Hab22] A summary on the FRI low degree test中一样,使用单个verifier随机值来做constraint batching,以及,用单个verifier随机值来做FRI batching。】
DEEP-ALI子协议的流程为:
Receipt验证包含如下逻辑检查。若这些检查失败,则Verifier拒绝该receipt:
本文使用 Eli Ben-Sasson等人2019年论文DEEP-FRI: Sampling Outside the Box Improves Soundness 和 Eli Ben-Sasson等人2021年论文 Proximity Gaps for Reed-Solomon Codes 的结论来分析本IOP协议的soundness。使用Fiat-Shamir Heuristic将本IOP分析 转换为 非交互式协议的结论,使用HMAC-SHA-256来实例化random oracle。
本文的soundness分析遵循(Sat21) ethSTARK文档,不同之处在于:
随机化预处理:本协议以ethSTARK中未模拟的随机化预处理为起始步骤。随机化预处理 为PLONK-based permutation check和PLOOKUP-based range check实例化约束。使用Schwartz-Zippel Lemma来限定soundness error上线。
Constraint batching:DEEP-ALI包含了压缩所有约束为当个“Combined Constraint”的步骤。RISC Zero采用[Hab22] A summary on the FRI low degree test中的方案,使用的是单个随机域元素的幂,而ethSTARK中使用的是一组域元素。RISC Zero采用的是 Eli Ben-Sasson等人2021年论文 Proximity Gaps for Reed-Solomon Codes 中的parametric batching技术,而ethSTARK选择的是affine batching技术。
FRI batching:“batched FRI protocol”也是先用verifier随机数来压缩多个FRI instances为单个instance。同样,RISC Zero采用的是parametric batching技术,而ethSTARK采用的是affine batching技术。
对 w v a l i d i t y \mathbf{w}_{validity} wvalidity的degree reduction:ethSTARK 和 Eli Ben-Sasson等人2018年论文 Scalable, transparent, and post-quantum secure computational integrity 的构建会生成a pair of FRI assertions:
与[Hab22] A summary on the FRI low degree test类似,RISC Zero将validity多项式切分为4个low-degree validity多项式,从而可将其压缩为单个FRI assertion。【“split”切分函数与FRI commit rounds中的一样。详情见附录A.2.3。】 w v a l i d i t y \mathbf{w}_{validity} wvalidity的每个leaf包含这4个low-degree validity多项式的evaluation值。[Hab22] A summary on the FRI low degree test中将这样的切分技术称为“segment polynomials”。
总之,RISC Zero IOP协议的soundness上限为:
ϵ I O P ≤ ϵ P L O N K + ϵ L O O K U P + ϵ D E E P A L I + ϵ F R I \epsilon_{IOP}\leq \epsilon_{PLONK}+\epsilon_{LOOKUP}+\epsilon_{DEEP_ALI}+\epsilon_{FRI} ϵIOP≤ϵPLONK+ϵLOOKUP+ϵDEEPALI+ϵFRI
其中: ϵ P L O N K , ϵ L O O K U P , ϵ D E E P A L I , ϵ F R I \epsilon_{PLONK},\epsilon_{LOOKUP},\epsilon_{DEEP_ALI},\epsilon_{FRI} ϵPLONK,ϵLOOKUP,ϵDEEPALI,ϵFRI分别为本协议PLONK argument、PLOOKUP argument、DEEP-ALI子协议、FRI子协议的soundness上限。
用 θ \theta θ来表示FRI low-degree test中的proximity参数,本节分析限定在list-decoding radius为 θ < 1 − ρ \theta<1-\sqrt{\rho} θ<1−ρ,conjectured code capacity为 θ < 1 − ρ \theta<1-\rho θ<1−ρ。这些soundness结论的证明遵循 Eli Ben-Sasson等人2021年论文 Proximity Gaps for Reed-Solomon Codes 中的定理1.5和8.3,以及 Eli Ben-Sasson等人2019年论文DEEP-FRI: Sampling Outside the Box Improves Soundness中的定理6.2。conjectured security遵循 Eli Ben-Sasson等人2021年论文 Proximity Gaps for Reed-Solomon Codes 中的Conjecture 8.4,以及 Eli Ben-Sasson等人2019年论文DEEP-FRI: Sampling Outside the Box Improves Soundness中的Conjecture 2.3。具体定理和Conjecture见附录D。
在后续章节中:
推荐:
随机化预处理阶段为2个grand-product arguments实例化了accumulators和约束。无论哪个,简单应用Schwartz-Zippel Lemma,可生成soundness error上限。
其中:
在RISC Zero的DEEP-ALI实现中,Verifier samples了单个随机值 α c o n s t r a i n t s \alpha_{constraints} αconstraints来合并约束,然后将 z ∈ K ∖ ( H ∪ D ) z\in\mathbb{K}\setminus (H\cup D) z∈K∖(H∪D)用作DEEP query。每个随机samplings都有一个关联的error term。
ϵ D E E P − A L I = ϵ A L I + ϵ D E E P \epsilon_{DEEP-ALI}=\epsilon_{ALI}+\epsilon_{DEEP} ϵDEEP−ALI=ϵALI+ϵDEEP
其中:
不同于ethSTARK,RISC Zero使用单个随机值的幂来合并约束。其实现与[Hab22] A summary on the FRI low degree test 与一致,不同之处在于将 ϵ D E E P \epsilon_{DEEP} ϵDEEP的分子由 d d d改成了 d − 1 d-1 d−1,即,RISC Zero的DEEP-ALI的error上限为:
ϵ = s ⋅ L K \epsilon=\frac{s\cdot L}{\mathbb{K}} ϵ=Ks⋅L
ϵ = L ⋅ ( d − 1 ) ( ( k + 1 ) + ( k − 1 ) ) ∣ K ∣ − ∣ H ∣ − ∣ D ∣ \epsilon=\frac{L\cdot (d-1)((k+1)+(k-1))}{|\mathbb{K}|-|H|-|D|} ϵ=∣K∣−∣H∣−∣D∣L⋅(d−1)((k+1)+(k−1))
本节在list-decoding体制下的FRI soundness结论,主要遵循 Eli Ben-Sasson等人2021年论文 Proximity Gaps for Reed-Solomon Codes 中的定理1.5和8.3。如之前所提及,本节RISC Zero的FRI soundness结论不同于 Eli Ben-Sasson等人2021年论文 Proximity Gaps for Reed-Solomon Codes 和 ethSTARK,因为RISC Zero采用单个随机域元素的幂来做FRI batching。为此,RISC Zero的FRI soundness结论 对标的是 [Hab22] A summary on the FRI low degree test (其中batch size为 w R A P + d + 1 \mathbf{w}_{RAP}+d+1 wRAP+d+1)。
即RISC Zero的FRI soundness error上限为:
ϵ F R I = ( ( w R A P + d − 1 ) − 1 2 ) ⋅ ( m + 1 2 ) 7 3 ρ 3 ⋅ ∣ D ∣ 2 ∣ K ∣ + ( 2 m + 1 ) ⋅ ( ∣ D ∣ + 1 ) ⋅ ∑ i = 1 r t i ρ ⋅ ∣ K ∣ + ( 1 − θ ) n q u e r i e s \epsilon_{FRI}=((\mathbf{w}_{RAP}+d-1)-\frac{1}{2})\cdot \frac{(m+\frac{1}{2})^7}{3\sqrt{\rho}^3}\cdot \frac{|D|^2}{|\mathbb{K}|}+\frac{(2m+1)\cdot (|D|+1)\cdot \sum_{i=1}^{r}t_i}{\sqrt{\rho}\cdot |\mathbb{K}|}+(1-\theta)^{\mathbf{n}_{queries}} ϵFRI=((wRAP+d−1)−21)⋅3ρ3(m+21)7⋅∣K∣∣D∣2+ρ⋅∣K∣(2m+1)⋅(∣D∣+1)⋅∑i=1rti+(1−θ)nqueries
[1] RISC Zero zkVM白皮书-2023.8.11版 RISC Zero zkVM: Scalable, Transparent Arguments of RISC-V Integrity
[2] RISC Zero团队2023年3月在ETHDenver上的分享视频 If Knowledge is Power, What is Zero Knowledge? An Intro to zkVMs with Eric