为什么 RISC-V 不适合作为 L1 交付架构指令集架构 (ISA),以及为什么 WASM 更胜一筹

本文为机器翻译
展示原文

本文概要

本文档代表 Offchain Labs 的观点,由 Mario Alvarez、Matteo Campanelli、Tsahi Zidenberg 和 Daniel Lumi 撰写。我们提供此指导,旨在助力以太坊社区的成功。

语境

最近,关于用 RISC-V 取代 EVM 作为以太坊 L1 层指令集架构 (ISA) 的讨论甚嚣尘上。Vitalik 在以太坊魔法师联盟 (Fellowship of Ethereum Magicians) 上发表的这篇文章总结了许多支持过渡到 RISC-V的论点。

Vitalik认为,替换当前的ISA将大幅改善以太坊L1扩容的两个主要限制因素,即:

  • 保持砖块生产市场的竞争力

  • ZK-EVM 证明的性能

案件概要

我们支持这些目标,但对Vitalik隐含的假设——即一个ISA可以同时完美地服务于零知识证明和智能合约交付——提出质疑。由于将IS​​A写入L1主要影响智能合约在链上的交付方式,我们应该基于ISA在链上通用交付和存储的适用性来评估它们,而不仅仅是基于其证明功能。

我们区分了指令集架构(ISA)在区块链环境中可以扮演的几种不同角色。特别是,我们讨论了交付指令集架构(dISA)的概念,以及使ISA适用于交付ISA的特性。基于这些特性,我们比较了RISC-V和WASM作为以太坊dISA的适用性,并得出结论:WASM是更佳选择。

  • RISC-V 作为一项开放的硬件标准,是一项令人印象深刻且影响深远的技术。RISC-V 的设计初衷是简洁易用,便于硬件实现。然而,我们没有理由认为基于 RISC-V 的零知识虚拟机 (ZK-VM) 将是 ZK-VM 演进的最终目标;更有可能的是,它们只是演进过程中的一个阶段。

  • WASM 被设计成一个与硬件无关的抽象层,它在所有常见硬件上的运行速度几乎与原生代码一样快。作为一种指令集架构 (ISA),它提供了类型安全和易于插桩等特性,这些特性在以太坊环境中尤为重要。选择 WASM 不会牺牲当前的扩展性,并且有助于保持以太坊未来的灵活性。

组织结构:本文档的其余部分结构如下。首先,我们将阐明“L1 ISA”的含义,并构建一个评估不同 ISA 作为智能合约交付/执行/证明格式的框架。然后,我们将简要介绍 RISC-V 和 WASM,并从几个关键维度对它们进行系统比较:SNARK 可证明性、可执行性、工具兼容性,以及——或许最为重要的——面向未来的兼容性。最后,我们将总结这些比较结果,并解释为什么我们认为 WASM 是更佳选择。

介绍

“L1 ISA”是什么意思?

当我们谈到将 WASM(或 RISC-V)用作“以太坊的指令集架构 (ISA)”时,我们需要明确其具体含义。区块链执行层对指令集的使用方式各不相同,并且可能针对不同的目的使用不同的指令集架构。例如:

  • 当节点执行区块链执行层的状态转换函数(STF)时,它们实际运行的是一系列实现该STF的机器码或字节码指令。我们将执行链状态转换逻辑时使用的指令集架构(ISA)称为执行指令集架构( eISA) 。(就本次讨论而言,这是最不相关的指令集架构类型。)

  • 对于支持使用零知识证明虚拟机 (ZK-VM) 的 SNARK 证明的区块链,该 ZK-VM 将在特定的指令集架构 (ISA) 上运行。我们称之为证明指令集架构( pISA)

  • 支持用户上传智能合约的区块链要求这些合约以特定格式上传。通常,这种格式是某种虚拟机(例如 EVM 或 MoveVM)的字节码。当区块链以这种方式使用指令集架构 (ISA)(作为交付和部署智能合约代码的格式)时,我们称之为交付 ISAdISA

请注意,在Vitalik上面链接的文章中,虽然关于RISC-V优势的大部分论点都与零知识证明(即其作为并行智能系统架构的用途)有关,但实际的提议是将RISC-V也用作分布式智能系统架构(即智能合约将用RISC-V编写)。这一点我们稍后会详细讨论。

