当前位置: 首页 > news >正文

EVM-MLIR:以MLIR编写的EVM

1. 引言

EVM_MLIR:

  • 以MLIR编写的EVM。

开源代码实现见:

  • https://github.com/lambdaclass/evm_mlir(Rust)
    • 为使用MLIR和LLVM,将EVM-bytecode,转换为,machine-bytecode。
    • LambdaClass团队在2周内,用5个新员工,借助编译器将VM opcode逻辑编译为原生机器码,实现了约75%的以太坊虚拟机功能,即实现了149个opcodes中的111个。
    • 相比于revm,运行factorial和fibnacci程序,其性能提升了300%到600%。

有很多其它虚拟机会将bytecode编译为原生指令,但奇怪的是,以太坊虚拟机(EVM)的实现并没有做这种编译。LambdaClass在做Cairo Native时(见https://github.com/lambdaclass/cairo_native(Rust + Cairo)),学到了很多MLIR/LLVM的知识(详情见:LambdaClass 2023年5月3日博客 Exciting times at the intersection of Compilers and Applied Cryptography: Cairo and MLIR),为此,开启了EVM-MLIR项目,来实现比revm更快的替代方案。

2. 将MLIR用于EVM

EVM:

  • 为基于栈的虚拟机
  • 所编译的bytecode表示了一组指令,每个指令包含1-byte opcodes 及其参数。
  • Push操作可包含多达32字节的额外数据(即推送到栈上的数据量)

EVM的内存架构包含5大组件:

  • Stack:存储最多1024个256-bit宽整数。每个操作会从Stack上pop操作数,并(或)将结果推送到Stack上。若某程序run out of stack,则该程序终结。
  • Memory:为字节数组。支持按字节随机寻址。用于按顺序存储和访问可变数据。
  • Calldata:为与Memory类似的只读字节数组,作为每笔交易的输入发送。某些操作数支持从calldata拷贝到stack或memory。
  • Storage:为具有256-bit keys和values的字典。对其的修改是持久的,除非交易被revert。
  • Transient Storage:与Storage类似,但其修改会在交易结束时丢弃。

由此可知,EVM的执行模型非常简单。
指令序列上的naive interpreter loop很容易实现,但很难优化。有很多方法可实现bytecode interpreters ,但通过直接将每个操作码翻译成机器指令来消除interpreter开销是非常有效的。唯一的困难是:

  • 需要一个编译器后端以及链接和调用所生成代码的方法。

LambdaClass团队决定利用其在MLIR方面的经验,编写一个库:

  • 将每个操作转换为a sequence of MLIR blocks,每个MLIR block包含了实现每个opcode行为的MLIR操作,
  • 并通过将每个操作码连接到下一个操作码来将其串起来
  • 最后,这个表示可以转换为LLVM IR,并通过LLVM的optimizer传递。

为此:

  • 不仅将每个opcode逻辑转换为了MLIR操作,

还需要转换内存架构:

  • Stack:在开始构建MLIR blocks sequence之前,预分配最大stack size(1024个元素)。当前指针和base指针,均用于维护该stack,并检查overflow或underflow。
  • Memory:在Rust中处理内存分配,扩展为所需的FFI callbacks。
  • Calldata:存储在Rust端,将其作为EVM的输入。
  • Storage/Transient storage:通过syscalls来处理,具有与revm类似的api。

3. EVM-MLIR benchmarks

具体的benchmark代码见:

  • https://github.com/lambdaclass/evm_mlir/tree/main/bench/revm_comparison/src

未来将添加更多复杂的程序。

3.1 以Factorial为例的benchmark

以Factorial为例:

  • 计算第N个阶乘,其中N作为calldata传入。

选择N=1000为例,将该程序循环执行10万次,有:
在这里插入图片描述

3.2 以Fibonacci为例的benchmark

以Fibonacci为例:

  • 计算第N个Fibonacci值,其中N作为calldata传入。

选择N=1000为例,将该程序循环执行10万次,有:
在这里插入图片描述

4. 未来规划

LambdaClass团队会保留一个骨干团队来完成剩余的功能并继续优化,并专注于其新执行客户端——以ETHereum Rust Execution命名为ethrex——见https://github.com/lambdaclass/ethereum_rust。
该新执行客户端的目标是:

  • 在未来两个月内为以太坊生态系统提供一个具有简单、直接代码的替代Rust执行客户端。
  • MLIR EVM准备好后,打算将其整合到ethrex中,作为 dog-fooding effort的一部分。

参考资料

[1] LambdaClass团队2024年6月14日博客 EVM performance boosts with MLIR

http://www.lryc.cn/news/392852.html

相关文章:

  • 深入Django(八)
  • 华为开发者大会2024纪要:鸿蒙OS的全新篇章与AI大模型的革命
  • 吴恩达深度学习笔记:机器学习策略(2)(ML Strategy (2)) 2.7-2.8
  • 云计算渲染时代:选择Blender或KeyShot进行高效渲染
  • html5中的iframe
  • 海睿思问数(TableGPT):开创企业新一代指标应用模式
  • LM-Cocktail:一种创新的模型合并方法打破预训练语言模型微调后的性能局限,实现语言模型在一般任务与特定领域的均衡高性能
  • 默认导出(default)和命名导出
  • 开发个人Go-ChatGPT--1 项目介绍
  • 皮卡超级壁纸 | 幸运壁纸幸运壁纸app是一款涵盖了热门影视剧、动漫、风景等等资源的装饰工具,
  • 普通集群与镜像集群配置
  • 2024科技文化节程序设计竞赛
  • 玩转Easysearch语法
  • 【密码学】RSA公钥加密算法
  • 【ARMv8/v9 GIC 系列 5.1 -- GIC GICD_CTRL Enable 1 of N Wakeup Function】
  • C++怎么解决不支持字符串枚举?
  • 中英双语介绍四大会计师事务所(Big Four accounting firms)
  • ubuntu 查看联网配置
  • 【数据分享】全国乡村旅游重点镇(乡)数据(Excel/Shp格式/免费获取)
  • 停车场小程序的设计
  • 绿色金融相关数据合集(2007-2024年 具体看数据类型)
  • 【matlab 项目工期优化】基于NSGA2/3的项目工期多目标优化(时间-成本-质量-安全)
  • Python考前复习
  • 虚拟机交叉编译基于ARM平台的opencv(ffmpeg/x264)
  • react之错误边界
  • openEuler系统之使用Keepalived+Nginx部署高可用Web集群
  • 基于图像处理的滑块验证码匹配技术
  • 【JavaEE精炼宝库】文件操作(1)——基本知识 | 操作文件——打开实用性编程的大门
  • 常用排序算法_06_归并排序
  • 14-8 小型语言模型的兴起