#evm #ethereum #revm #virtual-machine

simular-core

与嵌入式以太坊虚拟机 (EVM) 交互的简单 API

4 个版本

0.2.5 2024年6月13日
0.2.4 2024年5月25日
0.2.3 2024年4月4日
0.2.2 2024年4月3日

#2484 in 魔力豆

Apache-2.0

83KB
1.5K SLoC

此库提供了一种简单的方法与嵌入式以太坊虚拟机 (EVM) 交互。

crates.io

[dependencies]
simular-core = "0.2.5"

支持

  • 内存数据库和从远程节点分叉状态的能力
  • 为以后使用而保存 EVM 状态的快照
  • 函数调用的原始编码/解码以及 alloy SolTypes
  • 从可读语法创建轻量级的 ABI

示例

创建并与 EVM 交互

  use simular_core::{BaseEvm, generate_random_addresses};
  use alloy_primitives::{Address, U256};

  // Generate some random addresses
  let addresses = generate_random_addresses(2);
  let bob = addresses[0];
  let alice = addresses[1];

  // create the EVM with in-memory database (default)
  let mut evm = BaseEvm::default();
  
  // create 2 accounts. Bob w/ 2 ether, alice w/ none
  evm.create_account(bob, Some(U256::from(2e18))).unwrap();
  evm.create_account(alice, None).unwrap();

  // check the balances
  assert!(evm.get_balance(bob).unwrap() == U256::from(2e18));
  assert!(evm.get_balance(alice).unwrap() == U256::from(0));

分叉远程合约

与远程合约交互会将远程合约的状态拉入本地内存数据库以供使用。

  use simular_core::{BaseEvm, generate_random_addresses, ContractAbi};
  use alloy_primitives::{Address, U256, address};
  
  // create ABI inline
  let abi = ContractAbi::from_human_readable(vec![
  "function totalSupply() (uint256)"
  ]);
 
  // create a fork using the latest block
  let fork_info = CreateFork.latest_block(URL OF JSON-RPC NODE);
  let mut evm = BaseEvm::new(Some(fork_info));

  // remote contract address.
  // using DAI: 0x6B175474E89094C44Da98b954EedeAC495271d0F
  let contract_address = address!("6B175474E89094C44Da98b954EedeAC495271d0F");
  
  // encode the function call
  let (encoded_total_supply, _, decoder) =
      abi.encode_function("totalSupply", "()").unwrap();

  // call the function on the remote contract
  let output = evm.transact_call(
      contract_address,
      encoded_total_supply,
      U256::from(0)).unwrap();

  // decode the result
  let value = decoder.unwrap().abi_decode(&output.result)
  
  println!("total supply: {:?}", value);

请参阅 uniswap 以了解使用分叉和快照在 Uniswap 上交易一对的示例。

运行示例

> cargo run --example uniswap

站在巨人的肩膀上...

感谢以下项目使这项工作成为可能!

依赖项

~34–54MB
~1M SLoC