⚠️ Do not upgrade your mainnet or testnet node until you receive an official announcement.
Upgrades are communicated via official channels. See upgrade instructions for details.
v0.16.3
Tags or hashes:
monad-bft(consensus): tagv0.16.3(d12edcbc0)monad(execution): tagv0.16.3(c1594ff80)
Highlights
- State Archive nodes no longer pay 2x write amplification past MIP-8 — historical nodes commit only the page-encoded timeline after the fork, and reads route per requested block version. Archive nodes that skipped the v0.16.1 hot-fix need a one-time
monad-mpt --storage <path> --promote-secondaryafter installing; see the upgrade instructions. - Snapshot streams are versioned — every stream carries an eight-byte header, so a format mismatch aborts loudly instead of misparsing.
- Statesync protocol v0/v1 retired, leaving a single implemented protocol version.
Notable RPC/SDK changes
- [RPC] Storage encoding is routed by timeline past the MIP-8 cutoff.
TriedbEnvtracks the migration phase andprimary_earliest, soget_storage_atselects page or slot encoding according to the requested block version. - [RPC] Filter methods return
InvalidParamsfor a malformedethfilter rather than an internal error.- Ref: monad-bft PR #3241
Notable robustness changes
- [Node ops] Every snapshot stream (
eth_header,account,storage,code) is opened with an eight-byte versioned header carrying a magic, version, kind and guard byte. An unrecognised version or a shard assembled from mismatched files aborts with a clear message instead of misparsing. Snapshots produced by this release cannot be read by earlier binaries. - [EVM] Fixed a 32-byte over-read of the EVM output buffer in
mce. - [EVM] Fixed the leaf-on-branch hex-prefix in
VarLenMerkleComputeandRootVarLenMerkleCompute, which diverged from the canonical Ethereum root for a branch node carrying both children and a value. Not reachable in production: every production variable-length trie is keyed by a prefix-free set, so no committed root was affected. - [Consensus]
proposal_basicsnow finalizes in order. - [EVM] Bounded the push-immediate walk in
show_opcodes.
Notable performance changes
- [EVM] P-256 curve parameters are cached per thread in
p256_verify_impl. - [Node ops] State Archive nodes commit only the page-encoded timeline past the MIP-8 fork, removing the 2x disk growth rate that dual-timeline committing caused in v0.16.1. The RODb secondary handle also shares the primary's service thread.
Notable internal changes
- [Consensus] Statesync protocol v0 and v1 are retired and the version constants are derived from execution's
statesync_version.hthrough a newmonad-statesync-versioncrate.STATESYNC_VERSION_MINrises to v2, theStateSyncUpsertV0encoding is removed, and a peer still speaking v0 or v1 is rejected withBadVersion. - [EVM] EIP-7981 (increased access list cost) is implemented behind
eip_7981_active, which is active only for EVM revisions at or aboveMONAD_ETH_AMSTERDAM. Not reachable on any current network. - [EVM]
ethashis replaced with an in-househash256type and keccak implementation. This also corrects aSHA3_squeezearity mismatch that produced a wrong digest for every input on non-x86_64 builds. - [EVM]
silkpre_recover_addressis replaced withmonad_recover_address, and the vendored secp256k1 is linked directly. - [Node ops] Trie update statistics are made monotonic via a snapshot API.
- [EVM] The zkVM precompiles architecture is refactored.
Full Changelog: v0.16.2...v0.16.3