Skip to content

dashmate local network never forms a DIP24 rotation quorum (llmq_test_dip0024), breaking trustless SPV proof verification #4124

Description

@shumkov

Summary

A dashmate local network never forms a DIP24 quorum-rotation quorum
(llmq_test_dip0024), because the default 3-masternode group is below that
quorum's minSize = 4. This breaks any client that verifies platform proofs
trustlessly from an SPV-synced masternode list, since that sync uses the DIP24
qrinfo path and needs a rotation quorum to exist.

Details

quorum list on a fresh local group (both dashmate v3 / protocol 11 and v4 /
protocol 12) shows every quorum type forming except dip0024:

llmq_test:             2
llmq_test_instantsend: 2
llmq_test_v17:         2
llmq_test_dip0024:     0     <-- never forms
llmq_test_platform:    2

Core keeps attempting and failing the rotation DKG:

ActiveDKGSessionHandler::InitNewQuorum -- quorum initialization failed for llmq_test_dip0024 qi[0]
CSigSharesManager::Cleanup -- signing session timed out ... sigShareCount=1

llmq_test_dip0024 is type 103 with size 4, minSize 4 (see dash-spv
dash-spv/src/test_utils/masternode_network.rs, which notes it "requires all
masternodes to succeed and is fragile in live orchestration"). With only 3
masternodes the DKG can't gather enough members, so the quorum never finalizes.

Mining extra blocks does not help — it's structural, not height-gated.

Why it can't be worked around in config today

Regtest exposes size overrides for the base test quorums but not for the
rotation quorum:

  • -llmqtestparams=<size>:<threshold> (llmq_test)
  • -llmqtestinstantsendparams=<size>:<threshold>
  • -llmqtestplatformparams=<size>:<threshold>
  • ❌ no -llmqtestdip0024params

dashmate already sets [regtest] llmqtestinstantsenddip0024=llmq_test_instantsend,
but that only redirects the InstantSend-DIP24 type; the masternode-list qrinfo
sync still expects the rotation quorum to exist.

Impact

Clients that do trustless client-side proof verification via an SPV-synced
masternode list cannot complete masternode sync on a local network, so no
proof-verified operation (identity balance refresh, credit withdrawal, etc.)
works locally. Concretely, dash-evo-tool v1.0-dev's SPV-only context provider
sets masternodes_ready() == false forever, bans every DAPI address, and
surfaces "All Dash network servers are temporarily unreachable." (DET 0.9.3 was
unaffected because it read quorum public keys from Core over RPC instead of an
SPV masternode list.)

This blocks local end-to-end testing of any SPV-verified platform flow. Details
and a reproducible harness: dashpay/dash-evo-tool#890.

Possible directions

  1. Provision local groups so dip0024 can form — e.g. default (or make it a
    one-flag option) to ≥4 masternodes, so the rotation quorum meets minSize.
  2. Pre-generate / inject DIP0024 quorum data for local networks, the way the
    dash-spv test fixtures do with controlled generation, so it doesn't rely on
    live DKG succeeding with few nodes.
  3. Add a regtest -llmqtestdip0024params (dashd) so the rotation quorum size
    can be reduced to fit a 3-MN local group.
  4. At minimum, document that DIP24 rotation quorums do not form on the default
    3-node local network and that trustless SPV flows require ≥4 nodes (or
    devnet/testnet).

Environment

  • dashmate 3.0.2 and 4.0.0, local preset, default 3 masternodes
  • dashd image dashpay/dashd:23, regtest

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions