Repository navigation
Merge upstream release nb-20261110 - #4
Merged
Merged
Conversation
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Merge the upstream
hl-archive-node/nanorethreleasenb-20261110(f0cad31) intonode-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.
--hl-mempool-dir(Expose HyperEVM pending transactions from gossip #1)eth_simulateV1gas-limit rule (Allow realistic gas reservations in simulation sequences #2)Deployment
Build
reth-hlonprod-ovh-hyperevm-sin-1before block 50,988,232. Keepreth-hl.b88079754.bakfor rollback.