16 个不稳定版本 (4 个重大更改)

0.5.0 2024年4月7日
0.4.2 2023年10月26日
0.3.4 2022年12月16日
0.3.2 2022年7月29日
0.1.6 2019年6月4日

#4#cita

Download history 10/week @ 2024-04-23 39/week @ 2024-07-23 23/week @ 2024-07-30

每月 62 次下载

Apache-2.0

260KB
6K SLoC

cita-vm

Build Status

为 CITA 提供的快速 EVM 实现。针对高性能优化,比 parity 快 5 倍。完全基于 以太坊黄皮书(版本:2d0661f 2018-11-08)

[dependencies]
cita-vm = "0.3.3"

示例

让我们从一个最基础的例子开始。首先,我们在内存中初始化一个数据库

let db = Arc::new(cita_vm::state::MemoryDB::new(false));

然后,将这个 db 包装成 WorldState

let mut state = cita_vm::state::State::new(db).unwrap();

WorldState 中创建一些账户,其中一个存储了 SimpleStorage 代码。

let code = "6080604052600436106049576000357c0100000000000000000000000000000\
            000000000000000000000000000900463ffffffff16806360fe47b114604e57\
            80636d4ce63c146078575b600080fd5b348015605957600080fd5b506076600\
            4803603810190808035906020019092919050505060a0565b005b3480156083\
            57600080fd5b50608a60aa565b6040518082815260200191505060405180910\
            390f35b8060008190555050565b600080549050905600a165627a7a72305820\
            99c66a25d59f0aa78f7ebc40748fa1d1fbc335d8d780f284841b30e0365acd9\
            60029";
state.new_contract(
    &Address::from_str("0xBd770416a3345F91E4B34576cb804a576fa48EB1").unwrap(),
    U256::from(10),
    U256::from(1),
    hex::decode(code).unwrap(),
);
state.new_contract(
    &Address::from_str("0x1000000000000000000000000000000000000000").unwrap(),
    U256::from(1000000000000000u64),
    U256::from(1),
    vec![],
);

发送一个调用 SimpleStorage.set(42) 的交易

let block_data_provider: Arc<cita_vm::BlockDataProvider> =
        Arc::new(cita_vm::BlockDataProviderMock::default());
let state_data_provider = Arc::new(RefCell::new(state));
let context = cita_vm::evm::Context::default();
let config = cita_vm::Config {
    block_gas_limit: 8000000,
};

let tx = cita_vm::Transaction {
    from: Address::from_str("0x1000000000000000000000000000000000000000").unwrap(),
    to: Some(Address::from("0xBd770416a3345F91E4B34576cb804a576fa48EB1")),
    value: U256::from(0),
    nonce: U256::from(1),
    gas_limit: 80000,
    gas_price: U256::from(1),
    input: hex::decode(
        "60fe47b1000000000000000000000000000000000000000000000000000000000000002a",
    )
    .unwrap(),
};
let r = cita_vm::exec(
    block_data_provider.clone(),
    state_data_provider.clone(),
    context.clone(),
    config.clone(),
    tx,
)
.unwrap();

发送一个调用 SimpleStorage.get() 的交易

let tx = cita_vm::Transaction {
    from: Address::from_str("0x1000000000000000000000000000000000000000").unwrap(),
    to: Some(Address::from_str("0xBd770416a3345F91E4B34576cb804a576fa48EB1").unwrap()),
    value: U256::from(0),
    nonce: U256::from(2),
    gas_limit: 80000,
    gas_price: U256::from(1),
    input: hex::decode("6d4ce63c").unwrap(),
};
let r = cita_vm::exec(
    block_data_provider.clone(),
    state_data_provider.clone(),
    context.clone(),
    config.clone(),
    tx,
)
.unwrap();
println!("return={:?}", r); // 42 is outputed

完整代码可以在 这里 找到。您可以通过以下方式运行它

$ cargo run --example simplestorage

与 parity 和 geth 的性能比较

简而言之,cita-vm 是最快的 EVM。以下是在 Intel(R) Xeon(R) CPU E5-26xx v3 上的基准测试结果。

img

img

测试

$ make testdata
$ cargo test

许可

Apache License 2.0

依赖

~9–17MB
~203K SLoC