Fast Ethereum Virtual Machine implementation
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Paweł Bylica 2c4b8ae390
evmone 0.5.0-dev
3 years ago
cmake cmake: Upgrade GTest to 1.8.1 4 years ago
docs article: Apply suggestions from review 4 years ago
evmc@1de783316a Upgrade EVMC to 7.1.0 4 years ago
include/evmone Update EVMC to master: pre EVMC v7 4 years ago
lib Refactor block_analysis::close() for readability 4 years ago
test utils: Document hex function in header 4 years ago
.bumpversion.cfg evmone 0.5.0-dev 3 years ago
.clang-format utils: Clean up includes 4 years ago
.dockerignore Add Dockerfile 4 years ago
.gitignore Start code analysis 4 years ago
.gitmodules cmake: Take intx from Hunter 4 years ago
AUTHORS Update copyright notice 4 years ago evmone 0.4.1 3 years ago
CMakeLists.txt evmone 0.5.0-dev 3 years ago
Dockerfile Update Dockerfile 4 years ago
LICENSE Start evmone project with README and LICENSE 5 years ago readme: Update note about docker 4 years ago
appveyor.yml ci: Store Windows package as AppVeyor artifact 3 years ago
circle.yml ci: Run State Tests 4 years ago
codealike.json bench: Avoid implicit conversions in internal benchmarks 4 years ago
codecov.yml ci: Fix codecov ignore pattern 4 years ago


ethereum badge readme style standard badge codecov badge circleci badge appveyor badge license badge

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

  1. Exposes the EVMC API.
  2. The indirect call threading is the dispatch method used - a loaded EVM program is a table with pointers to functions implementing virtual instructions.
  3. The gas cost and stack requirements of block of instructions is precomputed and applied once per block during execution.
  4. The intx library is used to provide 256-bit integer precision.
  5. The ethash library is used to provide Keccak hash function implementation needed for the special SHA3 instruction.
  6. Requires C++17 standard.


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.

geth --vm.evm=./

Building from source

To build the evmone EVMC module (shared library), test, and benchmark:

  1. Clone the repo and create a build directory:
git clone --recursive
cd evmone
mkdir build
cd build
  1. Build dependencies and (on Windows) generate a Visual Studio solution, then build the source:

Linux / OSX

cmake --build . -- -j


Note: >= Visual Studio 2017 is required since EVMOne makes heavy use of C++17

  • Visual Studio 2017: cmake .. -DEVMONE_TESTING=ON -G "Visual Studio 15 2017 Win64"
  • Visual Studio 2019: cmake .. -DEVMONE_TESTING=ON -G "Visual Studio 16 2019" -A x64
cmake --build .
  1. Run the unit tests or benchmarking tool:



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.

evm-test ./


Docker images with evmone are available on Docker Hub:

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


  1. Efficient gas calculation algorithm for EVM


Paweł Bylica @chfast


license badge

Licensed under the Apache License, Version 2.0.