之前做过的一些部署移植的工作,基本都是用C++语言写的,在后来我学了一些Rust,并且慢慢熟悉了Rust的工具链,最近也在尝试部署一些Rust的开源项目到OpenEuler RISC-V操作系统上(我们团队叫OERV)。
REVM是一个用Rust编写的以太坊虚拟机(EVM)项目 ,其设计聚焦于速度与简单易用性。它具备快速且灵活的实现方式,提供简洁接口与嵌入式主机。通过高效执行环境和简洁设计,为开发者打造可靠且易上手的EVM实现。借助其特性,开发者能开展智能合约的开发与测试工作,比如可运用REVM运行以太坊状态测试,以此保障智能合约的准确性。同时,它还能与以太坊官方测试套件配合,验证EVM实现的正确性,也能和Truffle、Hardhat等智能合约开发框架集成,形成完备的开发测试环境 。并且,基于Rust的零成本抽象,REVM在实现高度可定制化的同时没有运行时开销,编译器确保生成的EVM既快速又类型安全,在编译时就能验证定制的有效性,消除了运行时检查,专注于高效的EVM执行 。
怎么使用?
以下是一个使用执行API的简单示例:它能让我们创建一个以太坊虚拟机(EVM)并执行交易。此外,该API还能用于借助检查器生成追踪信息,或者处理诸如Foundry作弊码这类更为复杂的示例。
let mut evm = Context::mainnet().with_block(block).build_mainnet();
let out = evm.transact(tx);
// or you can use powerful inspection tool to trace it
let mut evm = evm.with_inspector(tracer);
let out = evm.inspect_tx(tx);
怎么部署?
git clone https://github.com/bluealloy/revm.git
cd revm
cargo build --release
踩到了一个Rust的小坑,编译的时候出现了一个小错误。
大概原因就是,这里的OPCODE_INFO是用static声明的,但是static是程序运行期间才分配内存,而const是编译期就能确认其值,所以错误的原因就是const在使用的时候带上了static(一个需要编译期确认的表达式加上了static这种运行期产物)。
很直接的方法就是直接根据报错去改源码,只需要在crates/bytecode/src/opcode.rs当中找到OPCODE_INFO的声明,原本这里是static声明的,我改成了用const声明。改了之后,编译就成功了,REVM项目总算在OpenEuler RISC-V操作系统上部署成功了~
