Nerva – Monero Upstream Gaps

Analysis date: 2026-05-03  ·  Chain height: 4,206,417  ·  Nerva core code base: Monero v0.15 (Dec 2019)  ·  Monero current: v0.18.4.6 (Feb 2026)

Nerva’s core code (rctTypes.h, blockchain.cpp, wallet2.cpp, net_node.inl) was last fully rebased from Monero in December 2019 (commit 7b8da67). Since then only selective cherry-picks were applied. The highest RCT type is RCTTypeBulletproof2 = 5 — CLSAG and Bulletproofs+ are absent from the codebase. All items below are gaps relative to that baseline, filtered against what is already planned.

Already Planned

HF13
CryptoNight-NX: 4 MB scratchpad, random instruction VM, branch divergence
HF14
CLSAG + Bulletproofs+
HF15
Ring size 5 → 16

1 — HF Item Missing from Plan

#Priority / HF targetWhatDetails & rationaleMonero PR / version
1CRITICAL
HF14
View tagsEach output carries a 1-byte tag derived from the Diffie-Hellman shared secret. During wallet scanning the tag is checked first — outputs that don’t match are skipped without full decryption. Only 1-in-256 outputs pass the tag check on average, reducing scan work by roughly 40–50×. At 4.2M blocks this turns a 5–10 min scan into seconds.

Should be bundled into HF14 alongside CLSAG and Bulletproofs+ — all three touch the output/transaction format and require a consensus upgrade. Monero shipped all three in a single release (v0.18.0), costing one network upgrade instead of three.
PR #7007
v0.18.0
— Aug 2022

2 — Security & Privacy

All no-fork. Recommended target: ship immediately, independent of any HF.