本文将更具体地论证 RISC-V 并不适合作为以太坊的交付指令集架构 (ISA ),而 WASM 更适合此用途(即用于部署智能合约的 ISA)。在本文的其余部分,当使用术语“ISA”时,我们将尽量明确所讨论的 ISA 的具体作用(例如,eISA、pISA 和 dISA)。

理想的L1 dISA应具备的素质

为了更好地展开讨论,我们将首先提出一个框架,用于思考理想的以太坊 L1 层分布式信息存储架构 (dISA) 应具备哪些特性。然后,我们将从多个维度比较 RISC-V 和 WASM 的性能;通过比较,我们希望能够具体地论证为什么 WASM 在此方面比 RISC-V 具有更好的权衡性。

  1. 高效的SNARK可证明性

    SNARKs 将在以太坊的未来发展中扮演重要角色,因此任何 L1 dISA 都必须支持高效的证明生成。但这并不意味着 dISA 应该与 ZK-VM 使用的 ISA 相同。ZK 证明领域正在快速变化——RISC-V 目前被广泛使用,但并不能保证它始终是最佳的长期选择;与此同时,基于 WASM 的新型 ISA 和定制的 ZK 优化 ISA 已经展现出良好的前景。更佳的策略是选择一个能够可靠高效地编译成未来任何最优证明 ISA 的 dISA。

  2. 高效可执行性

    即使在未来EVM能够通过SNARK验证的情况下,许多节点(包括硬件资源受限的节点)仍然希望执行完整的区块链或合约的特定部分。因此,任何新的dISA都应该允许在通用硬件上实现良好的执行速度;也就是说,为了实现去中心化,硬件不应过于专业或昂贵。

  3. 与现有工具的兼容性

    构建高效的优化编译器栈是一项艰巨的任务——尤其是在构建一个我们必须信任不会向智能合约引入漏洞的编译器时。因此,为以太坊 L1 层选择合适的分布式信息架构 (dISA) 需要一个现有的、值得信赖的编译器及相关工具生态系统供其使用。

  4. 面向未来和长期适用性

    替换(甚至大幅更改!)以太坊 L1 的 dISA 绝非易事。此前曾多次尝试,包括最近的 EOF。尽管这些尝试均以失败告终,但其中投入的时间和精力足以说明从 EVM 切换到任何其他 dISA 所需的巨大努力。既然社区要投入如此多的精力迁移到新的 dISA,我们就必须确保新的目标不仅在当下是明智之选,而且在未来数年内也能保持其优势——否则,切换的成本很可能得不偿失。

还有一些其他特性值得一提。虽然本文不会重点介绍它们,但它们也很重要,并且代表了 WASM 相对于 RISC-V 的优势所在:

  • 可读性

    对于大多数指令集架构 (ISA) 设计者而言,可读性并非首要考虑因素。然而,对于区块链指令集架构 (dISA) 而言,可读性却至关重要。出于安全考虑和 gas 优化,区块链工程师阅读和操作编译后的 ISA 代码的频率远高于大多数软件工程师。如今,许多重要的合约代码都是直接在 EVM 中编写或验证的。由于其结构化的控制流和基于函数的局部变量,WASM 比基于硬件的 ISA 更容易理解和推理。

  • 安全与隔离

    公共 L1 层是一个高度对抗性的环境。一般来说,智能合约作者之间不应该互相信任,节点运营商不应该信任智能合约作者,也不应该信任他们的输入。使用内置隔离支持的 dISA 架构,可以更容易地保持合约之间的隔离,避免数据和代码之间的干扰。WASM 架构本身就具备这种能力;RISC-V 架构则不具备。( WASM 文档的此页面提供了更多关于 WASM 如何构建安全性和隔离支持的信息。)

RISC-V 和 WASM 的一些背景知识

