该团队在两周内用五名新员工完成了以太坊虚拟机(EVM)75%的功能,并通过最先进的编译器后端将 VM 操作码逻辑编译为本地机器代码。他们创建了 EVM-MLIR 项目,旨在提供比 revm 更快的替代方案,并计划将其集成到新的以太坊执行客户端 ethrex 中,以提高性能并增加实现的多样性。基准测试显示,在运行阶乘和斐波那契程序时,吞吐量比 revm 高 300% 到 600%。
我们在两周内,通过五名新员工,实现了以太坊虚拟机 75% 的功能,并使用最先进的编译器后端将 VM opcode 逻辑编译为本地机器代码。我们为什么要这样做? 怎么做的?
简而言之:为了获得性能提升(最近的基准测试结果显示,在运行阶乘和斐波那契程序时,吞吐量比 revm 高 300% 到 600% 倍),增加实现多样性,并将其用于我们即将推出的以太坊执行客户端实现中。
看到许多其他 VM 将字节码编译成原生指令,我们觉得奇怪的是,以太坊虚拟机(EVM)的实现并没有这样做。 在做 Cairo Native 时,我们学到了很多关于 MLIR/LLVM 的知识,因此我们启动了 EVM-MLIR 项目,目标是拥有一个比 revm 更快的替代方案。
我们希望尽快了解可行性,因此我们首先明确了问题(和解决方案),制定了项目框架和实用程序,并确保新团队拥有坚实的基础。 通过准备好要分配的明确任务,我们设法在两周内实现了主网中 149 个 opcode 中的 111 个!
EVM 是一种基于堆栈的虚拟机,其编译后的字节码表示一个指令序列,该序列由带有隐式参数的 1 字节 opcode 组成。 Push 操作还包括最多 32 字节的额外数据(要推送到堆栈的数字)。
它的内存架构由五个组件组成:
我们可以看到,EVM 的执行模型非常简单,这是有意的。
在指令序列上实现一个简单的解释器循环很容易,但很难优化。 有很多方法可以实现字节码解释器(这是一个有趣且具有教育意义的项目!),但是通过将每个 opcode 直接转换为机器指令来消除解释器开销非常有效。 唯一的困难是需要一个编译器后端以及一种链接和调用生成代码的方法。
我们决定利用我们最近使用 MLIR 的经验,并编写一个库,将每个操作转换为一系列 MLIR 代码块,其中包含实现每个 opcode 行为的 MLIR 操作,通过将每个操作连接到下一个操作来将它们连接起来。 最后,此表示形式可以转换为 LLVM IR,并通过 LLVM 的优化通道。
我们不仅需要根据 MLIR 操作来转换每个 opcode 的逻辑,还需要转换内存架构:
该程序计算第 N 个阶乘数,其中 N 通过 calldata 传递。 我们选择 1000 作为 N,并在循环中运行该程序 100,000 次。
| Mean [s] | Min [s] | Max [s] | Relative | |
|---|---|---|---|---|
| EVM-MLIR | 1.062 ± 0.004 | 1.057 | 1.070 | 1.00 |
| revm | 6.747 ± 0.190 | 6.497 | 7.002 | 6.36 ± 0.18 |
| Mean [s] | Min [s] | Max [s] | Relative | |
|---|---|---|---|---|
| EVM-MLIR | 1.363 ± 0.151 | 1.268 | 1.691 | 1.00 |
| revm | 5.081 ± 0.685 | 4.839 | 7.025 | 3.73 ± 0.65 |
该程序计算第 N 个斐波那契数,其中 N 通过 calldata 传递。 同样,我们选择 1000 作为 N,并在循环中运行该程序 100,000 次。
| Mean [s] | Min [s] | Max [s] | Relative | |
|---|---|---|---|---|
| EVM-MLIR | 1.010 ± 0.016 | 0.990 | 1.040 | 1.00 |
| revm | 6.192 ± 0.119 | 6.094 | 6.374 | 6.13 ± 0.15 |
| Mean [s] | Min [s] | Max [s] | Relative | |
|---|---|---|---|---|
| EVM-MLIR | 1.496 ± 0.236 | 1.243 | 1.756 | 1.00 |
| revm | 4.586 ± 0.066 | 4.537 | 4.727 | 3.07 ± 0.49 |
这些基准测试的代码可以在我们的 repo 中看到:lambdaclass/evm_mlir,以及有关如何重现它们的文档。 我们目前在我们的 CI 上运行它们以检测性能回归,并且我们将在不久的将来添加更复杂的程序。
我们现在留下一个精干的团队来完成剩余的功能并继续进行优化,并将重点放在我们新的执行客户端上 —— 以 ETHereum Rust EXecution 命名为 ethrex。
如前所述,我们新的执行客户端的目标是在未来两个月内为以太坊生态系统提供一个具有简单、直接代码的替代 Rust 执行客户端。 在 MLIR EVM 准备就绪后,我们打算将其集成到 ethrex 中,作为一种自食其力的努力。
- 原文链接: blog.lambdaclass.com/evm...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!