#PriorityWhatDetailsMonero PR / versionFile(s)
2CRITICALNO-FORKP2P crash vulnerabilityCritical crash exploitable via crafted P2P messages. Responsibly disclosed by Kevin McSheehan; mechanism withheld in release notes. All nodes should be patched immediately.(no public PR)
v0.18.4.0
— Apr 2025
p2p/
3CRITICALNO-FORKP2P memory exhaustion / DoS mitigationsMultiple defenses added in response to an active attack in Dec 2020: separate size limits for epee binary in P2P vs RPC, stricter pre-handshake buffer limits, max levin packet size per command, ban on duplicate keys/unnamed sections in epee binary. Three rapid patch releases.(multiple PRs)
v0.17.1.7
–1.9
Dec 2020
– Jan 2021
p2p/
epee/
4CRITICALNO-FORKPeerlist filter inverted ternaryAn inverted ?: in peer list filtering causes the wrong peers to be kept. Single-line fix.PR #10317
v0.18.4.6
— Feb 2026
p2p/
net_node.inl
5CRITICALNO-FORKAnonymous inbound data leakNodes using --anonymous-inbound (Tor/I2P) expose their own onion address with a real timestamp in peerlist responses. Fix: insert at a random position with timestamp=0. Nerva currently uses std::time(nullptr) here — the leak is active.PR #9632
PR #9633
v0.18.4.0
— Apr 2025
p2p/
net_node.inl
~line 2332
6CRITICALNO-FORKtx_extra size limit in mempoolNo cap on the tx_extra field for mempool entries — an attacker can exhaust RAM and disk by crafting transactions with oversized extra data.PR #8784
v0.18.2.2
— Apr 2023
cryptonote_core/
7CRITICALNO-FORKget output distribution DoSRestricted RPC was serving output distribution for pre-RCT outputs — computationally expensive queries that could DoS a public node. Reported by the Haven team.PR #8084
v0.17.3.0
— Dec 2021
rpc/
core_rpc_server
.cpp
8CRITICALNO-FORKRPC input size sanity checkNo size limit on data submitted to RPC endpoints. Allows resource exhaustion via oversized inputs. Reported by researcher m31007.PR #8276
v0.17.3.2
— Apr 2022
rpc/
9CRITICALNO-FORKLMDB deadlock in resize detectionLow-probability deadlock in lmdb_txn_begin(): resize detection did not account for an existing transaction on the current thread under concurrent access.PR #7958
v0.17.3.0
— Dec 2021
blockchain_db/
lmdb/
10CRITICALNO-FORKDaemon race condition in P2P contextRace condition when multiple threads simultaneously access fluff_txs and sent_addresses in p2p connection context_t. Undefined behaviour on multi-core systems.PR #7873
v0.17.3.0
— Dec 2021
p2p/
11CRITICALNO-FORKWallet privacy leak via malicious remote nodeA hostile RPC node can exploit the wallet scanning path to extract ring data. Fix: remove wallet2 :: find_and_save_rings() — rings have been stored during scanning since the last Nerva HF; the function is dead code that creates attack surface.PR #10015
v0.18.4.2
— Aug 2025
wallet/
wallet2.cpp
12CRITICALNO-FORKDecoy selection: gamma distribution from chain tipGamma distribution for decoy output age was computed from unlock time instead of chain tip. Produces biased decoy selection that leaks information about the true spend. Identified via academic analysis.PR #7822
v0.17.2.3
— Sep 2021
wallet/
wallet2.cpp
13CRITICALNO-FORKDecoy selection: integer truncationaverage_output_time used integer division (e.g. 1.9→1), skewing decoy selection. An associated zero-division vulnerability was also fixed in the same PR.PR #7798
v0.17.2.3
— Sep 2021
wallet/
wallet2.cpp
14HIGHNO-FORK/24 subnet deduplicationUpgrades peer diversity filter from /16 to /24. Known spy nodes cluster in /24 blocks; the /16 filter is too coarse. Simulation: spy-node connections per outbound drop from ~3.6 → ~1.06. Nerva uses 0x0000ffff (/16) mask.PR #9939
v0.18.4.3
— Oct 2025
p2p/
net_node.inl
lines 1430–1473
15HIGHNO-FORKDecoy selection: recent spend window 50→15 blocksAfter the integer truncation fix (#13), the 50-block recent spend window was oversized. Reducing to 15 better matches empirical spending patterns.PR #7993
v0.17.3.0
— Dec 2021
wallet/
wallet2.cpp
16HIGHNO-FORKDecoy selection: statistical dependence within ringsSequential picking created statistical dependence — later picks were biased. Fix commits to pick ordering after RPC validation, preserving the less-biased earlier selections.PR #9130
v0.18.3.2
— Mar 2023
wallet/
wallet2.cpp
17HIGHNO-FORKPeer ID disabled over Tor/I2PPeer ID no longer tracked or sent over anonymous networks. Tracking peer IDs over Tor/I2P allows circuit correlation attacks.(v0.17.1.6 release)
v0.17.1.6
— Dec 2020
p2p/
net_node.inl
18HIGHNO-FORKPrivacy network silent tx dropWhen Tor/I2P has no outgoing connections, transactions were silently dropped rather than falling back. A user could believe their tx was sent over Tor but it never propagated.PR #9267
v0.18.3.4
— Aug 2024
p2p/
net_node.inl
19HIGHNO-FORKRemove DNS calls in tx constructionDead code fetched segregation heights from segheights. moneropulse.org on every transaction build. Records were never populated. Removal eliminates a per-tx DNS privacy leak and unnecessary latency.PR #8408
v0.18.0.0
— Jul 2022
wallet/
wallet2.cpp
20HIGHNO-FORKDon’t use DNS to determine if address is localWallet performed DNS lookups to decide whether a daemon address is local (for trust level). Leaks which node the wallet connects to via DNS. Now determined without network queries.PR #8878
v0.18.3.1
— Oct 2023
wallet/
wallet2.cpp

3 — P2P & Network

All no-fork unless noted. Recommended target: ship in next patch release or HF13 window.

#Priority / targetWhatDetailsMonero PR / versionFile(s)
21HIGHNO-FORKSync race condition dropping connectionsRace between reading blockchain height and block IDs during peer requests. Fix reads both atomically under m_blockchain_lock. Directly relevant to the current fix/slow-daemon-sync branch.PR #10257
v0.18.4.5
— Dec 2025
cryptonote_protocol/
_handler.inl
22HIGHNO-FORKPeer scoring systemTracks misbehaviour per peer: stale data delivery, claimed height decreases, peer list spam, missing replies. Scores accumulate and misbehaving peers are dropped. Previously they stayed connected indefinitely.(v0.17.1.6–
1.8 releases)

v0.17.1.6
–1.8
— Dec 2020
p2p/
net_node.inl
23HIGHNO-FORKDon’t drop peers for soft offensesSeparates hard offenses (immediate ban) from soft offenses (score deduction only). Reduces false-positive disconnections that degrade network connectivity.PR #8813
v0.18.2.2
— Apr 2023
p2p/
net_node.inl
24HIGHNO-FORKSSL / connection layer rewriteFixed SSL shutdown hangs, SSL handshake segfaults, and circular strand dependencies causing dropped P2P connections under load.PR #8426
v0.18.0.0
— Jul 2022
epee/
p2p/
25HIGHNO-FORKSpurious rejection of downloaded blocksWhen kicking an idle peer, the set of requested blocks was not cleared. On reconnect, incoming blocks from a new request were rejected because the daemon still expected blocks from the evicted peer.PR #8022
v0.17.3.0
— Dec 2021
cryptonote_protocol/
26HIGHNO-FORKTransaction re-relay stuck 4 hoursget_relay_delay() comparison was always satisfied early, causing failed transactions to remain stuck in the relay queue for up to 4 hours instead of re-trying at proper intervals.PR #8326
v0.18.0.0
— Jul 2022
cryptonote_core/
27HIGHNO-FORKDandelion++ tuning and bug fixesNerva has Dandelion++ but is missing several years of fixes: (a) fluff probability 10%→20% + embargo timeout 39 s (v0.17.1.5); (b) skip desynced peers in stem phase; (c) locally-submitted tx not entering stem phase correctly (PR #8628); (d) duplicate tx in fluff queue causing false peer drops (PR #9355).PRs #8628, #9355
v0.17.1.5
— 2020

v0.18.2.0
— 2023

v0.18.3.4
— 2024
p2p/
net_node.inl
cryptonote_core/
28HIGHNO-FORKDrop peers sending duplicate transactionsDisconnect peers that repeatedly send the same transaction. Addresses OOM conditions caused by duplicate tx flooding.PR #8916
v0.18.3.1
— Oct 2023
cryptonote_protocol/
29HIGHNO-FORKHigh CPU from terminated TCP connectionsDaemon spun high CPU when interrupted TCP connections were not properly closed — the handling thread looped rather than exiting.PR #8900
v0.18.3.1
— Oct 2023
epee/
30MEDIUMNO-FORKPeer list cleanup on banWhen an IP is banned it is now removed from grey list and anchor list, not just white list. Previously a banned IP could re-enter from grey/anchor on next daemon start.PR #7810
v0.17.2.3
— Sep 2021
p2p/
net_node.inl
31MEDIUMNO-FORKSync height selection refinementImproved logic for choosing which peer height to request when starting or resuming sync. Reduces unnecessary work when multiple peers advertise different heights.PR #10202
v0.18.4.4
— Nov 2025
cryptonote_protocol/
32MEDIUMNO-FORKRelay empty fluffy block on mined blockWhen a local miner finds a block, immediately relay an empty fluffy block rather than the full block. Reduces propagation latency and orphan risk.PR #10206
v0.18.4.4
— Nov 2025
cryptonote_protocol/
33MEDIUMNO-FORKDefault outbound peer count 8 → 12Raises the default outgoing connection count from 8 to 12. Better connectivity and block propagation on a small network.(v0.17.1.1 release)
v0.17.1.1
— Oct 2020
p2p/
net_node.inl
34MEDIUMNO-FORK--ban-list with CIDR subnet support--ban-list flag loads banned IPs from a file at startup. Entries support CIDR subnets. Also adds ban @filename for runtime loading.(v0.17.1.3 / 1.8 releases)
v0.17.1.3
— Nov 2020
p2p/
net_node.inl
35MEDIUMNO-FORK/16 filter for IPv4 – within – IPv6Applies the /16 subnet deduplication already used for IPv4 to IPv4 addresses embedded in IPv6 (::ffff:x.x.x.x). Without it, a single operator can fill the peer list via IPv6 embedding.(v0.17.1.3 release)
v0.17.1.3
— Nov 2020
p2p/
net_node.inl
36MEDIUMNO-FORKTxpool revalidation at fork boundariesWhen the chain crosses a hard fork height, all mempool transactions are revalidated against the new rules. Transactions invalid post-fork are flushed, preventing miners from accidentally including them in the first post-HF block.PR #7169
v0.18.0.0
— Jul 2022
cryptonote_core/
37MEDIUMHF13max block count in sync requestAdds a max_block_count field to NOTIFY REQUEST GET OBJECTS so peers can signal preferred batch size. Protocol extension — pairs well with the adaptive batch sync work already on this branch. Candidate for HF13.(v0.18.4.3 release)
v0.18.4.3
— Oct 2025
cryptonote_protocol/
_defs.h lines 210–225
38MEDIUMNO-FORKP2P connection bug fixesMiscellaneous P2P connection reliability fixes in the most recent Monero release.PR #10298
v0.18.4.6
— Feb 2026
p2p/

4 — Performance

All no-fork. Recommended target: next patch release or HF13 window.

#PriorityWhatDetailsMonero PR / versionFile(s)
39HIGHNO-FORKKeccak / cn_fast_hash 5× fasterLoop unrolling and compile-time constant substitution in the Keccak permutation. cn_fast_hash for 16 KB: 164 µs → 31 µs. Affects every hash operation — block verification, tx hashing, and CNA PoW pre-processing.PR #8262
v0.18.0.0
— Jul 2022
crypto/keccak.c
40HIGHNO-FORKCryptoNote binary deserialization ~60% fasterEliminates a full payload copy before reading, removes redundant virtual calls, improves cache efficiency. Benchmark: 100 blocks in 86 µs vs 205 µs; 4,224 transactions in 7.8 ms vs 15.6 ms. Direct sync speedup.PR #7661
v0.18.0.0
— Jul 2022
epee/
cryptonote_basic/
41HIGHNO-FORKRingCT verification cacheCaches verRctNon SemanticsSimple results. When the same outputs are verified multiple times (block propagation then acceptance), the cached result is reused. Release notes: “huge block propagation speedup.”PR #8676
v0.18.2.0
— Mar 2023
cryptonote_core/
42HIGHNO-FORKReduced LMDB writes 2→1 per txpool insertadd_txpool_tx currently does two separate mdb_cursor_put calls (metadata then blob). Merging into one halves disk I/O per txpool insertion.PR #9740
v0.18.4.0
— Apr 2025
blockchain_db
/lmdb/db_lmdb.cpp
43HIGHNO-FORKLong-term block weight cache bugIncorrect calculation when adding blocks to the long-term weight cache, returning wrong median values. Check first: Nerva’s current branch reworked this cache — verify whether the specific upstream bug is already addressed independently.PR #9014
v0.18.3.1
— Oct 2023
cryptonote_core/
blockchain.cpp
44HIGHNO-FORKTransaction construction 56% fasterFive batched wallet optimizations: public key validity caching, ringdb update/lookup batching, vector preallocation, elimination of redundant pre-computation. Large transactions: 5.9 s → 2.6 s.PR #8046
v0.18.0.0
— Jul 2022
wallet/
wallet2.cpp
45MEDIUMNO-FORKSecond I/O thread pool for daemonSeparates I/O-bound tasks (especially DNS) from compute into a dedicated 8-thread pool. On <8-core systems, DNS lookups previously blocked incoming transaction processing.PR #8577
v0.18.1.2
— Sep 2022
cryptonote_core/
46MEDIUMNO-FORKget block template backlog 15 s CPU spikeIterated all mempool transactions, causing up to 15 s CPU time under high load. Now only processes transactions that realistically fit in the next block.PR #8455
v0.18.1.0
— Aug 2022
cryptonote_core/
47MEDIUMNO-FORKPrevent base fee reaching zeroAdds a floor to the dynamic fee calculation. Note: Monero later reverted this (PR #9603, Dec 2024) — evaluate against Nerva’s emission curve before applying.PR #8851
v0.18.3.1
— Oct 2023
cryptonote_core/

5 — Wallet & UX

All no-fork unless noted. Recommended target: next patch release or post-HF14.

#PriorityWhatDetailsMonero PR / versionFile(s)
48HIGHNO-FORKIdentify spends in pool during scanningTwo-pass wallet scan marks unconfirmed pool spends during refresh. Fixes the common complaint of balance not updating after sending when the tx is in pool but not yet in a block.PR #10153
v0.18.4.4
— Nov 2025
wallet/
wallet2.cpp
49HIGHNO-FORKKey image stays unspent after confirmed spendEdge case where key images remain marked unspent after a confirmed spend, causing the wallet to show an inflated spendable balance.PR #10255
v0.18.4.5
— Dec 2025
wallet/
wallet2.cpp
50HIGHNO-FORKSpurious reorg detection with untrusted nodesWallets on untrusted nodes quantize height for privacy, receiving already-seen blocks. The reorg size check was applied to these blocks, triggering false “huge reorg” warnings and wallet aborts.PR #8331
v0.18.0.0
— Jul 2022
wallet/
wallet2.cpp
51HIGHNO-FORKWallet compatibility check with daemon HFWallet checks compatibility with the connected daemon’s active hard fork before proceeding. Without this, a wallet on an old HF connecting to a post-HF daemon fails with confusing errors.PR #8544
v0.18.1.1
— Sep 2022
wallet/
wallet2.cpp
52MEDIUMNO-FORKscan_tx commandRescan a specific transaction by ID without a full wallet resync. Useful for recovering wallets that missed a transaction — avoids redoing a full scan.PR #7312 / #8566
v0.18.0.0 /
v0.18.3.1
wallet/
wallet2.cpp
simplewallet/
53MEDIUMNO-FORKWallet RPC restricted – mode tx limit chunkingIf the mempool has >100 transactions, wallets on restricted RPC nodes previously failed with “too many transactions.” Fix: chunk requests into batches of ≤100.PR #8388
v0.18.0.0
— Jul 2022
wallet/
wallet2.cpp
54MEDIUMNO-FORKFee carving from partial paymentsWhen a transaction can’t send the full requested amount, the fee is carved from the partial amount rather than requiring extra funds or failing.PR #7342
v0.18.0.0
— Jul 2022
wallet/
wallet2.cpp
55MEDIUMNO-FORKChunk get_outs.bin callsBreaks large output queries into chunks to avoid per-request size limits on RPC nodes. Without this, large transactions fail to build against restricted nodes.PR #7796
v0.17.3.0
— Dec 2021
wallet/
wallet2.cpp
56MEDIUMNO-FORKLog rotation bug with relative pathsRotation logic prepended ./ during directory scanning, causing a filename mismatch — log files were continuously rotated instead of appended to.PR #9396
v0.18.3.4
— Aug 2024
epee/
57MEDIUMNO-FORKUnicode file paths on WindowsWallet could not open wallet files with Unicode characters in the path on Windows — affects users whose Windows username contains non-ASCII characters.PR #8548
v0.18.1.1
— Sep 2022
wallet/
wallet2.cpp
58LOWNO-FORKBackground sync with view key onlySync a wallet using only the view key — spend key does not need to be on the machine. Requires new BackgroundSync wallet structures entirely absent from Nerva. Large architectural change, warrants its own release cycle.PR #8617
v0.18.4.0
— Apr 2025
wallet/
wallet2.h
wallet/
wallet2.cpp

6 — RPC, ZMQ & Tooling

All no-fork. Recommended target: next patch release or post-HF14 as bandwidth allows.

#PriorityWhatDetailsMonero PR / versionFile(s)
59HIGHNO-FORKFix connecting to password-protected nodesRegression where wallets could not connect to RPC nodes requiring username/password authentication.PR #9238
v0.18.3.3
— Apr 2023
wallet/
wallet2.cpp
60HIGHNO-FORKbusy_syncing + synchronized in get_infoget_info returns busy_syncing (currently downloading blocks) and synchronized (fully synced) fields. Enables health checks and monitoring without polling block height.(v0.17.1.8 release)
v0.17.1.8
— Dec 2020
rpc/
core_rpc_server.cpp
61MEDIUMNO-FORKZMQ txpool_add and chain_main eventsZMQ publisher emits events when transactions enter the mempool and when new blocks are found. Enables lightweight monitoring without polling the RPC. Extended in v0.18.1 to also publish submitted transactions.(v0.17.0 release)
PR #8451
v0.17.0 /
v0.18.1.0
zmq/
cryptonote_core/
62MEDIUMNO-FORKConfirmations in get transactionsget_transactions now returns confirmation count per transaction. Previously callers had to compute it from block height difference.PR #7662
v0.18.0.0
— Jul 2022
rpc/
core_rpc_server.cpp
63MEDIUMNO-FORKsubmit_block returns block IDsubmit_block RPC returns the block ID of the accepted block. Mining software can confirm which block was accepted without a follow-up query.PR #8891
v0.18.3.1
— Oct 2023
rpc/
core_rpc_server.cpp
64MEDIUMNO-FORKcalcpow RPC methodNew RPC to compute the proof-of-work hash for a given block template. For Nerva this computes CNA. Useful for mining software and external validators.PR #8075
v0.17.3.0
— Dec 2021
rpc/
core_rpc_server.cpp
65MEDIUMNO-FORK--rpc-restricted-bind-ipSeparate bind IP for restricted vs full RPC. Previously both shared --rpc-bind-ip, making it impossible to expose restricted RPC publicly while keeping full RPC on localhost.(v0.17.1.6 release)
v0.17.1.6
— Dec 2020
daemon/
rpc/
66MEDIUMNO-FORKRPC SSL cert persistenceSSL certs/keys persisted to disk so the daemon uses the same cert across restarts. Previously self-signed certs regenerated on each start, breaking clients that pinned the cert.PR #7366
v0.18.0.0
— Jul 2022
rpc/
67LOWNO-FORKWildcard CORS supportRPC CORS supports * wildcard when the operator permits. Useful for web wallet and explorer integrations.PR #7952
v0.17.3.0
— Dec 2021
rpc/
68LOWNO-FORKBan list # comment supportAllows # comment lines in --ban-list files. Minor QoL for node operators.PR #9616
v0.18.4.0
— Apr 2025
p2p/
net_node.inl

Already Present in Nerva

  • Dandelion++ — base implementation present in levin_notify.cpp and net/dandelionpp.* (tuning and bug fixes in item #27 are NOT present)
  • Fake output infinite-loop fix — Nerva commit 5f40d1e (Mar 2026), port of Monero PRs #8794 / #8801
  • is_same_host peer checkp2p/
    net_node.inl lines 243, 2737 (Monero PRs #9948/#9949)
  • Boost 1.86 compatibility — cherry-picked Oct 2024, Monero PR #9499
  • Wallet RPC responsiveness during sync — independently implemented, pending release
  • P2P fixes Jan 2020 — Monero PRs #6037, #6052, #6057, #6119, #6120, #6125, #6229
  • P2P fixes Dec 2020 — Monero PRs #7189, #7191

Recommended Schedule

Ship immediately (pre-HF13, security critical)

#2–#13: P2P crash, P2P memory exhaustion, peerlist ternary, anonymous inbound leak, tx_extra DoS, get_output_distribution DoS, RPC input size, LMDB deadlock, daemon race condition, wallet RPC privacy leak, decoy selection gamma fix, decoy selection integer truncation.
#19, #20: Remove DNS calls from tx construction and local address detection.

Next patch release or HF13 window

#14–#18 (remaining security: /24 subnets, decoy selection window, Dandelion++ tuning, peer ID over Tor, Tor tx drop).
#21–#29 (P2P: sync race, peer scoring, SSL rewrite, block rejection, re-relay, duplicate tx, high CPU).
#39–#44 (performance: Keccak, deserialization, RingCT cache, LMDB writes, block weight cache, tx construction).
#37: max_block_count in sync request — bundle with HF13 adaptive batch sync work.

HF14 — bundle with CLSAG + Bulletproofs+

#1: View tags — all three changes touch the output/transaction format; one network upgrade instead of three.
#36: Txpool revalidation at fork boundaries — essential HF infrastructure.
#51: Wallet HF compatibility check.

Post-HF14 patch releases

#48–#57: Wallet correctness and UX (pool spends, key image edge case, scan_tx, fee carving, chunking, log rotation, Unicode paths).
#59–#68: RPC/ZMQ tooling improvements as bandwidth allows.
#58: Background sync with view key — large architectural change, own release cycle.

Generated 2026-05-03 · 68 items · Nerva baseline: git 7b8da67 (Dec 2019), rctTypes.h tops at RCTTypeBulletproof2 · Monero scanned: v0.15 → v0.18.4.6 · HF13/HF14/HF15 plans from nerva.one