Fast Ethereum Virtual Machine implementation
evmone is a C++ implementation of the Ethereum Virtual Machine (EVM). Created by members of the Ipsilon (ex-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.
KECCAK256
instruction.advanced
option)JUMPDEST
analysis.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=./libevmone.so
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:
cmake -S . -B build -DEVMONE_TESTING=ON
cmake -S . -B build -DEVMONE_TESTING=ON -G "Visual Studio 16 2019" -A x64
Build:
cmake --build build --parallel
Run the unit tests or benchmarking tool:
build/bin/evmone-unittests
build/bin/evmone-bench test/evm-benchmarks/benchmarks
Ethereum Precompiled Contracts (precompiles for short) are only partly supported by evmone.
However, there are options to enable limited precompiles support for testing.
EVMONE_PRECOMPILES_SILKPRE=1
enables building of
the silkpre third party library with the implementation of the precompiles.
This library also requires GMP (e.g. libgmp-dev) library for building and execution.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 ./evmone.so
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
evmone supports EOFv1. Since EOF validation is done once during deploy-time, evmone does not revalidate during execution of bytecode. To force EOF revalidation, you can use the validate_eof
option, example:
evmc run --vm libevmone.so,validate_eof --rev 14 "EF00"
Paweł Bylica @chfast
Licensed under the Apache License, Version 2.0.