Skip to content

v0.45.0

Choose a tag to compare

@shumkov shumkov released this 21 Oct 12:52
d631aac

0.45.0 - 2026-10-21

Highlights

  • Dash Core v24 support: v24 masternode lists in rpc-json (nested platform addresses, shared and multi-payout masternodes, non-IP services), CbTx v4, ProRegTx, ProUpServTx and ProUpRegTx version 3, raw payloads for unknown special transactions, getblockchaininfo and getdeploymentinfo, and asset locks decoded without their payload length prefix (#1093, #1136, #1137, #1138, #1152, #1154, #1155, #1165, #1167).
  • GroveDB bincode: binary serialization moved to grovedb-bincode 2.1.0, sharing its traits with Platform (#1005).
  • Wallet funding and reservations: UTXO and receive-address reservations, owner-tagged reservations, funding from several account types, a CoinJoin funding account and drain mode for asset locks, and OP_RETURN outputs (#812, #818, #916, #925, #915, #944, #922).
  • SPV sync reliability: sync anchored at the wallet birth height, filter sync no longer stalls after a restart or a full sync, peer selection and stall handling reworked, in-flight downloads requeued on peer disconnect, and committed ranges rescanned for newly derived scripts (#848, #835, #816, #943, #941, #866, #989).
  • Security hardening: forged ChainLocks are rejected, oversized headers messages are refused, and the RPC client no longer logs request arguments and results, which can carry credentials (#1059, #1140, #1147).

Added

Changed

  • Breaking: the bincode feature and binary serialization dependencies now use
    grovedb-bincode 2.1.0 and its derive macros from crates.io, sharing the same
    serialization traits as Platform. Existing bincode encodings and C interfaces
    are unchanged, but Rust consumers must use the fork for compatible Encode/Decode traits.
    The dependency switch does not automatically opt types into DecodeUntrusted.
    (#1005) @QuantumExplorer
  • Breaking: parse Core v24 masternode lists in rpc-json, including nested platform addresses, shared and multi-payout masternodes, non-IP services and partial address diffs (#1093) @shumkov
  • Breaking: decode unknown special transaction types as raw payloads (#1136) @ZocoLini
  • Breaking: keep special payloads raw when their layout is unknown (#1154) @ZocoLini
  • Breaking: temporarily expose the coinbase payload of the newest masternode list diff as MasternodeListEngine::latest_coinbase() and DashSpvClient::latest_coinbase(). It is not verified, so a single peer can serve any payload, and it is replaced by a verified version in a later release (#1204) @shumkov
  • Breaking: name the outpoints a sweep releases (#962) @romchornyi
  • Breaking: unify mnemonic parsing on one auto-detecting path (#981) @PastaPastaPasta
  • Move extended_public_key out of Signer into the ExtendedPubKeySigner subtrait (#839) @QuantumExplorer
  • Refactor ManagedAccountType::from_account_type (#828) @ZocoLini
  • Compute fewer block hashes (#834) @ZocoLini
  • SIMD-batched SipHash-2-4 for BIP158 filter matching (#845) @ZocoLini
  • Peer reputation module cleanup (#328) @ZocoLini
  • Widen DEFAULT_COINJOIN_GAP_LIMIT from 30 to 100 for dashj parity (#868) @bfoss765
  • Replace TARGET_PEERS with the existing max_peers config field (#827) @ZocoLini
  • Reduce debug log verbosity in dash-spv (#917) @ZocoLini
  • Add recent mainnet and testnet checkpoints (#857) @xdustinface
  • Refresh masternode seed files and the mainnet seed list (#805, #874, #906, #963, #983, #970)

Fixed

  • Honor the account index in the DashPay derivation path (#813) @shumkov
  • Prevent a filter sync crash on a new block after a full sync (#816) @xdustinface
  • Resolve a just-retired quorum by walking earlier masternode lists (#801) @xdustinface
  • Reprocess blocks on rescan against newly derived scripts (#820) @xdustinface
  • Compute the SML entry hash with SER_GETHASH semantics (#798) @xdustinface
  • Remove a release build warning (#825) @ZocoLini
  • Reserve selected UTXOs to prevent double spends (#812) @xdustinface
  • Degrade gracefully when advisory file locking is unsupported (#841) @QuantumExplorer
  • Avoid filter sync getting stuck on the first new block after a restart (#835) @xdustinface
  • Don't build asset locks on unconfirmed funds (#836) @xdustinface
  • Preserve UTXO flags across reprocessing (#837) @xdustinface
  • Actionable error when add_account(_, None) hits a keyless wallet (#847) @lklimek
  • Derive the storage lockfile path from the full directory name (#862) @QuantumExplorer
  • Zeroize ExtendedBLSPrivKey and ExtendedEd25519PrivKey on drop (#859) @QuantumExplorer
  • Match masternode owner and voting key hashes in compact filters (#863) @xdustinface
  • Match masternode collateral outpoints in compact filters (#864) @xdustinface
  • Return the fee the transaction actually pays from build and build_signed (#872) @QuantumExplorer
  • Cover CoinJoin and DashPay accounts for AssetLock routing (#867) @bfoss765
  • Derive BLS operator and Ed25519 platform node keys per DashSync and dashbls (#879) @QuantumExplorer
  • Extend the gap limit for operator keys like owner and voting keys (#882) @QuantumExplorer
  • Platform node id is the Tenderdash node ID, not hash160 (#884) @QuantumExplorer
  • Normalize PlatformNodeId to canonical byte order at the consensus boundary (#889) @QuantumExplorer
  • Don't preload filters below the stored range on filter download start (#893) @QuantumExplorer
  • Fix issue 911 in key-wallet (#914) @ZocoLini
  • Rewrite branch-and-bound coin selection (#919) @ZocoLini
  • Recover InstantSend locks received before quorum sync completes (#895) @bfoss765
  • Record an out-of-order UTXO spend so it no longer shows a phantom unspent balance (#909) @bfoss765
  • Fix the dashd process port assignment in tests (#923) @ZocoLini
  • Stop counting a contact's watch-only coins as the wallet's (#926) @romchornyi
  • Never offer an outpoint the builder already holds (#931) @QuantumExplorer
  • Stop the filter rescan loop when the chain anchors above the wallet (#933) @xdustinface
  • Use WalletAccountCreationOptions::default() in the benchmark framework (#938) @ZocoLini
  • Requeue in-flight downloads when a single peer disconnects (#941) @xdustinface
  • Reliable peer selection and stall handling during sync (#943) @xdustinface
  • Reissue requeued masternode requests from tick (#953) @xdustinface
  • Key rotation ChainLock signatures per quorum work block (#934) @xdustinface
  • Resume on the invariant start_download asserts (#955) @romchornyi
  • Release clean storage segments below the committed height during long scans (#946) @bfoss765
  • Enable key-wallet/getrandom for mnemonic generation (#945) @QuantumExplorer
  • Stop a never-broadcast transaction from crediting money that does not exist (#961) @romchornyi
  • Promote finished header segments from the tick, not only on a message (#960) @romchornyi
  • Rescan committed filter ranges for newly derived scripts (#866) @HashEngineering
  • Collect a sweep's surviving inputs once instead of per candidate (#966) @romchornyi
  • Extend the CFHeaders queue from the tick, not only on a header event (#964) @romchornyi
  • Walk a sweep's descendant closure once instead of per generation (#969) @romchornyi
  • Recover masternode sync from a rejected QRInfo (#947) @bfoss765
  • Accept non-English BIP-39 mnemonics on all parse paths (#980) @llbartekll
  • Count acceptance signals that arrived before the broadcast (#982) @romchornyi
  • Coalesce committed-range filter rescans across batch commits (#974) @romchornyi
  • Build dash-spv-bench on a Linux host and survive having no terminal (#987) @ZocoLini
  • Report the transactions each account knows in dash-spv-bench (#984) @ZocoLini
  • Stop pruning spent CoinJoin addresses from the filter scan (#985) @ZocoLini
  • Coinbase maturity clock (#996) @ZocoLini
  • Promote confirmed spend-only transactions (#998) @shumkov
  • Ask every account whether a transaction is new, not just the matched ones (#1000) @ZocoLini
  • Keep a spend-first coin recognisable so its spend stays in history (#1001) @ZocoLini
  • Discover DashPay asset unlock receipts (#1004) @PastaPastaPasta
  • Stop losing derived scripts, and close the loop on wallet state (#989) @ZocoLini
  • Prune observed spends during the initial sync, so a wallet persisted mid-sync loads again (#1014) @ZocoLini
  • Only decode a special payload from transaction version 3 (#1155) @ZocoLini
  • Keep the pre-v4 serde shape of CoinbasePayload (#1149) @ZocoLini
  • Send the ChainLock block hash in display order to submitchainlock (#1148) @ZocoLini
  • Consult every fund-bearing account for provider transactions (#1009) @ZocoLini
  • Extend DIP-15 contact pools as their payments arrive (#1035) @ZocoLini
  • Keep a mined transaction promotable when its IS lock arrives late (#1037) @ZocoLini
  • Re-apply a spend whose coin was funded after it (#1015) @ZocoLini
  • Reject a ChainLock that the masternode list below its signing height refuses (#1059) @ZocoLini
  • Reject headers messages above Core's batch limit (#1140) @ZocoLini
  • Keep RPC request arguments and results out of the logs (#1147) @ZocoLini
  • Sweep a conflict loser's keys-only records too (#1143) @lklimek
  • Set LLMQ params to Dash Core's values (#1187) @ZocoLini