Repository navigation
Support Dash Core v24 wire formats: CbTx v4, special tx types 10-12, ProRegTx v3, version 2 asset-unlock txid #317
Description
What Core v24 changes on the wire
Dash Core develop (the v24 line; dashpay/dash#7437 and dashpay/dash#7639 merged Sep 18-21) introduces the following once DEPLOYMENT_V24 activates. None of it is live on mainnet or testnet yet; testnet activation is the next step, so parsers need to be ready before then.
- CbTx version 4 (
src/evo/cbtx.h:32-68). A new fieldmerkleRootAssetUnlocks(uint256) followscreditPoolBalance. From the activation block on, every coinbase must be version 4 (src/evo/cbtx.cpp:45-51: version ≥ 4 is required when v24 is active, rejected before). The field is the merkle root over the instance hashes of the block's version-2 asset unlocks, all-zero when there are none. - Version 2 Asset Unlock txid (
src/primitives/transaction.cpp:76-88,src/primitives/transaction.h:47-53). Payload version byte2, serialization identical to v1, buttxid = SHA256d(serialized tx with the trailing 132 bytes zeroed)—requestedHeight(4) +quorumHash(32) +quorumSig(96). The hash of the full serialization is the instance hash, used by the new inv typeMSG_ASSET_UNLOCK(34, protocol 70242) and by the CbTx root above. Re-signed instances of one withdrawal therefore share a txid and their outputs are spent by that stable txid. Platform emits v1 today and will switch to v2 after activation (Emit version 2 Asset Unlock transactions once Core v24 activates (stable txid + InstantSend-locked withdrawals) platform#4908). - Three new special transaction types (
src/primitives/transaction.h:39-41):TRANSACTION_PROVIDER_DISSOLVE = 10(ProDisTx),TRANSACTION_PROVIDER_UPDATE_SHARE = 11(ProUpShareTx),TRANSACTION_PROVIDER_UPDATE_SHARED_REGISTRAR = 12(ProUpSharedRegTx). Payloads insrc/evo/providertx.h(CProDisTx: nVersion u16, proTxHash, actorIndex, sig_count u8, sigs[];CProUpShareTx: nVersion, proTxHash, shareIndex, scriptReward, inputsHash, vchSig;CProUpSharedRegTx: nVersion, proTxHash, pubKeyOperator (basic BLS), keyIDVoting, inputsHash, sig_count u8, sigs[]). Spec: docs: add Decentralized Masternode Shares DIP dips#187. - ProRegTx version 3 (ExtAddr) becomes valid (
ProTxVersion::GetMax,src/evo/providertx.h). Its layout afternOperatorRewarddiffers from v1/v2 (src/evo/providertx.h:162-226): nestednetInfo(extended-address format instead of a single service address), thenpayouts_countu8 +payouts[]({scriptPayout, reward u16}, DIP-26 multi-party payouts),shares_countu8 +shares[]({amount i64, scriptRefund, scriptReward, keyIDOwner}),joinSigs[shares_count](var-bytes each),nEarlyPeriodBlocksu32,nEarlyPenaltyi64, theninputsHash; for Evo nodesplatformNodeIDfollows without the P2P/HTTP port fields.scriptPayoutis not serialized in v3. Same ExtAddr treatment applies to ProUpServTx/ProUpRegTx v3 where applicable.
What breaks in dashcore-lib today (master @ 2026-09-22)
lib/transaction/payload/coinbasepayload.jsparses and serializes through version 3 only (if (payload.version >= 3)at lines 70/100/134). A v4 coinbase re-serializes 32 bytes short, so the transaction hash and payload round-trip disagree with the chain from the activation block on.lib/transaction/payload/payload.js:44throwsUnknown special transaction typefor types 10/11/12, so blocks/transactions containing a ProDisTx, ProUpShareTx or ProUpSharedRegTx fail to parse.lib/transaction/payload/proregtxpayload.jsknows onlyCURRENT_PAYLOAD_VERSION = 2; the v3 layout (nested extended addresses, DIP-26 payouts, collateral shares) is not handled.- Transaction hashing does not implement the v2 asset-unlock txid rule.
Consumers: insight-api / insight-ui (block and tx pages will fail on the first v24 block), DAPI's transaction and block endpoints, and the JS SDK's asset-lock/withdrawal handling. Filing here because the fix is in this library; downstream repos only need the dependency bump.
Suggested scope
CbTx v4; payload classes for types 10-12 (or a raw-payload fallback so unknown types never throw during block parsing); ProRegTx/ProUpServTx/ProUpRegTx v3; v2 asset-unlock txid (zero the trailing 132 payload bytes for tx type 9 with payload version ≥ 2) with the DIP-0027 v2 vectors from Core's evo_assetlocks_tests.
Core references: src/evo/cbtx.h, src/evo/providertx.h, src/evo/assetlocktx.h, src/primitives/transaction.{h,cpp}, doc/release-notes-7437.md, doc/release-notes-7639.md.
Activity