Skip to content

Support Dash Core v24 wire formats: CbTx v4, special tx types 10-12, ProRegTx v3, version 2 asset-unlock txid #612

Description

@PastaPastaPasta

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.

  1. CbTx version 4 (src/evo/cbtx.h:32-68). A new field merkleRootAssetUnlocks (uint256) follows creditPoolBalance. 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.
  2. Version 2 Asset Unlock txid (src/primitives/transaction.cpp:76-88, src/primitives/transaction.h:47-53). Payload version byte 2, serialization identical to v1, but txid = 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 type MSG_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).
  3. 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 in src/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.
  4. ProRegTx version 3 (ExtAddr) becomes valid (ProTxVersion::GetMax, src/evo/providertx.h). Its layout after nOperatorReward differs from v1/v2 (src/evo/providertx.h:162-226): nested netInfo (extended-address format instead of a single service address), then payouts_count u8 + payouts[] ({scriptPayout, reward u16}, DIP-26 multi-party payouts), shares_count u8 + shares[] ({amount i64, scriptRefund, scriptReward, keyIDOwner}), joinSigs[shares_count] (var-bytes each), nEarlyPeriodBlocks u32, nEarlyPenalty i64, then inputsHash; for Evo nodes platformNodeID follows without the P2P/HTTP port fields. scriptPayout is not serialized in v3. Same ExtAddr treatment applies to ProUpServTx/ProUpRegTx v3 where applicable.

What breaks in DashSync today (master @ 2026-09-22)

  • Masternode list sync will fail from the activation block. DSCoinbaseTransaction.m parses through COINBASE_TX_CORE_20 (v3) only (lines 37-53) and toData re-serializes only those fields (lines 89-98). txHash is taken from the re-serialized data (self.txHash = self.data.SHA256_2), so for a v4 coinbase the computed hash is 32 bytes short of the real one and the coinbase merkle proof carried in mnlistdiff no longer verifies.
  • Types 10/11/12 fall through DSTransactionFactory.m:67's best-effort default: branch, which is fine for block parsing but means shared-masternode transactions touching a wallet are opaque.
  • DSProviderRegistrationTransaction does not implement the v3 layout (nested extended addresses, DIP-26 payouts, collateral shares, no port fields for Evo nodes).
  • Transaction hashing does not implement the v2 asset-unlock txid rule, so once Platform emits v2 withdrawals (Emit version 2 Asset Unlock transactions once Core v24 activates (stable txid + InstantSend-locked withdrawals) platform#4908), Platform→wallet withdrawals received by the iOS wallet would be recorded under a txid Core does not use and their outputs could not be spent.

Suggested scope

  1. CbTx v4 parse + toData (merkleRootAssetUnlocks, 32 bytes after creditPoolBalance), and a test against a v4 coinbase from a Core develop regtest/devnet.
  2. v2 asset-unlock txid: for tx type 9 with payload version ≥ 2, hash with the trailing 132 payload bytes zeroed (Core vectors in src/test/evo_assetlocks_tests.cpp).
  3. ProRegTx v3 layout; payload classes for types 10-12 as needed for wallet display.

Core references: src/evo/cbtx.h, src/evo/providertx.h, src/primitives/transaction.{h,cpp}, doc/release-notes-7437.md, doc/release-notes-7639.md.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions