Nerva ↔ Monero gap analysis. Independent scan of Nerva master (v0.2.3.0) against Monero release-v0.18. Scan status: complete (12 passes).
Lens. This lists Monero changes that would benefit Nerva to adopt — not a push to make Nerva match Monero. Nerva forked in 2018 with its own PoW (CryptoNight-Adaptive, which reads prior blocks for ASIC/pool resistance), so it intentionally diverges. Items already merged or in an open PR are excluded.
A algo-agnostic — adopt anytime B consensus/privacy — needs a hard fork C PoW/block-read path — evaluate vs CNA
open verified missing probable likely missing audit needs review in-PR not a gap
Monero PR links are given where confident; entries marked verify cite the hard-fork/release and should be confirmed against the exact PR at implementation time.
B · Consensus & Privacy (needs a fork)
| Gap | C | Status | Description & benefit | Monero |
|---|
| Minimum 2 outputs | B | open | check_tx_outputs has no output-count check, so Nerva accepts 1-output transactions, which leak the exact amount sent (no change output). Monero forbids since HF12. Top finding. | HF12 verify |
| Deterministic unlock time | B | open | Nerva still allows arbitrary tx.unlock_time. Monero enforces unlock_time == 0 to remove a privacy fingerprint and a known footgun. | HF15 / #8654 |
| Enforce min output age | B | open | Confirmed: only an unlock check is done; an output with unlock_time=0 passes regardless of age, so decoys need not be ≥10 blocks old. Monero’s ENFORCE_MIN_AGE closes a decoy timing leak. | HF12 verify |
| View Tags | B | open | 1-byte per-output tag lets wallets skip ~255/256 outputs during scan → ~40–50× faster scans. Tx-format change; bundle with a fork (HF14 with CLSAG/BP+). | #7007 |
A · Performance (adopt anytime)
| Gap | C | Status | Description & benefit | Monero |
|---|
| Keccak / cn_fast_hash | A | in progress | Unrolled Keccak permutation, ~5× faster. Speeds every hash op including CNA PoW pre-processing. (branch in progress) | #8262 |
| RingCT verification cache | A | open | Caches verRctNonSemanticsSimple so a tx verified at propagation isn’t re-verified at block acceptance. Large block-propagation speedup. | #8676 |
| Binary deserialization | A | probable | Removes a full payload copy + redundant virtual calls; ~2× faster block/tx parsing → direct sync speedup. | #7661 |
| Tx construction speed | A | probable | Batched wallet optimizations (pubkey-validity cache, ringdb batching, preallocation). Large txs ~2× faster to build. | #8046 |
| Second I/O thread pool | A | probable | Nerva uses one global threadpool. A dedicated I/O pool keeps DNS lookups from blocking tx processing on low-core systems. | #8577 |
| Txpool insert single write | A | audit | add_txpool_tx does two cursor writes (meta + blob). Monero reduced txpool-insert I/O. Confirm mechanism before porting (different sub-DBs). | #9740 verify |
A · DoS / Network (adopt anytime)
| Gap | C | Status | Description & benefit | Monero |
|---|
| Per-IP RPC connection caps | A | open | Missing DEFAULT_RPC_MAX_CONNECTIONS / per-public-IP / per-private-IP / soft-limit-size. Protects public RPC nodes from connection exhaustion. | v0.18 verify |
| Dandelion++ tuning | A | probable | Dandelion++ is present but the CRYPTONOTE_DANDELIONPP_* tuning constants (fluff prob, embargo) are absent — likely older values. Confirm vs current Monero. | #8628 / #9355 verify |
| Txpool complement sync | A | open | Missing the NOTIFY_GET_TXPOOL_COMPLEMENT P2P command — lets a node fetch txs it lacks from a peer’s mempool. Improves mempool consistency & propagation. | v0.17 verify |
| Granular peer scoring | A | probable | Nerva has fail-count banning but not Monero’s per-offense misbehavior scoring with soft-vs-hard separation. Reduces false disconnects while still dropping bad actors. | #8813 verify |
| –ban-list (CIDR) | A | open | No --ban-list file (with CIDR subnets) loaded at startup — operators can’t pre-load a banned-IP list. | v0.17 verify |
A · RPC / Wallet features (adopt anytime)
| Gap | C | Status | Description & benefit | Monero |
|---|
| get_info: busy_syncing / synchronized | A | open | Both fields absent. Lets monitors distinguish “downloading” vs “fully synced” without polling height. | v0.17 verify |
| get_transactions: confirmations | A | open | No per-tx confirmation count returned. | v0.18 verify |
| calcpow RPC | A | open | Compute PoW for a block template (would compute CNA). Useful for miners/validators. | #8075 |
| getminerdata / add_aux_pow | A | open | Mining-pool template data & merge-mining aux PoW. | v0.18 verify |
| generateblocks RPC | A | open | Regtest block generation — helps automated testing of fork transitions. | v0.17 verify |
| Output freeze/thaw/frozen (RPC) | A | partial | Works at CLI/wallet2 already; only the wallet RPC endpoints are missing. Small gap — expose existing functionality. | v0.17 verify |
| scan_tx | A | open | Rescan a single tx by id without a full wallet resync. | #7312 |
| Background sync (view-key only) | A | open | Sync with only the view key, spend key off-machine. Large change; own release cycle. | #8617 |
| ZMQ pub/sub events | A | open | No txpool_add / chain_main publisher (Nerva has ZMQ-RPC only). Enables explorer/monitor integrations without polling. | #8451 verify |
| estimate_tx_size_and_weight | A | open | Wallet RPC to estimate tx size/weight pre-build. | v0.18 verify |
| Trezor hardware wallet | A | probable | Nerva ships Ledger support but no Trezor backend. Niche; adds a second HW-wallet option. | v0.13+ verify |
| Per-byte fee estimate | A | audit | Nerva uses the older per-KB fee model. Monero moved to per-byte + 2021 scaling. May be an intentional Nerva economic choice — evaluate first. | v0.17–0.18 verify |
C · PoW / block-read path (evaluate vs CNA)
This category is small by design: Nerva keeps its block-fetch path current — pruned-block sync and span-based parallel download are both present — and handles CNA’s prior-block reads itself. The performance items above (Keccak, RingCT cache, deserialization) are algo-agnostic, not in this category.
| Gap | C | Status | Description & benefit | Monero |
|---|
| Sync race: atomic height/block-ids | C | probable | A race reading height + block-ids drops connections during sync. Algo-agnostic lock fix (not PoW-specific), so likely safe — verify against Nerva’s handler. | #10257 |
| assume-valid height | C | in-PR #93 | Skip PoW for historical blocks below a trusted height to speed sync. Already in flight as Nerva PR #93; interacts with CNA verification. | Nerva #93 |
Already present (checked — not gaps)
Verified already implemented in Nerva: exact-coinbase enforcement, uniform ring size (fixed, stronger than Monero’s same-mixin), pruning, multisig, RPC SSL, Tor/I2P, pruned-block sync, span download queue, and the current CORE_SYNC_DATA. The bulk of the older security backlog is already merged on master (p2p hardening, RPC DoS, LMDB deadlock, wallet privacy & correctness). Not a real gap: a max_block_count field in NOTIFY_REQUEST_GET_OBJECTS — verified to not exist in Monero.