Documentation of all notable changes to the EVMC project.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
10.1.0 — 2023-04-22
- The Prague EVM revision (anticipated after Cancun) #683
- C++: Make
evmc::Result
accessible viaevmc_result
reference #686
- Set Shanghai as the latest stable revision
EVMC_LATEST_STABLE_REVISION
. #687 - Bump minimum supported compiler versions:
#685
- GCC: 7 → 8
- Clang: 5 → 9
- CMake: 3.10 → 3.16
10.0.0 — 2022-08-25
- Information about
PUSH0
instruction from EIP-3855 for Shanghai revision. #628 - The Paris (aka The Merge) EVM revision. #627 #634
- The Cancun EVM revision (anticipated after Shanghai) #633
- The gas refund counter has been added to the
evmc_result
. #666 - The error code
EVMC_LOADER_UNSPECIFIED_ERROR
has been defined to provide a convenient way of initializingevmc_loader_error_code
objects. #617 - Support for Visual Studio 2022. #619
- C++ types
evmc::address
andevmc::bytes32
are convertible tostd::basic_string_view<uint8_t>
. #636 - Convenient constructors for C++
evmc::result
. #660 - Rust: The
EvmcVm::set_option
has been added. #614
- The
code_address
field has been added to theevmc_message
type. It represents the address of an account from which the code is being executed and is useful forDELEGATECALL
implementations. #611 #615 - The
evmc_message::destination
field has been renamed toevmc_message::recipient
to clarify its purpose and match the naming from the Yellow Paper. #616 - The
evmc_storage_status
has been extended to provide information about every possible case of storage net gas metering (EIP-2200). #661 - The
selfdestruct
method returns the information if the given address has not been registered as selfdestructed yet. #662 - C++: The
evmc::result
has been renamed toevmc::Result
for consistency with C++ types of similar kind. #665 - C++: The
HostContext
does not cache transaction context (evmc_tx_context
) anymore. #631 - Go: The
create2Salt
parameter has been removed from theVM.Execute()
. #612 - Code quality improvements. #618 #620 #621 #632
- According to EIP-4399,
block_difficulty
field was renamed toblock_prev_randao
, andDIFFICULTY
opcode toPREVRANDAO
. #635 - The
evmc::hex
support C++ library has been refactored and converted to a single-header library. #643 #648 #649 #654 - For command-line tools to load input/code from a file the
@file
syntax must be used. E.g.evmc run @contract.evm --input @data.in
. #647 - Improvements to the
evmc::MockedHost
testing utility around account storage and selfdestructs. #661 #662 #670
- Java bindings fixes. #653
- The support for C++
0_address
and0_bytes32
literals has been removed. #652
9.0.0 — 2021-06-30
-
Support for London EIP-3198:
block_base_fee
member added toevmc_tx_context
,BASEFEE
instruction added. #603 -
Added Shanghai EVM revision. #604
-
Added
EVMC_LATEST_STABLE_REVISON
: alias for the latest known EVM revision with finalized specification. #605 -
The
--bench
flag has been added toevmc run
to more precisely measure execution time. #598 -
Output stream operators and
to_string()
overloads for EVMC typesevmc_revision
andevmc_status_code
are now part of public C and C++ API. #599
- Adjustments to
evmc::mocked_host
: storage changes to non-existent keys are now preserved. #594
8.0.0 — 2021-04-27
- Support for Berlin EIP-2929:
access_account()
andaccess_storage()
functions added toevmc_host_interface
. #571
- Instruction
SHA3
has been renamed toKECCAK256
as proposed by EIP-1803 to better match the underlying hash function. #590 - The C++ standard required has been increased to C++17. The minimal officially supported Clang version has been increased from 3.8 to 5. #584
7.5.0 — 2021-03-23
- New option
--input
forevmc run
tool to specify execution input data (calldata). #564 - New option
--create
forevmc run
tool to create new contract with provided init code before main execution. This allows using Solidity compiler binary outputs directly by the tool. #566solc --bin Contract.sol -o . evmc run --create Contract.bin --input 370158ea
evmc run
tool accepts both hex-strings or file paths forcode
and--input
arguments. #574- New static C++ library
evmc::hex
added with procedures for hex encoding/decoding. Hex-strings are used by EVMC and related projects for internal testing. #575 - New
EVMC_INSUFFICIENT_BALANCE
error code has been registered. #528
- Java bindings fixes and improvements. It must be noted the bindings are in a work in progress state and are not suggested for production use. #535 #537 #541 #545 #549 #550 #551 #552 #553 #557 #579 #580 #581
- C++'s
std::hash
and comparison operators for EVMC types has been optimized. #560 #561 evmc --version
now also informs about the version of the loaded EVM. #567- The Example VM (
evmc::example-vm
) has been converted from C to C++. It now implements a subset of real EVM opcodes so examples and tests can use valid EVM bytecodes. #539
7.4.0 — 2020-06-24
- The C++ standard required has been increased to C++14. #521
- The C++ literals for
address
andbytes32
types have been reimplemented to usestatic_assert
to report errors. This makes C++ bindings exception-free (no-throw guarantee level of exception safety). #520
- The support for Visual Studio 2015 C/C++ compiler has been dropped as a consequence of requiring C++14. #521
7.3.0 — 2020-05-20
- Support for Go modules. #486
- The minimum Go version supported bumped to 1.11 (Go modules are required). #486
- Removed dependency on go-ethereum in Go bindings by introducing own
Address
andHash
types. #513
7.2.0 — 2020-05-13
- Added Java bindings. #455 #490 #503 #512
- New evmc command-line tool has been added. At the moment it supports
command run for executing bytecode in any EVMC-compatible VM implementation.
Try
evmc run --help
for more information. - C++: EVMC basic types
address
andbytes32
have all the comparison operators supported. #474 - C++: Convenient constructors from
uint64_t
added for basic typesaddress
andbytes32
. #488 - C++: Added
VM::get_raw_pointer()
method to directly access VM C API when needed. #492
- The implementation of C++
operator<
forevmc::address
andevmc::bytes32
has been fixed. #498
7.1.0 — 2019-11-29
- Added
MockedHost
C++ class (in form of header-onlyevmc::mocked_host
library) which can be used to emulate Host behavior when testing VM implementations. #456 - In the Rust bindings added more type aliases (
MessageKind
,MessageFlags
,StatusCode
,StorageStatus
,Revision
). #206 - In CMake the
evmc::evmc_cpp
target has been added which represents the C++ EVMC API. #470
- Require Rust 1.37.0 as a minimum.
- In the Rust bindings mark read-only functions in
ExecutionContext
as non-mutating. #444 - In the C++
HostInterface
the logically read-only methods are marked withconst
. #461 - Updated dependencies of the Rust bindings to latest stable versions. #462
7.0.0 „Istanbul Ready” — 2019-11-11
This version of EVMC delivers compatibility with Istanbul EVM revision. The ABI breaking change has been required in this case so some other backward-incompatible changes are also included and deprecated APIs have been removed.
- Support for Istanbul EIP-1344 (CHAINID opcode).
chain_id
added toevmc_tx_context
struct. #375 - Support for Istanbul EIP-1884 (Repricing for trie-size-dependent opcodes). #372
- The Berlin EVM revision number has been added. #407
- In C++ API, an overload for
VM::execute()
has been added that omits the Host context and interface parameters. This is useful for Precompiles VMs that do not interact with the Host. #302 - In C++ API, the
VM::has_capability()
method has been added. #465
- The
evmc_instance
renamed toevmc_vm
. #430 - The
evmc_context
renamed toevmc_host_context
. #426 - The
evmc_host_interface
is now separated fromevmc_host_context
. This simplifies language bindings which implement theevmc_host_interface
. #427 - The
evmc::vm
renamed toevmc::VM
in C++ API. #252 - Previously deprecated
helpers.hpp
header file has been removed. #410 - Previously deprecated
EVMC_CONSTANTINOPLE2
andEVMC_LATEST_REVISION
revisions have been removed. #411 - Previously deprecated tracing API has been removed. #429
- In
evmc::instructions
library the undefined instructions have0
gas cost instead of previous-1
value. #425 - The EVM instruction tables have been redesigned to be more useful. #435
- The EVMC loader trims all extensions (previously only the last one) from the EVMC module file name. #439
- The EVMC loader no longer ties to guess the VM create function name by dropping prefix words from the name. #440
- The helper function
evmc_is_abi_compatible()
returns nowbool
instead ofint
. #442 - In the Rust bindings make
ExecutionContext
optional withinexecute
. #350 - A set of small improvements to C++ API. #445 #449 #451
6.3.1 - 2019-08-19
- Added
LoadAndConfigure
method to the Go API. #404
- Previously deprecated
is_zero()
helper has been removed, but replaced with newevmc::is_zero()
in API compatible way. #406
- In C++ API the
get_balance()
method now returns expectedevmc::uint256be
instead ofevmc_uint256be
. #403 - Cable upgraded to 0.4.4 to fix incompatibility with older versions. #405
6.3.0 - 2019-08-12
- Experimental support for Precompiles - EVMC modules containing implementations of Ethereum precompiled contracts. To learn more read the EVMC Precompiles feature description. #267
- The
vm::get_capabilities()
method has been added in C++ API. #301 - A CMake helper for running evmc-vmtester. #303
- The loader module introduces standardized EVMC module configuration string
which contains path to the module and additional options.
E.g.
./modules/vm.so,engine=compiler,trace,verbosity=2
. A VM can be loaded, created and configured atomically with newevmc_load_and_configure()
function. #313 - Full support for 32-bit architectures has been added. #327
- The C/C++ API for creating execution results in VMs has been extended to handle common usage cases. #333
- Support for moving
evmc::vm
objects in C++ API. #341 - The basic types
address
andbytes32
have received their C++ wrappers to assure they are always initialized. They also have convenient overloaded operators for comparison and usage as keys in standard containers. #357 - The C++ EVMC basic types
address
andbytes32
have user defined literals. #359auto a = 0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359_address; auto b = 0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3_bytes32;
- CMake option
EVMC_INSTALL
(ON
by default) to disable installing EVMC targets. This may be useful when EVMC is included in other project as git submodule or subtree. #360 - The
evmc-vmtester
tool received support for EVMC module configuration. E.g.evmc-vmtester ./my_vm,mode=interpreter
. #366 - In
evmc-vm
Rust crate,ExecutionResult
now hassuccess
,failure
andrevert
helpers. #297 #368 - Introduction of
evmc-declare
Rust crate with a procedural macro for easy VM declaration. #262 #316 - Introduction of
ExecutionMessage
wrapper in theevmc-vm
Rust crate. #324 - Added type aliases and traits on basic types in the
evmc-vm
Rust crate. #342 #343
- A lot of documentation fixes, improvements and cleanups. #271 #272 #276 #280 #345
- In C++ API
evmc::result::raw()
renamed toevmc::result::release_raw()
. #293 - In
evmc_load_and_create()
theerror_code
is optional (can beNULL
). #311
- The usage of
evmc/helpers.hpp
has been deprecated. Useevmc/evmc.hpp
which provides the same features. #358 - The tracing API has been deprecated as there have been some design flaws discovered. New API is expected to be introduced in future. #376
- The
vmtester
tool now builds with MSVC with/std:c++17
. #261 #263 - The
evmc_release_result()
helper has been fixed. #266 #279 - The missing include guard in
evmc.hpp
has been fixed. #300 - A loaded VM with incompatible ABI version is now properly destroyed. #305 #306
6.2.2 - 2019-05-16
- Compilation error of
evmc::result::raw()
in Visual Studio fixed. #281 - The
evmc::result
's move assignment operator fixed. #282
6.2.1 - 2019-04-29
- Disallow implicit conversion from C++
evmc::result
toevmc_result
causing unintendent premature releasing of resources. #256 #257
6.2.0 - 2019-04-25
- CMake option
EVMC_TEST_TOOLS
to build evmc-vmtester without bothering with internal unit tests. #216 - The full C++ EVMC API for both VM and Host implementations. #217 #226
- Initial and rough bindings for Rust. It is possible to implement an EVMC VM in Rust utilising some helpers. #201 #202 #233
- Handling of DLL loading errors greatly improved by
new
evmc_last_error_msg()
function. #230 #232
- The minimum supported GCC version is 6 (bumped from undocumented version 4.8). #195
- Go bindings improved by introduction of the
TxContext
struct. #197 - A lot improvements to the
evmc-vmtester
tool. #221 #234 #238 #241 #242 - Cable upgraded to version 0.2.17. #251
- The
EVMC_CONSTANTINOPLE2
revision name is deprecated, replaced withEVMC_PETERSBURG
. #196
6.1.1 - 2019-02-13
- Documentation of elements of
evmc_revision
. #192
- Fixed compilation with GCC 5 because of the "deprecated" attribute applied to an enum element. #190
6.1.0 - 2019-01-24
- The Istanbul EVM revision has been added. #174
- The
is_zero()
C++ helper for basic data types has been added. #182 - Reserved the post-Constantinople EVM revision number. #186
- The C++ wrappers for VM and execution result objects have been added. #187
- The
EVMC_LATEST_REVISION
name has been deprecated, replaced withEVMC_MAX_REVISION
. #184
6.0.2 - 2019-01-16
- Add missing salt argument for CREATE2 in Host in Go bindings. #179
6.0.1 - 2018-11-10
- Integration of EVMC as a CMake subproject is easier because
Hunter is not loaded unless building tests (
EVMC_TESTING=ON
) is requested. #169
6.0.0 - 2018-10-24
- EVMC Host implementation example. #116
- Support for Constantinople SSTORE net gas metering. #127
- Support for Constantinople CREATE2 salt in Go bindings. #133
- A VM can now report its capabilities (i.e. EVM and/or ewasm). #144
- Introduction of the
evmc_bytes32
type. #152 - EVMC Host implementation guide. #159
- EVMC VM implementation guide. #160
- EVMC loader symbol searching has been generalized. #119
- The
evmc_context_fn_table
renamed toevmc_host_interface
. #125 - The
evmc_message
fields reordered. #128 - The
evmc_set_option()
now returns more information about the failure cause. #136 - In C the
bool
type is used instead ofint
for true/false flags. #138 #140 - Simplification of signatures of Host methods. #154
5.2.0 - 2018-08-28
- Use also "evmc_create" function name for loading EVMC DLLs. #81
- The
evmc.h
header compatibility with C++98 fixed. #92 - Compilation and build configuration fixes. #93 #103
5.1.0 - 2018-08-23
- Documentation has been extended. #58
- Optional Result Storage helper module has been separated. #59
- Cable upgraded to 0.2.11. #75
- The license changed from MIT to Apache 2.0. #77
- Go bindings: Properly handle unknown error codes. #72
5.0.0 - 2018-08-10
- List of status codes extended and reordered. #23 #24
- VM Tracing API. #32
- The support library with metrics tables for EVM1 instructions. #33 #34
- Ability to create EVMC CMake package. #35
- The loader support library for VM dynamic loading. #40
- Constantinople: Support for
CREATE2
instruction. #45 - Constantinople: Support for
EXTCODEHASH
instruction. #49 - Constantinople: Storage status is reported back from
evmc_set_storage()
. #52