跳转至

Versioning

UMNode advertises itself to peers as UMNode/v<major>.<minor>.<patch> (matching the geth/reth/nethermind shape). The version lives in version/VERSION and is embedded into the binary at compile time.

The bump rule

  • patch — incremented by one in every PR, as part of that PR (so the version on main moves once per merge). It is a counter, not the PR number: the two drifted apart early on, and the patch is now well past the PR counter. The merge commit records which PR produced which version.
  • minor — bumped on a significant shift in concept or capability (e.g. the move to an RPC-serving client), or when an Ethereum network runs stably end-to-end (we can keep peers and read blocks reliably).
  • major — bumped on the first stable release.

History so far

Version Change
0.2.129 The executor keeps the headers of the last 256 executed blocks in memory for the BLOCKHASH and parent-header lookups. A lookback deeper than the parent used to read a whole 64-block group from the block store — decompressed and decoded, transactions included — for every ancestor header, a quarter of the executor's time on Sepolia's account-abstraction traffic (profiled at block 7.72M).
0.2.128 --extra-archive-blocks A:B,… keeps block ranges outside the --block-history window: the pruner spares their segments, the backfill fills them after the window (archive segments verified against the block above, peers for the rest; debug_status → blocks.extraRanges), the state history stays continuous from the block before the lowest range up — the executor's prune stops there and the history extender or a snap sync's restore fetches it from the archive — and the receipts stream keeps or fetches the ranges' segments below its floor.
0.2.127 Pruned history comes back when a retention window grows: a larger --block-history (or all, or a lower --backfill-from) lowers the block store's prune floor and the backfill fetches the gap back downward from the former floor — archive segments verified against the stored block above, peers for the rest; a larger --state-history / --receipts-history has the history extender adopt the pruned changeset and receipts segments from the archive, file their blocks into the history index and lower the floors segment by segment (debug_status → execution.historyExtension), warning instead when no archive holds them. The retention window is rounded down to a segment boundary.
0.2.126 Sync modes: --syncmode snap (the default) restores the archive's newest state snapshot into an empty node and executes on from its head — falling back to full (state from genesis) with a warning when the archive offers none — and downloads only the blocks the node keeps: the backfill never fetches below the --block-history window (capped at the executed head), the restore fetches only the history segments within --state-history / --receipts-history. The archive source is on by default (the public archive; --archive-source none for peers only), --archive-download and --archive-state-restore are gone, and --archive-upload / --archive-state-* are now --backup / --state-snapshot-* (the old names still work).
0.2.125 Segment archive: state snapshots on request — debug_snapshotState takes one at the current head whatever the schedule (--archive-state-every 0 now means on request only), debug_cancelStateSnapshot interrupts the one being taken or drops the queued request, and debug_status shows the snapshot's phase and progress under archive.upload.snapshot.
0.2.123 go-ethereum 1.17.8 (from 1.17.3): Sepolia's Amsterdam activation (2026-10-06) joins the bundled fork schedule so the handshake stays accepted; the executor refuses Amsterdam blocks until block access lists and state gas are implemented; Holesky's built-in genesis is gone with geth's; builds need Go 1.25.
0.2.119 Segment archive: state snapshots — --archive-state-every publishes the executed state as state/<head>.tar.zst next to the segments, --archive-state-restore seeds a fresh node from the newest one and executes on from its head; changeset blobs are encoded in canonical order so sealed segments are content-addressable.
0.2.118 Segment archive: pruning waits for the backup — with --archive-upload, no retention window (--block-history, --state-history, --receipts-history) drops a sealed segment the archive does not hold yet; debug_status shows what is held as upload.holdsPruning.
0.2.115 Execution profiling round: --pprof-addr, the --state-debug-no-history control, per-window pfWait/flush counters, the executor's parent-header cache and batched sender recovery (≈ 20 % faster catch-up), and the findings in Where execution time goes.
0.2.114 Segment archive: --archive-upload backs sealed segments (blocks, state history, receipts) up to S3 or a directory under a manifest; --archive-download (off by default) attaches verified block segments from an archive during backfill, converting another layout to the local one.
0.2.113 BNB Smart Chain: bnb-mainnet and bnb-testnet, bsc's wire flavours, Parlia execution rules (fee sweep, system transactions, system-contract upgrades, BSC precompiles).
0.2.35 Minor milestone — mainnet runs stably end-to-end: realtime + backfill sync, the JSON-RPC explorer, and peer/fetch logging plus import linkage checks (work since #13).
0.1.3 Segmented block store foundation (#3).
earlier Outbound-only dialing (#2); peer inventory rename (#1); initial layout.