Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion evmone/.bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 0.21.0
current_version = 0.23.0
tag = True
sign_tags = True
tag_message = evmone {new_version}
Expand Down
234 changes: 234 additions & 0 deletions evmone/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,224 @@ 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.23.0] — 2026-08-11

This release continues the implementation of the Amsterdam EVM revision
and reshapes the EVMC interface around it: the CREATE address is now computed
by the VM and unused parts of the API have been dropped.

### Added

- **Amsterdam EVM revision**: next set of EIPs.
- [EIP-7708]: ETH transfers emit a log.
[#1573](https://github.com/ipsilon/evmone/pull/1573)
- [EIP-7954]: Increase Maximum Contract Size — the code limit is raised
to 0x10000 ([EIP-170]) and the init code limit to 0x20000 ([EIP-3860]).
[#1575](https://github.com/ipsilon/evmone/pull/1575)
- [EIP-8246]: Remove SELFDESTRUCT Burn.
[#1572](https://github.com/ipsilon/evmone/pull/1572)
- **`get_nonce()` in the EVMC Host interface**, a live query needed by the VM
to compute the CREATE address.
[#1588](https://github.com/ipsilon/evmone/pull/1588)
- **Transaction decoding in the state library**: `state::decode_transaction()`,
the inverse of the RLP encoder for legacy and [EIP-2718] typed transactions.
[#1580](https://github.com/ipsilon/evmone/pull/1580)
[#1581](https://github.com/ipsilon/evmone/pull/1581)
- **Transaction sender recovery from the signature**, used by the state test
runner instead of the fixture's `sender` field.
[#1615](https://github.com/ipsilon/evmone/pull/1615)
- Non-malleable (strict) mode of the secp256k1 signature recovery, accepting
only `s` values from the lower half of the curve order ([EIP-2]).
[#1612](https://github.com/ipsilon/evmone/pull/1612)
- Test runners now check _why_ a transaction or block was rejected, not merely
that it was. Block-level reasons stay unchecked for legacy exception names,
blocks with ommers and unverified transaction signatures.
[#1621](https://github.com/ipsilon/evmone/pull/1621)
[#1623](https://github.com/ipsilon/evmone/pull/1623)
[#1624](https://github.com/ipsilon/evmone/pull/1624)
[#1632](https://github.com/ipsilon/evmone/pull/1632)

### Changed

- **EVMC ABI version bumped to 18** by the incompatible API changes below.
[#1587](https://github.com/ipsilon/evmone/pull/1587)
[#1588](https://github.com/ipsilon/evmone/pull/1588)
[#1589](https://github.com/ipsilon/evmone/pull/1589)
[#1593](https://github.com/ipsilon/evmone/pull/1593)
[#1596](https://github.com/ipsilon/evmone/pull/1596)
- **The CREATE address is computed by the VM**, not by the Host: the creating
frame derives it from the sender's nonce, warms it ([EIP-2929]) and passes it
down in `msg.recipient`. The [EIP-2681] nonce-overflow light failure moves
there too.
[#1589](https://github.com/ipsilon/evmone/pull/1589)
[#1590](https://github.com/ipsilon/evmone/pull/1590)
[#1591](https://github.com/ipsilon/evmone/pull/1591)
[#1592](https://github.com/ipsilon/evmone/pull/1592)
- The `evmc_access_status` enum has a `bool` underlying type.
[#1596](https://github.com/ipsilon/evmone/pull/1596)
- EVM revisions are identified by name rather than by number: `evmone run --rev`
takes a name and the `evmc_revision` enumerators lost their explicit values.
[#1586](https://github.com/ipsilon/evmone/pull/1586)
- **`modexp` windowed exponentiation**: the Montgomery path uses a sliding
window sized from the exponent's bit width, up to 1.5x faster.
[#1618](https://github.com/ipsilon/evmone/pull/1618)
[#1631](https://github.com/ipsilon/evmone/pull/1631)
- **State library performance**: warm storage accesses are no longer journaled,
the storage journal holds slot pointers instead of keys, the account-flag
entries are merged into one, `Account` is smaller and repeated account
lookups are gone.
[#1585](https://github.com/ipsilon/evmone/pull/1585)
[#1594](https://github.com/ipsilon/evmone/pull/1594)
[#1597](https://github.com/ipsilon/evmone/pull/1597)
[#1598](https://github.com/ipsilon/evmone/pull/1598)
[#1600](https://github.com/ipsilon/evmone/pull/1600)
[#1601](https://github.com/ipsilon/evmone/pull/1601)
[#1602](https://github.com/ipsilon/evmone/pull/1602)
[#1603](https://github.com/ipsilon/evmone/pull/1603)
[#1605](https://github.com/ipsilon/evmone/pull/1605)
[#1606](https://github.com/ipsilon/evmone/pull/1606)
[#1607](https://github.com/ipsilon/evmone/pull/1607)
[#1609](https://github.com/ipsilon/evmone/pull/1609)
- BN254 pairing arithmetic cleanups with small instruction-count wins: G2
doubling reuses the generic `ecc::dbl` and G2 addition a repeated term.
[#1633](https://github.com/ipsilon/evmone/pull/1633)
[#1635](https://github.com/ipsilon/evmone/pull/1635)
[#1636](https://github.com/ipsilon/evmone/pull/1636)
[#1641](https://github.com/ipsilon/evmone/pull/1641)
[#1642](https://github.com/ipsilon/evmone/pull/1642)
[#1643](https://github.com/ipsilon/evmone/pull/1643)
- The cryptography code (`evmone_precompiles`) is built with `-O1` in Debug
configurations, keeping the precompiles usable there.
[#1619](https://github.com/ipsilon/evmone/pull/1619)
- Keccak absorption of the final input bytes reworked, preventing a compiler
from replacing the tail copy with a `memcpy` call.
[#1620](https://github.com/ipsilon/evmone/pull/1620)
- Fork names are spelled `TangerineWhistle` and `SpuriousDragon`, matching
[execution-specs].
[#1576](https://github.com/ipsilon/evmone/pull/1576)
- The [Execution Spec Tests] fixtures are taken from [execution-specs]:
`tests@v20.0.1` and the `glamsterdam-devnet` pin for the Amsterdam work.
[#1577](https://github.com/ipsilon/evmone/pull/1577)
[#1579](https://github.com/ipsilon/evmone/pull/1579)
- The state test runner takes each transaction from its `txbytes` encoding, and
the codec is checked against every encoding a fixture carries, including the
transactions in a valid block's RLP.
[#1614](https://github.com/ipsilon/evmone/pull/1614)
[#1617](https://github.com/ipsilon/evmone/pull/1617)
- The `CHAINID` opcode returns the configured chain id instead of a hardcoded 1.
[#1610](https://github.com/ipsilon/evmone/pull/1610)
- Frame exit result construction is shared between the Baseline and Advanced
interpreters.
[#1578](https://github.com/ipsilon/evmone/pull/1578)
- The blockchain test runner reuses the state root of the canonical chain tip
instead of rebuilding the whole trie for the post-state check.
[#1595](https://github.com/ipsilon/evmone/pull/1595)

### Removed

- **The Constantinople revision**: it never activated on Mainnet (superseded by
[Petersburg]) and no live testnet runs it. Its opcodes retarget to Petersburg.
[#1587](https://github.com/ipsilon/evmone/pull/1587)
- **The EVMC capabilities feature**: eWASM is gone and precompiles-only VMs
did not take off.
[#1593](https://github.com/ipsilon/evmone/pull/1593)
- `evmc_result::create_address` and `evmc_message::create2_salt`, left without
readers by the VM-side CREATE address computation.
[#1589](https://github.com/ipsilon/evmone/pull/1589)

### Fixed

- **An [EIP-7702] authorization signature was never verified**: only its shape
was checked and the authority came from a non-standard `signer` field, so any
address could be given a delegation designation.
[#1611](https://github.com/ipsilon/evmone/pull/1611)
- Transaction chain ids above 255 and [EIP-155] `v` values above 0xff were
rejected by the transaction loader, so `evmone t8n` failed on common networks
such as Sepolia.
[#1570](https://github.com/ipsilon/evmone/pull/1570)
[#1571](https://github.com/ipsilon/evmone/pull/1571)
- A transaction with a mismatched chain id is rejected, and the [EIP-155]
protected form is recognized, so one signed for chain 0 is no longer accepted
on every chain.
[#1610](https://github.com/ipsilon/evmone/pull/1610)
[#1616](https://github.com/ipsilon/evmone/pull/1616)
- The presence of the block header's `slotNumber` ([EIP-7843]) is validated;
a post-fork block missing it and a pre-fork block carrying it were accepted.
[#1626](https://github.com/ipsilon/evmone/pull/1626)
- The JSON loaders conflated an absent optional key with a zero value, e.g.
an env without `blobGasUsed` produced an engaged optional holding 0.
[#1622](https://github.com/ipsilon/evmone/pull/1622)

## [0.22.0] — 2026-06-13

This release starts the implementation of the Amsterdam EVM revision.

### Added

- **Amsterdam EVM revision** with the implementation of the initial set of EIPs.
[#1508](https://github.com/ipsilon/evmone/pull/1508)
- [EIP-7778]: Block Gas Accounting without Refunds.
[#1526](https://github.com/ipsilon/evmone/pull/1526)
- [EIP-7843]: SLOTNUM opcode.
[#1517](https://github.com/ipsilon/evmone/pull/1517)
- [EIP-7976]: Increase Calldata Floor Cost.
[#1519](https://github.com/ipsilon/evmone/pull/1519)
- [EIP-7981]: Increase Access List Cost.
[#1524](https://github.com/ipsilon/evmone/pull/1524)
- [EIP-8024]: Backward compatible SWAPN, DUPN, EXCHANGE.
[#1429](https://github.com/ipsilon/evmone/pull/1429)

### Changed

- **EVMC ABI version bumped to 13**: the `evmc_tx_context` layout changed
(the SLOTNUM addition and the removals listed below) along with other
incompatible EVMC API changes.
[#1567](https://github.com/ipsilon/evmone/pull/1567)
- **BN254 pairing (`ecpairing`) optimizations**: line evaluation optimized,
dedicated `Fq2` squaring, points migrated to affine/projective representations.
[#1539](https://github.com/ipsilon/evmone/pull/1539)
[#1541](https://github.com/ipsilon/evmone/pull/1541)
[#1542](https://github.com/ipsilon/evmone/pull/1542)
[#1545](https://github.com/ipsilon/evmone/pull/1545)
[#1546](https://github.com/ipsilon/evmone/pull/1546)
[#1547](https://github.com/ipsilon/evmone/pull/1547)
- **KZG point evaluation precompile optimizations**: joint G1 multi-scalar multiplication,
precomputed Miller-loop lines for the trusted setup point and the G2 generator.
[#1536](https://github.com/ipsilon/evmone/pull/1536)
[#1537](https://github.com/ipsilon/evmone/pull/1537)
[#1549](https://github.com/ipsilon/evmone/pull/1549)
- The t8n tool has been folded into the `evmone` CLI as the `t8n` subcommand.
[#1531](https://github.com/ipsilon/evmone/pull/1531)
[#1533](https://github.com/ipsilon/evmone/pull/1533)
[#1535](https://github.com/ipsilon/evmone/pull/1535)
[#1551](https://github.com/ipsilon/evmone/pull/1551)
- Blockchain test runner now matches expected block- and transaction-level exceptions.
[#1556](https://github.com/ipsilon/evmone/pull/1556)
[#1560](https://github.com/ipsilon/evmone/pull/1560)
[#1561](https://github.com/ipsilon/evmone/pull/1561)
- Upgraded [blst] to 0.3.16.
[#1534](https://github.com/ipsilon/evmone/pull/1534)
- `modexp` 256-bit Almost Montgomery Multiplication keeps its accumulator in
registers by avoiding output/input aliasing (~6% faster on 256-bit benchmarks).
[#1477](https://github.com/ipsilon/evmone/pull/1477)

### Removed

- Standalone `evmone-t8n` tool — use the `evmone t8n` subcommand instead.
[#1551](https://github.com/ipsilon/evmone/pull/1551)
- EOF leftovers dropped from the EVMC API: the `EOFCREATE` call kind
and the `initcodes` transaction context.
[#1514](https://github.com/ipsilon/evmone/pull/1514)
[#1515](https://github.com/ipsilon/evmone/pull/1515)
- The `evmc_result` optional storage.
[#1529](https://github.com/ipsilon/evmone/pull/1529)

### Fixed

- The instruction counting tracer (`--opcode.count`) kept a dangling reference
to the output path.
[#1554](https://github.com/ipsilon/evmone/pull/1554)

## [0.21.0] — 2026-04-09

This release merges the required contents of the former [EVMC] project
Expand Down Expand Up @@ -1247,6 +1465,9 @@ It delivers fully-compatible and high-speed EVM implementation.
- Exposes [EVMC] 6 ABI.
- The [intx 0.2.0](https://github.com/chfast/intx/releases/tag/v0.2.0) library is used for 256-bit precision arithmetic.

[0.23.0]: https://github.com/ipsilon/evmone/releases/tag/v0.23.0
[0.22.0]: https://github.com/ipsilon/evmone/releases/tag/v0.22.0
[0.21.0]: https://github.com/ipsilon/evmone/releases/tag/v0.21.0
[0.20.0]: https://github.com/ethereum/evmone/releases/tag/v0.20.0
[0.19.0]: https://github.com/ethereum/evmone/releases/tag/v0.19.0
[0.18.0]: https://github.com/ethereum/evmone/releases/tag/v0.18.0
Expand Down Expand Up @@ -1274,13 +1495,17 @@ It delivers fully-compatible and high-speed EVM implementation.
[0.1.1]: https://github.com/ethereum/evmone/releases/tag/v0.1.1
[0.1.0]: https://github.com/ethereum/evmone/releases/tag/v0.1.0

[EIP-2]: https://eips.ethereum.org/EIPS/eip-2
[EIP-155]: https://eips.ethereum.org/EIPS/eip-155
[EIP-170]: https://eips.ethereum.org/EIPS/eip-170
[EIP-663]: https://eips.ethereum.org/EIPS/eip-663
[EIP-1153]: https://eips.ethereum.org/EIPS/eip-1153
[EIP-1884]: https://eips.ethereum.org/EIPS/eip-1884
[EIP-1344]: https://eips.ethereum.org/EIPS/eip-1344
[EIP-2200]: https://eips.ethereum.org/EIPS/eip-2200
[EIP-2537]: https://eips.ethereum.org/EIPS/eip-2537
[EIP-2681]: https://eips.ethereum.org/EIPS/eip-2681
[EIP-2718]: https://eips.ethereum.org/EIPS/eip-2718
[EIP-2929]: https://eips.ethereum.org/EIPS/eip-2929
[EIP-2935]: https://eips.ethereum.org/EIPS/eip-2935
[EIP-3155]: https://eips.ethereum.org/EIPS/eip-3155
Expand Down Expand Up @@ -1308,6 +1533,9 @@ It delivers fully-compatible and high-speed EVM implementation.
[EIP-7691]: https://eips.ethereum.org/EIPS/eip-7691
[EIP-7692]: https://eips.ethereum.org/EIPS/eip-7692
[EIP-7702]: https://eips.ethereum.org/EIPS/eip-7702
[EIP-7708]: https://eips.ethereum.org/EIPS/eip-7708
[EIP-7778]: https://eips.ethereum.org/EIPS/eip-7778
[EIP-7843]: https://eips.ethereum.org/EIPS/eip-7843
[EIP-7594]: https://eips.ethereum.org/EIPS/eip-7594
[EIP-7823]: https://eips.ethereum.org/EIPS/eip-7823
[EIP-7825]: https://eips.ethereum.org/EIPS/eip-7825
Expand All @@ -1318,6 +1546,11 @@ It delivers fully-compatible and high-speed EVM implementation.
[EIP-7934]: https://eips.ethereum.org/EIPS/eip-7934
[EIP-7939]: https://eips.ethereum.org/EIPS/eip-7939
[EIP-7951]: https://eips.ethereum.org/EIPS/eip-7951
[EIP-7954]: https://eips.ethereum.org/EIPS/eip-7954
[EIP-7976]: https://eips.ethereum.org/EIPS/eip-7976
[EIP-7981]: https://eips.ethereum.org/EIPS/eip-7981
[EIP-8024]: https://eips.ethereum.org/EIPS/eip-8024
[EIP-8246]: https://eips.ethereum.org/EIPS/eip-8246

[Spurious Dragon]: https://eips.ethereum.org/EIPS/eip-607
[Petersburg]: https://eips.ethereum.org/EIPS/eip-1716
Expand Down Expand Up @@ -1365,6 +1598,7 @@ It delivers fully-compatible and high-speed EVM implementation.
[tests 8.0.4]: https://github.com/ethereum/tests/releases/tag/8.0.4

[Execution Spec Tests]: https://github.com/ethereum/execution-spec-tests
[execution-specs]: https://github.com/ethereum/execution-specs
[Execution Spec Tests 5.3.0]: https://github.com/ethereum/execution-spec-tests/releases/tag/v5.3.0
[Execution Spec Tests 3.0.0]: https://github.com/ethereum/execution-spec-tests/releases/tag/v3.0.0
[Execution Spec Tests 1.0.6]: https://github.com/ethereum/execution-spec-tests/releases/tag/v1.0.6
Expand Down
13 changes: 11 additions & 2 deletions evmone/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ cable_set_build_type(DEFAULT Release CONFIGURATION_TYPES Release Debug)
include(Hunter/init)

project(evmone LANGUAGES CXX C)
set(PROJECT_VERSION 0.21.0)
set(PROJECT_VERSION 0.23.0)

option(EVMONE_TOOLS "Build evmone tools" ${PROJECT_IS_TOP_LEVEL})

Expand Down Expand Up @@ -53,7 +53,9 @@ if(CABLE_COMPILER_GNULIKE)
$<$<COMPILE_LANGUAGE:CXX>:-Wextra-semi>
$<$<COMPILE_LANGUAGE:CXX>:-Wno-missing-field-initializers>

$<$<CXX_COMPILER_ID:GNU>:-Wno-attributes>
$<$<AND:$<CXX_COMPILER_ID:GNU>,$<VERSION_GREATER_EQUAL:$<CXX_COMPILER_VERSION>,12>>:-Wno-attributes=clang::>
$<$<AND:$<CXX_COMPILER_ID:GNU>,$<VERSION_GREATER_EQUAL:$<CXX_COMPILER_VERSION>,12>>:-Wno-attributes=msvc::>
$<$<AND:$<CXX_COMPILER_ID:GNU>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,12>>:-Wno-attributes>
$<$<CXX_COMPILER_ID:GNU>:-Wduplicated-cond>
$<$<CXX_COMPILER_ID:GNU>:-Wlogical-op>

Expand Down Expand Up @@ -153,10 +155,17 @@ set(include_dir ${CMAKE_CURRENT_SOURCE_DIR}/include)
add_subdirectory(lib)

if(EVMONE_TOOLS)
hunter_add_package(nlohmann_json)
find_package(nlohmann_json CONFIG REQUIRED)
add_subdirectory(test/state)
add_subdirectory(test/utils)
add_subdirectory(tools)
endif()

if(EVMONE_TESTING)
if(NOT EVMONE_TOOLS)
message(FATAL_ERROR "EVMONE_TESTING requires EVMONE_TOOLS")
endif()
enable_testing()
add_subdirectory(test)
endif()
Expand Down
Loading