本文是零知识虚拟机(zkVM)安全系列的第一篇文章,主要介绍了zkVM的基本概念、工作原理及其在可验证计算中的作用。文章还简要介绍了zkEVM及其在区块链中的应用,并概述了该系列后续文章的主题,旨在为零知识领域的研究人员和zkVM开发者提供有用的安全指导。
这是我们探索 zkVM 安全性以及构建在其之上的应用程序的系列文章中的第一篇。
zkVM 安全系列: 📚 第一部分:零知识虚拟机 (zkVM) 简介
📚 第二部分:识别 zkVM 中的常见漏洞
📚 第三部分:编写和审计安全的 zkVM 应用程序:RISC Zero 的一个实际例子
零知识虚拟机 (zkVM) 正在改变开发者处理可验证计算的方式。通过抽象掉大部分底层加密技术,zkVM 使开发者能够用熟悉的编程语言编写可证明的程序。这在具有智能合约功能的区块链中尤其有用。它允许更具可扩展性的应用程序,而无需深入的加密专业知识。
在 Veridise,我们参与了许多与 zkVM 相关的审计工作。我们对整个 zkVM 进行了深入的安全审查,例如,针对 RISC Zero 和 Linea,并且还审计了许多构建在其之上的 zkVM 应用程序。这些经验让我们很好地了解了实践中经常出现的陷阱、设计决策和安全问题。
本文分享了我们通过审计工作获得的一些经验教训,旨在为零知识领域的安全研究人员以及计划使用 zkVM 的开发者提供实用指导。
我们将介绍仍然适用于 zkVM 内部的 ZK 电路陷阱——例如,弱输入验证、重放漏洞和抢跑攻击——以及 zkVM 环境特有的挑战,例如不正确地使用库。我们还包括一个用 RISC Zero 编写的模拟 zkVM 程序的具体示例,以实际说明这些要点。
零知识证明 (ZKP) 是一种加密结构,允许人们证明一个陈述是真实的,而不泄露任何其他信息。这使得一种可验证计算的形式成为可能,这基本上意味着计算的结果可以被验证是正确的,而无需执行计算。
这种范例由双方参与:证明者试图说服验证者他们正确地执行了计算。这实现了两个主要好处:
请注意(1)中使用的词约束。这是 ZKP 实现的核心:保证证明者已满足验证者可以访问并有效检查(而无需检查每个单独的约束)的一组约束。正如在后面的章节中可以看到的,这些约束是零知识电路开发者直接或间接地创建的,以便在数学上确定计算已正确发生。
虚拟机 (VM) 是计算机系统的模拟。就像物理计算机一样,它们包含自己处理一组指令的方法,只是这种虚拟执行是在软件中模拟的,而不是直接在 CPU 上执行。虽然可以模拟整个计算机,但在 zkEVM 的上下文中,更小的指令集被解释为具有更有限的功能。
例如,如果你在 Ethereum 或相关平台上开发智能合约,你可能已经了解到一个正在与之交互的 VM:以太坊虚拟机 (EVM)。本文不会深入探讨 EVM,为此我推荐 Noxx 的这个精彩系列。
但是,EVM 是一个简单的 VM 的一个很好的例子,它用于简单地处理一组指令。它是一个程序(具有符合相同标准的多个不同实现),它公开一个指令集来操作基于堆栈的虚拟机。
让我们看一个例子。
https://www.evm.codes/playground 中 playground 默认示例 OPCodes
在上面的例子中,值 0x42
存储在 0x00
位置的内存中(通过 MSTORE
)。返回数据的大小(32 字节)和数据存储在内存中的位置(0x00
)被推送到堆栈,然后执行 RETURN
操作码。EVM 包含一些唯一的指令(例如 RETURN
),这些指令适用于智能合约环境。在此示例中未看到的是修改单独的存储区域的指令,以太坊中的帐户可以在其中存储任意数据。
实际上,这些指令(PUSH1
、MSTORE
、RETURN
)中的每一个都有一个唯一的字节值,EVM 解释该字节值以确定要执行的指令。上面的例子可以表示为 604260005260206000F3
,其中 0x60
指令转换为 PUSH1
。
这种拥有一个简单的、基于堆栈的虚拟机的范例允许代码的确定性执行,保证所有正确的实现对于给定的字节码和相同的用户输入、启动区块链状态和其他环境数据,都将解析为相同的状态。这对于启用智能合约的区块链的运行是必要的:所有节点必须能够验证一个区块的执行以及由此产生的存储和余额变化是否有效。
EVM 只是确定性 VM 的一个例子。通常,所有单线程执行环境都旨在拥有一个规范,使其能够在指定的域中进行确定性执行。通过定义良好的指令集,字节流可以被解释为由这样的 VM 执行的程序。
现在我们了解了零知识证明和虚拟机,我们可以探索 zkVM 如何结合这两个概念,从而在可验证计算中创建一个新的范例。
通过结合 VM 和 ZK,可以进一步保证确定性虚拟机的安全性。可以在 ZK 证明系统中实现一个 VM,而不是需要重新执行整个 VM,该 VM 可以用于输出一个证明,证明正确的执行发生在 VM 内部,并符合所提供的输入。这些被称为零知识虚拟机 (zkVM)。这些虚拟机的安全性依赖于 VM 实现的正确性和 ZK 证明系统的可靠性。
zkVM 实现是通过将 VM 的每个单独组件编程为一系列约束的繁琐过程来创建的。这些组件的例子是内存读取/写入操作和指令处理。当组合在一起时,VM 的电路(理想情况下)会约束 ZKP 仅生成有效执行的证明。一旦构建了一个通用的 zkVM,开发者就可以提供一个程序及其输入以供执行,zkVM 将生成相应的证明。鉴于 zkVM 是为现有的指令集创建的,这允许用一种通用的编程语言编写一个 ZK 应用程序,并且该语言生态系统中已有的库可以立即用于电路中。
该图表取自 RISC Zero 的博客文章“设计高性能 zkVM”
虽然本文的重点是通用的 zkVM,但值得简要强调一项相关的但更具体的发展:zkEVM。zkEVM 是一种专门设计用于在零知识上下文中模拟以太坊虚拟机 (EVM) 的 zkVM。这种区别很重要——zkEVM 旨在支持以太坊兼容的智能合约和执行模型,而通用的 zkVM 通常不会具有针对以太坊特定操作优化的组件。
在区块链领域,许多不同的组织正在积极追求 zk E VM 的工作。创建 zkEVM 有两个主要目标:
这两个用例都依赖于在 zkEVM 内部执行交易/区块,并将输出的信任卸载到 zkEVM 的“zk”部分。正如上面“什么是零知识证明?”部分中提到的,这带来了巨大的可扩展性优势,甚至可能的隐私优势。如果 L2 的运营商被信任以保持交易的私密性,则 L2 可以引入一些技术,使L2上的用户可以私下进行交易,而 L1 只会了解到已执行的交易是有效的。
虽然 zkEVM 是一种流行的专用用例,但在接下来的文章中,我们将重点介绍通用的 zkVM。
这就是我们 zkVM 安全系列的第一部分。请继续关注第二部分,我们将在其中介绍 zkVM 中最常见的陷阱和漏洞。
作者: Tyler Diamond,Veridise 安全分析师
zkVM 安全系列: 📚 第一部分:零知识虚拟机 (zkVM) 简介
📚 第二部分:识别 zkVM 中的常见漏洞(两周后推出!)
📚 第三部分:编写和审计安全的 zkVM 应用程序:RISC Zero 的一个实际例子(四周后推出!)
Twitter | LinkedIn | Github | 请求审计
- 原文链接: medium.com/veridise/an-i...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!