SputnikVM: Rust Ethereum Virtual Machine Implementation
|evm||Core library for the Ethereum Virtual Machine|
|evm-stateful||Merkle Trie stateful wrapper for SputnikVM|
- Partially verified (WIP) - use various verification techniques to partially verify the correctness of functions.
- Nightly - take advantage of Rust nightly features, such as compiler plugins
- Standalone - can be launched as an independent process or integrated into other apps
- Universal - supports different Ethereum chains, such as ETC, ETH or private ones
- Stateless - only an execution environment connected to independent State storage
- Fast - main focus is on performance
- IoT compatible - designed to support hardware used in embedded devices
- written in Rust, can be used as a binary, cargo crate or shared library
- Foundation (evm-network-foundation)
- Classic (evm-network-classic)
- Ellaism (evm-network-ellaism)
- Expanse (evm-network-expanse)
- Musicoin (evm-network-musicoin)
- Ubiq (evm-network-ubiq)
- All of the above and other networks (evm-network-dynamic)
The core library has the initial four precompiled contracts embedded. To use the bn128 and modexp precompiled contracts introduced by the Byzantium hard fork, pull the following crates.
|evm-precompiled-bn128||bn128 precompiled contracts|
|evm-precompiled-modexp||modexp precompiled contracts|
- ethereum-rs - common traits and structs for Ethereum.
- etclient - bare-minimal Ethereum client written in Rust.
- SputnikVM FFI - SputnikVM C and Go FFI bindings
- SputnikVM Dev - SputnikVM instance for Smart Contract development, provides testing environment and mock for JSON RPC API
- SputnikVM in Browser - experimental version of SputnikVM compiled into WebAssembly, therefore can be launched in a browser on Node.js
- SputnikVM for embedded devices - experimental project to run on full functional EVM on embedded devices
Ensure you have at least
rustc 1.33.0 (2aa4c46cf 2019-02-28). Rust 1.32.0 and
before is not supported.
Build from sources
SputnikVM is written Rust. If you are not familiar with Rust please see the getting started guide.
To start working with SputnikVM you'll need to install rustup, then you can do:
$ git clone firstname.lastname@example.org:ethereumproject/evm-rs.git $ cd evm-rs $ cargo build --release --all
We currently use two ways to test SputnikVM and ensure its execution aligns with other Ethereum Virtual Machine implementations:
- jsontests: This uses part of the Ethereum tests. Those tests currently do not have good coverage for system operation opcodes. Besides, some tests are incorrect so they are disabled.
- regtests: A complete regression tests is done on the Ethereum Classic mainnet from genesis block to block 4 million. Some of the previously failed tests are also integrated into Rust's test system.
To run all tests, execute the following command in the cloned repository:
$ cargo test --all