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
mainmoves 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. |