#virtual-machine #evm #emulator #bytecode #testing #testing-tools

bin+lib evm-rs-emulator

使用 Rust 编写的闪电般快速的内存中以太坊虚拟机 (EVM) 模拟器

5 个版本

0.1.4 2023 年 9 月 20 日
0.1.3 2023 年 9 月 20 日
0.1.2 2023 年 9 月 20 日
0.1.1 2023 年 9 月 19 日
0.1.0 2023 年 9 月 19 日

#1612 in 魔法豆

自定义许可

265KB
5K SLoC

EVM Rust 模拟器

EVM Rust 模拟器是一个简单的内存中以太坊虚拟机 (EVM) 模拟器,使用 Rust 编写。它被设计成一个轻量级且易于使用的工具,供开发者直接在命令行或 Rust crate 中测试 EVM 字节码执行,无需使用带有 RPC 的完整 EVM 节点与区块链交互。

Github action Test coverage


Rust crate

安装 crate

cargo add evm-rs-emulator

用法

use evm_rs_emulator::Runner;

fn main() {
  let caller = [
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0xc4, 0x11, 0xe8,
  ];
  let origin: Option<[u8; 20]> = None;
  let address: Option<[u8; 20]> = None
  let value: Option<[u8; 32]> = None;
  let data: Option<Vec<u8>> = None;
  let bytecode: Vec<u8> = vec![0x60, 0xff, 0x60, 0xff];
  
  // Create a new interpreter
  let mut runner =
      Runner::new(caller, origin, address, value, data, None);

  // Run all the bytecode
  let _ = interpreter.interpret(bytecode, Some(255), true);

  // Or run the bytecode OPCODE by OPCODE
  runner.bytecode = bytecode;
  runner.debug_level = Some(255);
  // Run the first 3 opcodes
  let _ = runner.interpret_op_code(runner.bytecode[runner.pc]);
  let _ = runner.interpret_op_code(runner.bytecode[runner.pc]);
  let _ = runner.interpret_op_code(runner.bytecode[runner.pc]);
}

🚧 警告 🚧

该项目目前处于实验性阶段,并可能频繁更改,因为我们仍在努力稳定 EVM 模拟。它尚未进行安全审计,因此不应在生产环境中使用。

缺少的功能(欢迎贡献 ❤️)

  • EVM 气费使用(见 此分支
  • EVM 气价(使用分叉显示交易价格)
  • EVM 气上限
  • 使用 RPC 模拟数据
    • 区块数据
    • 调用外部合约
  • 外部 crate 功能
    • 部署合约
    • 调用合约
    • 获取日志

贡献

欢迎贡献!如果您有改进此项目的途径,请随时打开一个问题或提交一个 pull request。

Github repo

要为 EVM Rust 模拟器做出贡献,您需要在您的系统上安装 Rust 和 Cargo。

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

安装这些工具后,您可以克隆项目。

git clone https://github.com/Yashiru/evm-rs-emulator.git

要运行测试,您可以使用以下命令。

cargo test

要运行覆盖率任务

cargo make cov

许可

底层源代码是免费且不受限制的软件,已发布到公有领域。有关更多信息,请参阅 LICENSE 文件。

依赖项

~30–47MB
~821K SLoC