Skip to content

Merge upstream release nb-20261110 - #4

Merged
dvir1994 merged 21 commits into
node-builderfrom
upgrade/nb-20261110
Nov 11, 2026
Merged

dvir1994 merged 21 commits into
node-builderfrom
upgrade/nb-20261110

Conversation

@dvir1994

Copy link
Copy Markdown

Summary

Merge the upstream hl-archive-node/nanoreth release nb-20261110 (f0cad31) into node-builder.

The release is high priority. It adds the MRB precompile repricing (HlHardfork V2). Mainnet activates it at block 50,988,232.

Other upstream changes:

Macabim patches

The merge keeps all three fork patches. Git merged them with no conflicts.

Deployment

Build reth-hl on prod-ovh-hyperevm-sin-1 before block 50,988,232. Keep reth-hl.b88079754.bak for rollback.

sprites0 and others added 21 commits November 10, 2026 04:06
Rust 1.99's clippy flags the #[must_use] that jsonrpsee's #[rpc] macro
puts on server methods returning an already #[must_use] boxed future,
which fails CI under -D warnings. An item-level allow does not reach the
generated code, so allow it per module in the five files that define rpc
traits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The push trigger still targeted main, which is not the default branch,
so direct pushes to node-builder ran no checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ippy-double-must-use

ci: fix clippy on Rust 1.99 and run checks on node-builder pushes
Keep enough canonical history available for deep reorgs, avoid prematurely finalizing imported heads, and serve blocks with receipts from one consistent database snapshot.
Reth can begin a falling header request at a child's parent, but the reorg cache refactor stopped recording that parent mapping and caused repeated empty responses.

Index each fetched block's parent at the preceding height and cover the lookup with a focused regression test.
get_by_hash only served from the `blocks` LRU, which holds
BLOCK_CACHE_LIMIT (100k) entries. The hash index holds ten times that
(HASH_INDEX_LIMIT, 1M) and falls back to the node's HeaderNumbers table
on a miss, so a hash stays resolvable long after its body has been
evicted. Every peer request for such a hash failed with "Block not
cached for hash", even though the block was still reachable by number.

Resolve the hash to a height and refetch instead: serve from
gap_blocks when the height is one of the hardcoded testnet gaps,
otherwise call the source under a 30s timeout so a stalled fetch cannot
wedge the request loop.

Recovery is only allowed to install a block that is provably the one
asked for. The source is a by-number API, so it can legitimately return
a different block than requested after a reorg; three checks reject
that. The returned block must be at the requested height and carry the
requested hash, and — under the canonical_hashes write lock — must not
contradict a hash already recorded for that height. The last check is
what closes the race: an in-flight recovery that finishes after
cache_block has refreshed the height loses, rather than overwriting the
newer canonical block with the one it happened to fetch.

The staleness check in BlockImport::poll was using get_by_hash's error
as its signal, which is wrong in both directions now. It would trigger
a source fetch on what is only a liveness test, and a hash that reorged
away but still resolves through the DB index would come back Ok and be
treated as live. Add is_cached_canonical_hash, which answers exactly
that question with no I/O: the body is cached and its hash is still
canonical at its height.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011Z9cmqnwb9tL9kxkGM5Ccb
canonical_hashes gained an entry for every cached block and was only
trimmed by invalidate_above, which mainnet effectively never reaches,
so a node syncing from genesis kept one entry per height. Evicting a
block from the LRU now drops its canonical entry as well.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
These 33168 blocks are missing from the upstream testnet S3 bucket. They are
embedded next to the existing 50927214–50929512 gap and served by BlockStore
the same way, so nodes sync through the range on any block source.

The blocks were rebuilt from another nanoreth node's RPC
(eth_getBlockByNumber / eth_getBlockReceipts / eth_blockPrecompileData) and
checked per block: header and tx hashes re-hash to the RPC values, receipts
reproduce the receipts root, logs bloom and gas used, and the parent-hash
chain links to the real S3 blocks on both sides (69038324 and 69071493).
All 23 blocks with read precompile calls carry their recorded results.

Verified by syncing a testnet archive through the range (every block
re-executed and validated) and comparing the full state at 69237903 against
a node initialized from hl-node state at 69224874: no differences caused by
the gap. Data is lz4-compressed JSON (5.6MB).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…et-gap-69038325

fix: hardcode testnet gap blocks (69038325–69071492) in BlockStore
…o-peer-recover-evicted-blocks

fix(testnet): recover safely from source reorgs
…sh,Number}AndIndex

In hl-node-compliant mode, eth_getBlockBy*, receipts, logs and tx counts
hide system txs, but the by-index transaction lookups indexed the full
block. Index N therefore returned a different tx than the block lists at
position N (and than hl-node returns), often a system tx.

Shift the requested index by the block's system tx count, and shift
transactionIndex in the response back. Block tags are resolved to a
number first so the count and the lookup refer to the same block.
Non-compliant mode is unchanged.
The system tx count and the transaction now always come from the same block,
even if the block at that height changed between the two lookups.
Bring hl-archive-node/nanoreth release nb-20261110 (f0cad31) into the
Macabim fork. The release adds the MRB precompile repricing (HlHardfork
V2, mainnet activation block 50,988,232), testnet reorg recovery (hl-archive-node#151),
system-tx skip in by-index lookups (hl-archive-node#162), testnet gap blocks (hl-archive-node#166),
pseudo-peer fixes and clippy fixes (hl-archive-node#165).

The merge keeps the three Macabim patches:
- pending gossip feed and --hl-mempool-dir (PR #1)
- eth_simulateV1 gas-limit rule (PR #2)
- hl-node fallback grace tied to local progress (PR #3)

Git auto-merged all files with no conflicts.
@dvir1994
dvir1994 merged commit 6b332b7 into node-builder Nov 11, 2026
3 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants