github category-labs/monad-bft v0.16.3

4 hours ago

⚠️ 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:

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-secondary after 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. TriedbEnv tracks the migration phase and primary_earliest, so get_storage_at selects page or slot encoding according to the requested block version.
  • [RPC] Filter methods return InvalidParams for a malformed eth filter rather than an internal error.

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 VarLenMerkleCompute and RootVarLenMerkleCompute, 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_basics now 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.h through a new monad-statesync-version crate. STATESYNC_VERSION_MIN rises to v2, the StateSyncUpsertV0 encoding is removed, and a peer still speaking v0 or v1 is rejected with BadVersion.
  • [EVM] EIP-7981 (increased access list cost) is implemented behind eip_7981_active, which is active only for EVM revisions at or above MONAD_ETH_AMSTERDAM. Not reachable on any current network.
  • [EVM] ethash is replaced with an in-house hash256 type and keccak implementation. This also corrects a SHA3_squeeze arity mismatch that produced a wrong digest for every input on non-x86_64 builds.
  • [EVM] silkpre_recover_address is replaced with monad_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

Don't miss a new monad-bft release

NewReleases is sending notifications on new releases.