RISC 代表精简指令集计算机(Reduced Instruction Set Computer)。RISC-V 是一种专为小型硬件微处理器设计的指令集架构(ISA)。RISC-V 非常精简,操作码数量少,并且是免费开源的。它受到常见的嵌入式编译器(尤其是 Rust、LLVM 和 GCC)的支持。由于 RISC-V 的开源许可,它成为众多研究项目的热门目标,包括新的扩展、变体和实现。这些特性使其成为当今通用零知识证明(ZK 证明)的事实标准 ISA。然而,需要注意的是,RISC-V 的设计初衷并非为了高效地进行零知识证明,而是为了在小型硬件微处理器上实现。

WASM 代表 WebAssembly。它最初被设计为一种在 Web 浏览器中运行的软件虚拟机,作为高性能的 JavaScript 替代方案。WebAssembly 的设计目标是在安全封装的环境中,以接近原生速度实现跨平台执行。它对底层硬件的具体细节几乎没有任何要求。

通常情况下,WASM 代码不会直接在硬件上执行或解释。相反,它会被进一步编译(转译)成目标机器硬件支持的指令集架构 (ISA),而第二次编译会确保代码能够合理利用机器的硬件资源。WASM 的设计目标是尽可能降低从源代码→WASM→本地编译的开销,使其低于更直接的源代码→本地编译。WASM 力求将所有硬件相关的优化机会保留给后续的编译阶段,因为这些阶段能够感知目标系统硬件的具体情况。

WASM 使用栈来传递操作和函数之间的值,但它并非真正意义上的基于栈的机器。这是因为 WASM 还可以访问局部变量,这些变量用于存储与多个表达式相关的数据。局部变量使得 WASM 能够轻松地编译成基于寄存器的机器,而无需考虑寄存器的数量等硬件细节。

高效的SNARK可证明性

如上所述,Vitalik 之所以支持使用 RISC-V 作为以太坊 L1 的指令集架构 (dISA),主要依据是存在一些高效的零知识虚拟机 (ZK-VM),它们都使用 RISC-V 作为指令集架构(例如 Succinct SP1、RISC0ETC)。使用直接支持高效 SNARK 证明的 dISA 具有天然的吸引力,因为此类证明的可用性为在该 dISA 中实现的智能合约的零知识证明提供了一条自然的途径。不过,目前我们将重点关注以下两点:

  1. 基于 RISC-V 的 ZK-VM 并不能保证从长远来看是最佳选择。

  2. 无论 ZK-VM pISA 的长期解决方案是什么,只要 dISA 能够高效地编译成所需的 pISA,我们就不需要 dISA 与 pISA 完全匹配。

RISC-V 和零知识虚拟机的未来

尽管当前基于 RISC-V 的 ZK-VM 架构表现出色,但 RISC-V 能否长期保持领先地位仍远未可知。RISC-V 的确为 ZK 证明提供了一些优势,例如指令集有限,但归根结底,RISC-V 的设计初衷是针对硬件相关的指标进行优化。因此,我们没有理由期望一个围绕这些指标优化的架构也能成为 SNARK 证明的最佳选择——尤其是在长期发展的情况下。

虽然 RISC-V 目前看似胜出,但基于 RISC-V 的零知识虚拟机 (ZK-VM) 是否就代表了支持高效零知识证明的指令集架构 (ISA) 的“终结”还不得而知。值得注意的是,零知识虚拟机领域尚处于起步阶段:RISC Zero直到 2022 年才发布了首个生产级零知识虚拟机,而Succinct 也只是在今年早些时候才实现了商业上可行的实时主网EVM 证明。

ZK-VM领域持续发生重大变化。例如,最近一些ZK-VM已经从32位RISC-V架构迁移到64位RISC-V架构。假设我们一年前在L1缓存中嵌入了32位RISC-V架构,那么我们将面临两种局面:要么需要再次修改以太坊的dISA(分布式信息架构),要么(更有可能)嵌入32位版本会阻碍基于64位RISC-V架构的ZK-VM的开发和应用,尽管它们具有诸多优势。这正体现了保持向前兼容性的重要性,以及WASM如何支持可移植性。

也有理由认真考虑这样一种观点:非RISC-V指令集架构(ISA),例如WASM,用作并行指令集架构(pISA),在零知识证明方面可能比RISC-V具有固有优势。例如,Ligero公司的Ligetron(一种基于WASM的零知识虚拟机)能够利用WASM的结构化特性来提高内存效率。这种结构在转译成RISC-V等底层硬件优化指令集架构时会丢失;这表明基于RISC-V的零知识虚拟机可能无法利用这类极具前景的技术。

