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
相关文章:
EVM-MLIR:以MLIR编写的EVM
1. 引言 EVM_MLIR: 以MLIR编写的EVM。 开源代码实现见: https://github.com/lambdaclass/evm_mlir(Rust) 为使用MLIR和LLVM,将EVM-bytecode,转换为,machine-bytecode。LambdaClass团队在2周…...
深入Django(八)
掌握Django的管理后台 引言 在前七天的教程中,我们介绍了Django的基础架构、模型、视图、模板、URL路由、表单系统以及数据库迁移。今天,我们将深入了解Django的管理后台,这是一个功能强大的内置管理界面,用于创建、更新、查看和…...
华为开发者大会2024纪要:鸿蒙OS的全新篇章与AI大模型的革命
华为开发者大会2024纪要:鸿蒙OS的全新篇章与AI大模型的革命 在科技的浪潮中,华为再次引领潮流,2024年的开发者大会带来了一系列令人瞩目的创新成果。从鸿蒙操作系统的全新Beta版到盘古大模型的震撼发布,华为正以前所未有的速度重塑智能生态。以下是本次大会的亮点,让我们…...
吴恩达深度学习笔记:机器学习策略(2)(ML Strategy (2)) 2.7-2.8
目录 第三门课 结构化机器学习项目(Structuring Machine Learning Projects)第二周:机器学习策略(2)(ML Strategy (2))2.7 迁移学习(Transfer learning) 第三门课 结构化机器学习项目࿰…...
云计算渲染时代:选择Blender或KeyShot进行高效渲染
在云渲染技术日益成熟的背景下,挑选一款贴合项目需求的3D渲染软件显得尤为关键。当前,Blender与KeyShot作为业界领先的全能渲染解决方案,广受推崇。它们虽皆能创造出令人信服的逼真视觉效果,但在特色功能上各有所长。本篇文章旨在…...
html5中的iframe
HTML5中的iframe 浏览上下文是浏览器展示文档的环境,通常是一个tab标签页,一个窗体或者是浏览器页面的一部分。每个浏览上下文都有一个活动文档的源和一个记录所有展示文档的有序历史。浏览上下文的通讯被严格限制,只有两个同源的浏览器上下…...
海睿思问数(TableGPT):开创企业新一代指标应用模式
1 指标建设对企业经营管理数字化的价值分析 指标是将海量数据中关键信息提炼和挖掘出来,以数据为载体展示企业经营管理和分析中的统计量。它通过分析数据,形成一个具有度量值的汇总结果,使得业务状态可以被描述、量化和分解。指标通常由度量…...
LM-Cocktail:一种创新的模型合并方法打破预训练语言模型微调后的性能局限,实现语言模型在一般任务与特定领域的均衡高性能
LM-Cocktail:一种创新的模型合并方法打破预训练语言模型微调后的性能局限,实现语言模型在一般任务与特定领域的均衡高性能 使语言模型的微调类似于调制一杯精致的鸡尾酒。模型合并可用于提高单个模型的性能。我们发现此方法对于大型语言模型和密集嵌入模型也很有用,并设计了…...
默认导出(default)和命名导出
1.默认导出 优点: 简洁的导入语法: 导入时不需要使用花括号,可以直接重命名。单一职责: 模块导出一个主要功能或对象时,默认导出更符合逻辑。 适用场景: 模块只有一个导出: 如一个组件、一个…...
开发个人Go-ChatGPT--1 项目介绍
开发个人Go-ChatGPT--1 项目介绍 开发个人Go-ChatGPT--1 项目介绍知识点大纲文章目录项目地址 开发个人Go-ChatGPT–1 项目介绍 本文将以一个使用Ollama部署的ChatGPT为背景,主要还是介绍和学习使用 go-zero 框架,开发个人Go-ChatGPT的服务器后端&#…...
皮卡超级壁纸 | 幸运壁纸幸运壁纸app是一款涵盖了热门影视剧、动漫、风景等等资源的装饰工具,
软件下载链接:壁纸下载方式在链接中文章底部 皮卡超级壁纸 皮卡超级壁纸是一款专为手机用户设计的壁纸应用,它提供了丰富多样的高清壁纸资源,让用户的手机界面焕然一新。这款应用以其海量的壁纸库和用户友好的操作界面,在市场上…...
普通集群与镜像集群配置
目录 一. 环境准备 二. 开始配置集群 三. RabbitMQ镜像集群配置 四. 安装并配置负载均衡器HA 一. 环境准备 关闭防火墙和selinux,进行时间同步 主机名系统IP服务rabbitmq-1 Rocky_linux9.4 192.168.226.22RabbitMQ,MySQLrabbitmq-2Rocky_linux9.41…...
2024科技文化节程序设计竞赛
补题链接 https://www.luogu.com.cn/contest/178895#problems A. 签到题 忽略掉大小为1的环,答案是剩下环的大小和减环的数量 #include<bits/stdc.h> #include<iostream> #include<cstdio> #include<vector> #include<map> #incl…...
玩转Easysearch语法
Elasticsearch 是一个基于Apache Lucene的开源分布式搜索和分析引擎,广泛应用于全文搜索、结构化搜索、分析等多种场景。 Easysearch 作为Elasticsearch 的国产化替代方案,不仅保持了与原生Elasticsearch 的高度兼容性,还在功能、性能、稳定性…...
【密码学】RSA公钥加密算法
文章目录 RSA定义RSA加密与解密加密解密 生成密钥对一个例子密钥对生成加密解密 对RSA的攻击通过密文来求得明文通过暴力破解来找出D通过E和N求出D对N进行质因数分解通过推测p和q进行攻击 中间人攻击 一些思考公钥密码比对称密码的机密性更高?对称密码会消失&#x…...
【ARMv8/v9 GIC 系列 5.1 -- GIC GICD_CTRL Enable 1 of N Wakeup Function】
请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC Enable 1 of N Wakeup Function基本原理工作机制配置方式应用场景小结GIC Enable 1 of N Wakeup Function 在ARM GICv3(Generic Interrupt Controller第三代)规范中,引入了一个名为"Enable 1 of N Wakeup"的功能。…...
C++怎么解决不支持字符串枚举?
首先,有两种方法:使用命名空间和字符串常量与使用 enum class 和辅助函数。 表格直观展示 特性使用命名空间和字符串常量使用 enum class 和辅助函数类型安全性低 - 编译器无法检查字符串有效性,运行时发现错误高 - 编译期类型检查…...
中英双语介绍四大会计师事务所(Big Four accounting firms)
中文版 “四大会计师事务所”(Big Four accounting firms)是全球最具影响力和规模最大的四家专业服务公司,它们在审计、税务、咨询和财务咨询等领域占据着主导地位。这四家公司分别是普华永道(PwC)、德勤(…...
ubuntu 查看联网配置
在Ubuntu中,你可以使用多种命令来查看联网配置。以下是一些常用的方法和命令: 查看网络接口配置: 使用 ip 命令可以查看网络接口的配置信息,包括IP地址、子网掩码等。 ip addr show或者,你也可以使用传统的 ifconfig 命…...
【数据分享】全国乡村旅游重点镇(乡)数据(Excel/Shp格式/免费获取)
之前我们分享过从我国文化和旅游部官网整理的2018-2023年我国50个重点旅游城市星级饭店季度经营状况数据(可查看之前发布的文章)!文化和旅游部官网上也分享有很多与旅游相关的常用数据,我们基于官网发布的名单文件整理得到全国乡村…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
