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
- 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.
- 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.
- Add a regtest
-llmqtestdip0024params (dashd) so the rotation quorum size
can be reduced to fit a 3-MN local group.
- 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
Summary
A
dashmatelocal network never forms a DIP24 quorum-rotation quorum(
llmq_test_dip0024), because the default 3-masternode group is below thatquorum's
minSize = 4. This breaks any client that verifies platform proofstrustlessly from an SPV-synced masternode list, since that sync uses the DIP24
qrinfopath and needs a rotation quorum to exist.Details
quorum liston a fresh local group (both dashmate v3 / protocol 11 and v4 /protocol 12) shows every quorum type forming except dip0024:
Core keeps attempting and failing the rotation DKG:
llmq_test_dip0024is type 103 with size 4, minSize 4 (see dash-spvdash-spv/src/test_utils/masternode_network.rs, which notes it "requires allmasternodes 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>-llmqtestdip0024paramsdashmate already sets
[regtest] llmqtestinstantsenddip0024=llmq_test_instantsend,but that only redirects the InstantSend-DIP24 type; the masternode-list
qrinfosync 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-toolv1.0-dev's SPV-only context providersets
masternodes_ready() == falseforever, bans every DAPI address, andsurfaces "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
one-flag option) to ≥4 masternodes, so the rotation quorum meets minSize.
dash-spv test fixtures do with controlled generation, so it doesn't rely on
live DKG succeeding with few nodes.
-llmqtestdip0024params(dashd) so the rotation quorum sizecan be reduced to fit a 3-MN local group.
3-node local network and that trustless SPV flows require ≥4 nodes (or
devnet/testnet).
Environment
dashpay/dashd:23, regtest