dISA 可以汇编成 pISA。

这里更相关的一点是,在为以太坊 L1 选择 dISA 时,我们不必过分关注是否存在直接支持该 dISA 的 ZK-VM 。毕竟,这只是为用该 dISA 编写的智能合约生成 SNARK 证明的一种方法。另一种方法是将 dISA 编译(或转译)成一种支持高效 SNARK 证明生成的 ISA(即与 dISA 不同的 pISA)。

这并非仅仅是理论上的可能性,而是 Offchain Labs 与 Succinct 合作中正在积极构建的目标。通过将 WASM 代码编译成 RISC-V 代码,我们不仅能够对核心Arbitrum STF 进行零知识证明,还能对用户提供的用 WASM 编写的Stylus智能合约(作为 dISA)进行零知识证明。虽然目前仍处于原型阶段,但我们已经将风险降低到足以确定其可行性的程度(包括证明合约从 dISA 编译为 pISA,以及证明合约在 pISA 上的执行)。重申一下,我们现在就可以在以 WASM 作为 dISA 的区块链(Arbitrum)上,通过使用基于 RISC-V 的零知识虚拟机 (ZK-VM) 作为后端,对真实世界的区块进行零知识证明。这具体表明,我们区分 dISA 和 pISA 的观点,以及我们坚持认为它们不必是同一 ISA 的观点,对区块链的 SNARK 证明系统的设计具有切实的意义。

围绕单一中间抽象层进行标准化的理念,即使用一个接口连接系统中各种高层和低层组件,有时被称为“沙漏模型” 。互联网网络协议栈或许是这种架构的最佳例证:各种应用程序构建于互联网之上,使用不同的传输协议(TCP、UDPETC),所有这些最终都以互联网协议 (IP) 数据包的形式呈现。反过来,这些数据包又通过各种物理链路协议(例如以太网)进行传输。应用程序无需了解链路协议的细节,链路协议也无需了解应用程序的细节:这种关系由 IP 协议协调实现。

我们认为 WASM 可以成为智能合约的互联网协议,作为智能合约编写所使用的各种源语言与用于执行和验证智能合约的各种后端之间的理想中间层。通过分离这些职责,WASM 作为分布式信息系统架构 (dISA) 可以使智能合约的编程、验证和执行自由演进,而不是相互制约。

高效可执行性

基于当前(或被认为)最佳的零知识证明指令集架构 (ISA) 来选择 dISA,可能优化的是错误的指标,原因还在于:证明并非一切。如今,节点执行链上事务是为了跟上所有必要的状态和链上事件。即使可以通过其他方式(例如使用零知识证明和状态更新)来跟上链上事务,链用户发出的eth_call和 gas 估算请求也远多于链上交易。因此,响应用户的eth_call和 gas 估算请求是 RPC 节点工作的重要组成部分,并且(根据定义)需要执行用以太坊 dISA 编写的智能合约。虽然这些工作流程可以横向扩展,但响应这些请求的成本仍然需要有人承担,并且应该被视为运行以太坊总成本的一部分。

零知识证明的性能固然重要。然而,我们预计在中长期内,证明成本不会成为以太坊的瓶颈。在当前的 gas 上限下,实时证明的成本平均每个区块仅约为 0.025 美元。即使 L1 认证需要每个区块生成多个零知识证明,与构建者从区块中获得的 gas 费用和 MEV 相比,这部分成本也微不足道。生成零知识证明的成本在短短几年内已经下降了几个数量级,而且预计不会出现阻碍其持续改进的重大因素。换句话说,仅仅优化证明者的效率可能适得其反。执行成本是运行以太坊的另一项重要成本,不容忽视。

RISC-V 的设计目标是在硬件上高效执行。然而,目前只有极少数以太坊节点运行在支持 RISC-V 的 CPU 上。为了让这些非 RISC-V 节点能够执行用 RISC-V 编写的智能合约,它们需要模拟 RISC-V 的运行环境,或者将其编译成机器原生支持的 eISA 指令集。

