STARK proof system (Scalable Transparent Argument of Knowledge)是用于证明计算完整性(CI,computational integrity)的强大工具:
本文深入探索由STARK proofs所提供的安全性,对该安全性进行定义,并探索证明方案安全性的技术。
详情见:
我们试图通过安全分析实现什么?:
由于false statement是危险的,可能具有任意大小和形状,而所构建的STARK系统是希望能抵御 所有 false statement的。
任何false statement,哪怕是1+1=3
,若可基于该false statement生成让STARK Verifier信服的STARK proof,则可认为是对该STARK系统的成功攻击。(有密码学背景的人可能会对,STARK所满足的更强安全概念——“knowledge soundness”,感兴趣。为简化表述,本文关注更简单的soundness。“knowledge soundness”知识具体可参见Eli Ben-Sasson等人2016年论文 Interactive Oracle Proofs。)
如何来正式定义某STARK系统的安全性呢?:
为此,可将STARK安全性定义为函数 ( t ) (t) (t):
如,对于“本方案具有96位安全性”这样的陈述,如何将其转换为安全性定义?
答案是不唯一的,因为人们对“ x x x-位安全性”的理解有细微差异:
本文基于上面的版本2来分析。
如何来证明某方案具有96位安全性呢?
需先理解如何构建STARKs的高层结构。
STARK主要有3大要素:
一旦定义了这3大要素,就可将其编译生成某STARK
本文主要关注IOP。同时将详细说明这3大要素,以及如何将它们组合在一起。
IOP类似于表中的interactive proof,其中某Prover和Verifier多轮交互。(本文限定为public-coin协议,即Verifier仅需给Prover发送random challenges)。
在IOP中,Verifier不读取完整的Prover消息,而是仅从每个Prover消息中采样少量bits。从而可实现后续编译出的STARK的简洁性。
有IOP之后,如何基于该IOP构建某STARK呢?
对于交互式STARK,为简化流程,通常会将其转换为非交互式的,这样在构建时Prover就无需再等待外部消息。事实上,当前所部署的所有STARK系统,包括ethSTARK协议,都是非交互式STARK。
非交互式STARK也是transparent SNARKs的一个特例(所谓transparent,是指在实例化时无需trusted setup,又名“Arthur Merlin protocol”或“public coin IOP”)。最终,最后一步是应用Fiat-Shamir来将rounds压缩为单个消息,称其为STARK proof。
Fiat-Shamir转换会将交互式协议转换为非交互式协议:
然而cheating Prover有一些新的(交互式IOP所没有的)策略手段。cheating Prover可通过修改最后一条Prover消息(这将给出新的transcript,从而给出新的挑战值),来重新生成Verifier挑战值。由此可知,IOP的标准可靠性概念不足以证明Fiat-Shamir转换的安全性。
如,考虑一个有96轮的IOP,对Verifier进行如下“hack”:
一旦对Verifier添加了该hack,其仅给IOP的soundness error加了一项 2 96 2^{96} 296。但是,经Fiat-Shamir转换之后,攻击者很容易通过修改Prover消息,来确保每个哈希结果以0开头,从而在很短时间内破解该系统。
不过请放心,这仅仅是个理论示例,而不适用于已部署的STARK。
为何StarkWare的STARK是安全的呢?
简而言之,将展示最多允许 n n n步的攻击者,其攻击成功的概率最多为 ( t ) t 2 96 (t)t 2^{96} (t)t296。
STARK仅可与其底层的IOP一样安全。但是,某IOP具有96位安全性,意味着什么?
标准定义应是:该IOP的soundness error为 2 96 2^{96} 296,即意味着,任何攻击者(不考虑运行时长)愚弄Verifier的概率最多为 2 − 96 2^{-96} 2−96。
但是,正如之前所讨论,STARK由3大要素组成,IOP soundness只是三者之一,其并不足以让由三大要素所编译的STARK也具有96位安全性。
事实上,所编译的STARK的安全性证明,是假定该STARK具有96位 round-by-round soundness error(有时,也称为state-restoration soundness)。
直观来说,round-by-round soundness error是指:
更具体来说,round-by-round是指:
很多情况下,仅分析了某IOP的soundness,而未分析其round-by-round soundness。
需承认的是,很难想到一个例子——某IOP具有标准可靠性,但不是round-by-round soundness(人为例子除外)。
但是IOP soundness与round-by-round soundness 是有差别的:
round-by-round soundness 可给出所需的保证:
最后,需确保Prover无法对Merkle tree进行攻击。只需要构建Merkle tree所使用的哈希函数不存在碰撞即可。
攻击者对某随机函数调用 t t t次,尝试找到某碰撞的概率,最多为 t 2 / 2 t2/2 t2/2。其中 t 2 t2 t2为该哈希函数的输出长度(基于“生日悖论”)。这也是为何需设置哈希函数的输出长度,应为所需安全性的2倍。
若有某哈希函数的输出长度为192,且某IOP的round-by-round soundness为96位,则所编译的STARK的soundness error为 ( t ) = t 2 96 + t 2 ⋅ 2 196 (t)=t2^{96}+t2\cdot 2^{196} (t)=t296+t2⋅2196。最终该STARK方案的安全性为95位,因 t / ( t ) = t / ( t 2 96 + t 2 ⋅ 2 196 ) = 1 / 2 96 + 1 / 2 96 = 2 − 95 t/(t)=t/(t2^{96}+t2\cdot 2^{196})=1/2^{96}+1/2^{96}=2^{-95} t/(t)=t/(t296+t2⋅2196)=1/296+1/296=2−95。
STARK proof system (Scalable Transparent Argument of Knowledge)是用于证明计算完整性(CI,computational integrity)的强大工具:
STARKs的安全性通常以“soundness error”来衡量,其代表了攻击者成功为某false statement提供让Verifier信服的proof 的概率。
为实现所需的安全性,如96位,底层的IOP必须满足round-by-round soundness,以确保每轮都维护高级别安全性。
StarkWare团队分析了ethSTARK底层的round-by-round soundness,从而可派生出具体的安全上限。
[1] StarkWare团队2023年10月博客 Safe and Sound — A Deep Dive into STARK Security