Documentation of all notable changes to the evmone project.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.10.0 — 2023-05-08
The highlights of this release are support for Shanghai execution specification upgrade and implementation of EOF "v1.0". There are also big enhancements to the EVM testing tools and infrastructure. In particular, we added the t8n command-line utility.
As it is tradition, the EVM performance has been improved as well. Comparing with the previous release using the "main" benchmark suite, the Baseline interpreter is now:
- 10–45% (mean 25%) faster for GCC builds,
- 0–19% (mean 11%) faster for Clang builds.
- Shanghai support:
- EVM Object Format "EOF v1.0":
- The implementation of the revisions of EIP-3540, EIP-3670, EIP-4200, EIP-4750 and EIP-5450 originally proposed for Shanghai. #563 #572 #594 #508
- EOF is currently enabled in the Cancun revision but likely to be moved to Prague in the future. #561
- Added
evmone-eofparse
andevmone-eofparsefuzz
tools for testing EOF validation. #568
- Implemented EIP-663: Unlimited SWAP and DUP instructions (enabled in EOF). #529
- Added implementation of
evmc::Host
, state transition and block finalization for testing purposes. #484 #519 #575 #608 #609 - Added t8n tool
evmone-t8n
— a command line utility for transaction execution and state transition testing. It allows executing and generating tests with cooperation of retesteth or execution-spec-tests. #552 #555 #558 #569 #583 #590 #591 #604 #606 #607 #612 - Added partial support for EVM Precompiles — gas cost computation and execution via JSON stub file. #524
- Declarative state transition unit test suite. #589
- CMake option
EVMONE_X86_64_ARCH_LEVEL
to set the x86-64 microarchitecture level. On Linux and Windows this is set to x86-64-v2 by default. #548
- C++20 is now required to build evmone. #502
- Minimal tested/supported compilers versions:
#535
- GCC 11
- Clang 13
- XCode 13.4
- Visual Studio 2022
- CMake 3.16
- EVMC has been upgraded to version 10.1.0. #623
- intx has been upgraded to version 0.10.0. #622
- ethash has been upgraded to version 1.0.0. #540
- Ethereum Execution Tests has been upgraded to version 12.2. #625
- Baseline interpreter optimizations:
- Changes to EVM tracing:
- Improvements to the JSON State Test execution tool
evmone-statetest
: - Benchmarks (invocable by
evmone-bench
) have been migrated to external evm-benchmarks which use JSON State Test format. #513 #530 - Removed dependency on
evmc::instructions
. #533 #534 #537
0.9.1 — 2022-09-07
- Resetting gas refund counter when execution state is reused. #504
0.9.0 — 2022-08-30
In this release we have been focused on improving performance of the Baseline interpreter. The end result is that the Baseline is 26% faster than in previous version 0.8.0 and 18% faster than the current Advanced interpreter while having over 8x smaller code analysis cost. The Baseline is now the default interpreter because it is simpler and has become better than the Advanced.
The Advanced also has got 4% faster than in the previous version.
All numbers are from running the "main" benchmark suite on 4.0 GHz Intel Haswell CPU, using the Clang 15 compiler.
Moreover, evmone now calculates gas refund and reports it back using EVMC 10 API.
Finally, the options O=2
and O=0
have been replaced by advanced
. See below for details.
- Calculation of EVM gas refunds. #493
PUSH0
instruction implementation (EIP-3855), enabled in Shanghai. #448 #432- Experimental EOF validation and execution (EIP-3540), enabled in Shanghai. #334 #366 #471
- In progress State Transition execution tool for testing purposes. So far we've merged:
- EVMC options
O=0
(use Baseline) andO=2
(use Advanced) have been replaced with single optionadvanced
to use the non-default Advanced interpreter. #500 - Baseline has replaced Advanced as the default interpreter. The later can still be selected
with the
advanced
option. Reasons are explained in the introduction. #500 - A lot of changes related to the optimization of the Baseline interpreter, including refactoring and optimization of instructions' implementations.
- The Baseline interpreter now uses "computed goto" dispatch if supported by C++ compiler.
The "switch" dispatch can be forced with the
cgoto=no
option. #495 - Improvements to basic block metadata placement in the Advanced interpreter. #457 #474
- EVMC has been upgraded to version 10.0.0. #499
- intx has been upgrade to version 0.8.0. #446
evmone-fuzzer
has removed aleth-interpreter as it is not maintained and lacks the latest EVM features. #453
0.8.2 — 2021-08-26
0.8.1 — 2021-08-03
- baseline: Fix incorrect exit after invalid jump. #370
0.8.0 — 2021-07-01
- Full support for London EVM revision:
- Instruction tracing (EIP-3155) can be enabled via
trace
option in Baseline. #325 - Summary of number of executed opcodes is reported if
histogram
option is enabled in Baseline. #323 - The
evmone-bench
now reports time of execution without code analysis under "execute" label. The EVMC-like analysis + execution invocation is reported as "total". #343 - The
evmone-bench
has started utilizingevmc::MockedHost
which allows using state-access (e.g.SLOAD
/SSTORE
) instructions in benchmarks. #319
- Improvements to semi-public
evmone::baseline
API. #314 - The intx has been upgraded to version 0.6.0
which increases performance of
ADDMOD
instruction. #345 - The ethash has been upgraded to version 0.7.0
which provides faster
KECCAK256
implementation. #332 - Optimizations in Baseline interpreter. #315 #341 #344
- The Ethereum Execution Tests upgraded to version 9.0.2. #349
0.7.0 — 2021-04-27
- EVMC has been upgraded to version 8.0.0. This ABI breaking change has been required to support Berlin revision. #309
- Optimizations to basic
JUMPDEST
analysis used by Baseline interpreter. #306 #308 - The Baseline interpreter API has been modified to allow caching
of the
JUMPDEST
analysis. #305 - The consensus testing is now driven by Silkworm as a replacement of the unmaintained Aleth. The Ethereum Execution Tests 8.0.4 are currently being used.
0.6.0 — 2021-04-07
- New experimental Baseline interpreter has been added to the project.
It provides relatively straight-forward EVM implementation and
can be enabled with
O=0
option. #261 #280 - A set of EVM synthetic benchmarks stressing individual low-level EVM instructions. #278
- Silkworm-driven integration and Ethereum consensus testing. #290
- EVMC upgraded to version 7.5.0. #294
evmone-bench
tool under-the-hood improvements. #286 #287 #288- A lot of instructions implementation refactoring to allow code sharing between Baseline and Advanced interpreters.
0.5.0 — 2020-06-24
- intx upgraded to version 0.5.0, small performance increase for
ADDMOD
andMULMOD
instructions expected. #239 - EVMC upgraded to version 7.4.0. #243
- C++ exception handling and Run-Time Type Information (RTTI) have been disabled for the evmone library (in GCC and Clang compilers). #244
0.4.1 — 2020-04-01
- The release binaries for Windows are now built without AVX instruction set enabled. That was never intended and is consistent with binaries for other operating systems. #230
0.4.0 — 2019-12-09
- In previous versions evmone incorrectly assumed that code size cannot exceed 24576 bytes (0x6000) — the limit introduced for the size of newly deployed contracts by EIP-170 in Spurious Dragon. The limit do not apply to contract creating init code (i.e. in context of "create" transaction or CREATE instruction). Therefore, the pre-processing phase in evmone has been reworked to raise the technical limits or eliminated them entirely. From now on, only blocks of instruction with total base gas cost exceeding 4294967295 (2³² - 1) combined with execution gas limit also above this value can cause issues. #217 #218 #219 #221
0.3.0 — 2019-11-14
This release of evmone adds changes for Istanbul EVM revision.
- Istanbul EVM revision support with new costs for some instructions (EIP-1884). #191
- Implementation of CHAINID instruction from the Istanbul EVM revision (EIP-1344). #190
- Implementation of SELFBALANCE instruction from the Istanbul EVM revision (EIP-1884). #24
- Implementation of new cost model for SSTORE from the Istanbul EVM revision (EIP-2200). #142
0.2.0 — 2019-09-24
This release of evmone is binary compatible with 0.1 and delivers big performance improvements – both code preprocessing and execution is ~66% faster (needs ~40% less time).
- evm-test – the testing tool for EVMC-compatible EVM implementations. #85
- evmone-fuzzer – the testing tool that fuzzes evmone execution against aleth-interpreter execution. Any other EVMC-compatible EVM implementation can be added easily. #162 #184
- evmone-standalone – single static library that bundles evmone with all its static library dependencies (available on Linux, but support can be extended to other platforms). #95
- The evmone-bench tool has learned how to benchmark external EVMC-compatible EVMs. #111
- The evmone-bench tool sorts test cases by file names and allows organizing them in subfolders. #150
- The docker image ethereum/evmone with evmone and modified geth is available on Docker Hub. #127
- Instead of checking basic block preconditions (base gas cost, stack requirements) in the dispatch loop, this is now done in the special "BEGINBLOCK" instruction — execution time reduction -2–8%. #74
- New EVM stack implementation has replaced naïve usage of
std::vector<intx::uint256>
— -8–16%. #79 - Improvements to interpreter's dispatch loop — -4–9%. #107
- Optimization of the JUMPDEST map — up to -34%. #80
- Optimizations to code preprocessing / analysis. #121 #125 #153 #168 #178
- Push instructions with values up to 8 bytes (PUSH1–PUSH8) are now handled much more efficiently — up to -9%. #122
- Pointer to next instruction is now obtained in instruction implementations (instead of the dispatch loop) and is kept in CPU registers only — -3–7%. #133
- The run-time information about basic blocks has been compressed. #139 #144
- The DUP, SWAP, LOG and CALL instructions are now implemented by individual functions (template instances) instead of a parametrized function handling each family of instructions. #126 #159
- EVMC upgraded to version 6.3.1. #129 #77 #96
- intx upgraded to version 0.4.0. #131
- The ability to provide custom opcode table for code preprocessing has been dropped. #167
- The gas calculation for blocks containing an undefined instruction has been fixed. This bug could not cause consensus issue because a block with an undefined instruction terminates with an exception despite incorrect gas checking. However, execution might have ended with a confusing error code. #93
- Fix for LOG being emitted after out-of-gas exception. #120
0.1.1 — 2019-09-11
- EVMC upgraded to version 6.3.1 (still ABI-compatible with evmone 0.1.0). #171
- Changes to the evmone-bench tool backported from 0.2. This allows better performance comparison between 0.1 and 0.2 as both versions can run the same set of benchmarks. #172
0.1.0 — 2019-06-19
The first release of the evmone project. It delivers fully-compatible and high-speed EVM implementation.
- Support for all current EVM revisions up to Petersburg.
- Exposes EVMC 6 ABI.
- The intx 0.2.0 library is used for 256-bit precision arithmetic.