将执行和证明过程分离,并使用像 WASM 这样的可移植指令集架构 (ISA),可以兼顾两者的优势Arbitrum就是这么做的,它部署的WASM 代码作为原生 ARM 或 AMD 代码执行,这使得 Stylus 的计算成本非常低,而无需高性能 CPU 来执行。

与现有工具的兼容性

RISC-V 的一大优势在于其对主流编译器工具链的强大支持。LLVM 和 GCC 等主流编译器都拥有成熟的 RISC-V 后端,这使得开发者能够将 C、C++ 和 Rust 等语言编写的代码直接编译成 RISC-V 代码。这种广泛的编译器支持是 ZK-VM 项目迅速采用 RISC-V 的重要因素——团队可以利用现有的、经过实战检验的编译基础设施,而无需从头开始构建一切。

然而,WASM 拥有同样强大(甚至更强)的编译器支持。支持 RISC-V 的主流编译器工具链也拥有成熟且维护良好的 WASM 后端。特别是 LLVM,其对 WASM 的支持非常出色,并且一直在积极维护和优化。除了传统的编译器基础设施之外,WASM 还受益于几乎所有现代 Web 浏览器和 JavaScript 运行时的原生支持,这代表着数十亿个已部署的执行环境。这种普遍性意味着 WASM 工具已经过测试、强化和优化,其规模之大,其他指令集架构 (ISA) 鲜有匹敌。对于区块链开发者而言,这意味着他们可以访问一个丰富的调试器、分析器、优化器和其他开发工具生态系统,这些工具经过多年在无数应用程序中的生产使用而不断完善。

成熟的编译器生态系统显然是一项理想的特性,但并非必要条件。以太坊社区或许愿意为了其他特性而做出取舍——例如,选择一个经过零知识库优化的自定义指令集架构(ISA),从而在证明方面提供更优的性能。但这并不会改变讨论的核心:我们为优秀的指令集架构(dISA)概述的基本特性(面向未来、安全性、隔离性、可插拔性以及在各种硬件上的高效执行性)仍然是至关重要的标准。WASM 在这些方面依然表现出色,同时还具备成熟工具带来的额外优势。

面向未来与安全性

鉴于替换以太坊的 dISA 需要付出巨大的努力,任何过渡都应该面向未来,也就是说,应该牢记长期可持续性。

前面已经讨论过第一层面向未来的保障措施,其实现方式是通过区分 pISA 和 dISA。我们设想以太坊的未来是这样的:多个相互竞争的证明者使用多个相互竞争的 pISA,每个 pISA 都具有不同的属性和设计选择,但所有 pISA 都证明同一个唯一的规范 dISA。

WASM 结构化且经过验证,因此能够支持更多未来的应用场景。例如,假设某个 pISA 为“将uint64乘以5 ”这一操作提供了一个特殊的电路,并且希望修改代码中所有使用常量5的“乘以常量”操作,将其改为调用这个新的特定操作码。

使用 RISC-V 等面向机器的指令集架构 (ISA)(或大多数其他面向机器的指令集架构)来处理部署为智能合约的任意代码,可能相当具有挑战性。RISC-V 中的跳转要么指向精确的目标位置,要么指向代码中的偏移量(相对于当前程序计数器)。无论哪种情况,跳转都本质上依赖于正在执行的程序的精确编码和代码大小。如果任何静态工具想要用编码长度不同的代码替换函数中的任何部分,则需要找到代码中所有相关的跳转并修改它们的跳转偏移量。事实上,情况甚至更糟,因为 RISC-V 的跳转目标位置可能是任意计算的结果。

现在考虑用 WASM 编写的相同场景。这里没有任意的jumpgoto语句;只有条件语句、循环语句和函数。所有跳转要么是通过索引调用函数,要么是在不同的变体之间进行选择(if-else 语句),要么是在循环内部进行跳转,要么是在循环外部进行跳转。跳转不会因为代码编码或大小的改变而改变。

