Fast Ethereum Virtual Machine implementation
evmone is a C++ implementation of the Ethereum Virtual Machine (EVM). Created by members of the Ewasm team, the project aims for clean, standalone EVM implementation that can be imported as an execution module by Ethereum Client projects. The codebase of evmone is optimized to provide fast and efficient execution of EVM smart contracts.
Characteristic of evmone
- Exposes the EVMC API.
- Requires C++17 standard.
- The intx library is used to provide 256-bit integer precision.
- The ethash library is used to provide Keccak hash function implementation
needed for the special
- Contains two interpreters: Advanced (default) and Baseline (experimental).
- The indirect call threading is the dispatch method used - a loaded EVM program is a table with pointers to functions implementing virtual instructions.
- The gas cost and stack requirements of block of instructions is precomputed and applied once per block during execution.
- Performs extensive and expensive bytecode analysis before execution.
- Provides relatively straight-forward EVM implementation.
- Performs only minimalistic
- Experimental. Can be enabled with
O controls the "optimization level":
O=2uses Advanced interpreter (default),
O=0uses Baseline interpreter.
As geth plugin
evmone implements the EVMC API for Ethereum Virtual Machines. It can be used as a plugin replacing geth's internal EVM. But for that a modified version of geth is needed. The Ewasm's fork of go-ethereum provides binary releases of geth with EVMC support.
Next, download evmone from Releases.
Start the downloaded geth with
--vm.evm option pointing to the evmone shared library.
Building from source
To build the evmone EVMC module (shared library), test, and benchmark:
Fetch the source code:
git clone --recursive https://github.com/ethereum/evmone cd evmone
Configure the project build and dependencies:
Linux / OSX
cmake -S . -B build -DEVMONE_TESTING=ON
Note: >= Visual Studio 2019 is required since evmone makes heavy use of C++17
cmake -S . -B build -DEVMONE_TESTING=ON -G "Visual Studio 16 2019" -A x64
cmake --build build --parallel
Run the unit tests or benchmarking tool:
build/bin/evmone-unittests build/bin/evmone-bench test/benchmarks
The evm-test executes a collection of unit tests on any EVMC-compatible Ethereum Virtual Machine implementation. The collection of tests comes from the evmone project.
Docker images with evmone are available on Docker Hub: https://hub.docker.com/r/ethereum/evmone.
Having the evmone shared library inside a docker is not very useful on its own, but the image can be used as the base of another one or you can run benchmarks with it.
docker run --entrypoint evmone-bench ethereum/evmone /src/test/benchmarks
Paweł Bylica @chfast
Licensed under the Apache License, Version 2.0.