evmone 0.2.0
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).
Added
- 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
Changed
Optimizations
- 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
Other changes
- 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
Fixed
- 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