以太坊 - 发布Revmc - Paradigm

  • Paradigm
  • 发布于 2024-06-21 21:31
  • 阅读 55

本文介绍了 revmc 的开发背景、工作原理和性能测试,重点强调了将 EVM 字节码编译为本地代码的优势,能显著提高执行速度。文章还展望了 revmc 在 L2 环境中的应用前景,并提出了一些未来的发展计划,包括更多的优化和测试。

大纲

我们最近发布了 Reth 的高性能路线图,号召在 EVM 区块链中更广泛使用“每秒 gas”作为性能指标,并详细说明我们将区块链扩展到每秒 1 千兆 gas 及以上的计划,相比以太坊的现状提高了 1000 倍。

今天,我们很高兴地开源 revmc,一个将 EVM 字节码降级为本地代码的编译器,在各种现实 EVM 基准测试中显示了 1.85 倍到 19 倍的改进。我们还 集成了 revmc 到 Reth 中并成功同步了链。接下来,我们将集成 revmc 到 OP Reth 中以用作 L2,在计算密集型工作负载中它的改进将更加明显。

Revmc 已经过广泛测试,并将进一步精细化以便于生产使用。代码在 github.com/paradigmxyz/revmc 下以 Apache/MIT 许可证开源。

为什么构建 EVM 到本地代码编译器?

开发 revmc 的动机在于提升 EVM 的性能,由于字节码解释的固有限制。传统的 EVM 执行涉及通过解释器顺序处理指令,这引入了显著的开销和延迟,因为指令并不是以本地汇编代码执行的。通过将 EVM 字节码编译成优化后的本地机器代码,编译器使得可以在硬件上直接执行,从而大幅减少与虚拟机层相关的开销。

此外,提前编译字节码 (AOT) 而非在执行时即时编译 (JIT) 缓解了与 JIT 编译相关的安全风险,例如潜在的恶意代码漏洞,用于利用 JIT 过程。AOT 方法允许将最高需求的合约预编译并安全存储,确保区块链高效运行而不牺牲安全性。

这些理念在加密领域之外存在已久,例如 Java 或 WASM 的 JIT 编译器,而在加密领域中也存在于 EVM 和其他 运行时 中。我们预计每个区块链的运行时都会有其运行时的编译本地汇编版本,以提供更高的性能。

它是如何工作的?

Revmc 的功能是将 EVM 字节码(在以太坊虚拟机中执行的指令集)编译为本地机器代码,主机系统的处理器可以直接执行。

此过程分为两个关键步骤:

  1. 分析与优化:编译器首先分析字节码,以理解控制流和数据依赖。这是在我们自己的 中间表示 (IR) 中实现的,然后我们对其进行自定义优化。
  2. 通过 LLVM 生成代码:我们接下来通过 inkwell crate 调用 LLVM,传递优化后的 IR,然后我们的工作基本完成。LLVM 将生成适合主机系统特定架构的相应本地机器代码。此步骤至关重要,因为它决定了生成的可执行代码的效率。

编译器能够以阻塞或后台方式工作。当在热路径中运行时,编译器应在后台运行,以确保在运行时不会影响系统性能,一旦编译完成,它可以将解释执行热替换为本地执行。对于基准测试,最好先以阻塞模式编译所有合约,然后再针对工作负载进行测试。

编译完成后,本地代码可以存储在磁盘上。这确保在节点重新启动时不会浪费多余的时间重新编译合约,并且还允许节点操作员仅运行他们信任的合约,这些合约是提前编译的,而不是允许任何合约在运行时被编译。

Revmc 通过 Reth SDK 的 NodeBuilder API 集成到 Reth 中,允许节点操作员通过 --experimental.compiler 标志选择运行本地代码。我们提供了关于如何 将字节码编译 成本地代码的示例,以及如何将其集成到 revm 的 EVM Builder 中。我们已同步了启用 revmc 的节点,并成功验证了截至 2024 年 6 月 20 日的状态根。

运行速度如何?

我们定义了 criterion 基准测试,针对一些简单的工作负载,下面是我们的结果:

Fibonacci 展示了 19 倍的改进,这代表了计算密集型工作负载。LLVM 在这里特别令人印象深刻,因为它可以自动矢量化指令,并利用其自身的本地 U256 类型,其速度比 ruint 更快。不幸的是,LLVM 在优化除法方面并不出色,因此在此类或类似操作中重量型的代码可能无法获得如此大的收益。

WETH 和 Counter 是我们在区块链中常见的工作负载,首先你从主机(例如数据库)读取数据,然后进行一些简单的数学运算,最后将数据写回主机。由于主机操作无法通过字节码编译器加速,1.85x-2.77x 的改进算是相当不错了!

我们 集成并基准测试了 revmc 在以太坊 L1 的 Reth 执行阶段(使用 reth stage run execution),这是我们历史同步的 主要组件。由于 L1 上大多数历史同步的工作负载并不计算密集,因此我们看到的结果不够出色,O(1-10%),具体取决于区块范围。

Revmc 的未来是什么?

我们认为 revmc 将在计算密集型工作负载的高性能 L2 上真正闪耀,例如 Base 或 OP Mainnet。为此,我们将在即将发布的 Reth AlphaNet 中推出 revmc

在路线图方面,我们希望做以下几件事:

  • 广泛测试、模糊测试、基准测试以适应生产使用。
  • 在节点运行时在后台 JIT 编译代码,而不影响同步时间,支持 JIT 瓶颈或允许远程代码执行。
  • 实现 EOF 支持
  • 使用更多 LLVM 特性和优化,使其运行得更快。
  • 探索通过 FFI 与其他以太坊客户端进行集成。

在此之前,请查看我们在 Github 上的实现。如果你对与我们合作感兴趣,请联系 georgios@paradigm.xyz

  • 原文链接: paradigm.xyz/2024/06/rev...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Paradigm
Paradigm
Paradigm 是一家研究驱动型技术投资公司 https://www.paradigm.xyz/