此外,WASM 代码可以进行验证。有效的 WASM 代码具有以下几个理想的特性:

  • 它只能从栈中读取被调用时位于栈顶的参数,并且只能读取它应该读取的参数数量。

  • 它无法访问未声明的局部变量或全局变量。同样,它也无法访问任何其他函数的局部变量。

  • 它是类型安全的,确保每个函数的输入和输出类型与预期相符。

至关重要的是,验证(检查这些属性)所需的时间与被验证的WASM代码的长度呈线性关系。这完全得益于WASM的设计;以自动化、高效的方式检查RISC-V机器代码(或任何其他传统指令集架构的机器代码)的这些属性将非常困难。

WASM 代码的结构和有效性相结合,使得我们可以对代码进行分析,甚至进行高度自由的修改。在上面的例子中,我们可以在 WASM 代码中找到任何 ` i64.const 5操作码后紧跟 ` i64.mult操作码的地方,删除这两个操作码,并用新的特殊操作码取而代之。新的操作码可以比之前的两个操作码更短或更长,甚至可以调用特殊函数而不影响周围的任何代码。

为了展示结构化ISA在区块链环境中的价值,我们可以考察Arbitrum如何利用WASM的结构化特性:

  • 我们的乐观框架 Arbitrator 使用 WAVM 作为其 pISA(是的,即使是乐观证明器也可以有 pISA!)。WAVM 与 WASM 非常相似(两者之间存在一些差异,但在这里并不重要)。Arbitrator 接受 WASM 代码作为输入,并对其进行一系列转换。WAVM 的指令编码方式与 WASM 不同,并且某些 WASM 指令由多个 WAVM 操作码实现。然而,由于 WASM 不依赖于任何代码片段的位置、编码或大小,因此从 WASM 到 WAVM 的转换简单、快速且确定。

  • WASM 的结构化特性是我们如何安全地为用户提供的 WASM 智能合约(Stylus)添加 gas 计费功能,使其能够在链上安全运行的核心部分(参见“与现有工具的兼容性”)。

WASM之所以能够面向未来,其特性也使其更易于审计,无论是人工审计还是机器审计。WASM的结构和有效性意味着,例如,任何输入都不会被转换为可执行代码,读取局部变量的代码也永远不会被修改为从内存或其他函数读取数据。这将提高智能合约和整个系统的安全性,同时仍然允许我们利用未来零知识证明方面的创新(如上所述)。

结论

本文阐述了区块链可能使用多种不同的指令集架构(ISA)来实现不同目的(例如证明、交付、执行)的观点。当 Vitalik 等人讨论将 RISC-V 作为以太坊 L1 的新 ISA 时,他们(用我们的话说)认为,RISC-V 作为通用的 pISA,也是 dISA 的理想选择。然而,正如我们前面讨论过的, pISA 和 dISA 并非必须相同。我们讨论了这一点如何从根本上改变了讨论的框架。

对于指令集架构 (ISA) 的证明而言,零知识虚拟机 (ZK-VM) 领域发展迅速,现在判断哪种 pISA 最适合在以太坊 L1 层执行证明可能还为时尚早。以太坊社区应该选择一个灵活的分布式指令集架构 (dISA),使其能够兼容多种 pISA。WASM 正是理想之选。

我们认为,正如上文所述,在诸多相关方面,WASM 比 RISC-V 更适合用于交付智能合约。WASM 具备强大的安全性、隔离性和检测功能;强大的编译器和工具链支持;高效的执行(证明);而且,或许最重要的是,它足够灵活,能够适应区块链执行和证明领域未来充满不确定性和快速变化的环境。对于 SNARK 证明而言,它绝不会成为负担。

我们很高兴看到社区如此热衷于 L1 执行层的演进。正如 RISC-V 的支持者们所认为的那样,如果以太坊要兑现其实现新型信任关系和构建更易于访问的金融基础架构的承诺,就必须超越 EVM 作为以太坊唯一支持的指令集架构 (ISA)。在以太坊演进的这个重要节点,我们希望本文提出的观点能够帮助大家做出更具前瞻性的决策,从而在未来几年内构建一个更完善的 L1 执行层。


来源
免责声明:以上内容仅为作者观点,不代表Followin的任何立场,不构成与Followin相关的任何投资建议。
喜欢
收藏
评论