MCPcopy Index your code
hub / github.com/citahub/cita-vm

github.com/citahub/cita-vm @v0.5.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.5.0 ↗ · + Follow
330 symbols 1,019 edges 31 files 88 documented · 27%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

cita-vm

Build Status

Fast EVM implementation for CITA. Tuned for high performance, up to 5x faster than parity. Based entirely on the Ethereum Yellow Paper(Version: 2d0661f 2018-11-08).

[dependencies]
cita-vm = "0.3.3"

Example

Let us begin with the most basic example. First, we initialize a database in memory:

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

And, wrap this db as a WorldState

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

Create some accounts in WorldState, one of them stores the SimpleStorage code.

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![],
);

Send a transaction to call 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();

Send a transaction to call 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

Full code could be found here. You could run it by

$ cargo run --example simplestorage

Performance comparison with parity and geth

In short, cita-vm is the fastest EVM. Below are benchmark results on Intel(R) Xeon(R) CPU E5-26xx v3.

img

img

Tests

$ make testdata
$ cargo test

Licences

Apache License 2.0

Extension points exported contracts — how you extend this code

PrecompiledContract (Interface)
Implementation of a pre-compiled contract. [8 implementers]
src/native.rs
BlockDataProvider (Interface)
BlockDataProvider provides functions to get block's hash from chain. Block data(only hash) are required to cita-vm from [1 …
src/executive.rs
StateObjectInfo (Interface)
(no doc) [1 implementers]
src/state/state.rs
DataProvider (Interface)
(no doc) [1 implementers]
src/evm/ext.rs

Core symbols most depended-on inside this repo

pop
called by 110
src/evm/stack.rs
push
called by 82
src/evm/stack.rs
back
called by 43
src/evm/stack.rs
len
called by 41
src/evm/stack.rs
use_gas
called by 34
src/evm/interpreter.rs
get
called by 29
src/evm/memory.rs
new_contract
called by 26
src/state/state.rs
commit
called by 21
src/state/state.rs

Shape

Method 161
Function 112
Class 44
Enum 9
Interface 4

Languages

Rust100%

Modules by API surface

src/state/state.rs58 symbols
src/executive.rs46 symbols
src/state/account.rs37 symbols
src/evm/interpreter.rs31 symbols
src/evm/stack.rs21 symbols
src/evm/extmock.rs19 symbols
src/native.rs15 symbols
src/state/account_db.rs11 symbols
src/json_tests/general_state_test.rs11 symbols
src/evm/common.rs11 symbols
src/json_tests/vm_test.rs10 symbols
src/evm/opcodes.rs9 symbols

For agents

$ claude mcp add cita-vm \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page