Repository navigation
chore: bump to v24.0.0 and set testnet v24 start time - #7725
PastaPastaPasta merged 2 commits into
Conversation
Prepare develop for tagging v24.0.0-rc.1. CLIENT_VERSION_IS_RELEASE stays false: release candidates are tagged on develop and non-release builds take their version string from the git tag (dashpay#5653). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Set the testnet DEPLOYMENT_V24 nStartTime to 1790208000 (Thursday, September 24, 2026 00:00:00 UTC). Mainnet stays NEVER_ACTIVE until a follow-up. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
|
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (2)
Included review availability: Your plan provides up to 4 included reviews per hour; 1 remains after this review. WalkthroughThe client version changes from 23.1.8 to 24.0.0. The testnet V24 deployment start time changes from Priority: ⬇️ Low Estimated code review effort: 2 (Simple) | ~8 minutes Merge Risk: ⚪ Minimal · up to The change prepares the 24.0.0 release-candidate version and enables the scheduled testnet V24 path. Activation remains conditional on the existing EHF and miner-signaling process; no actionable merge risk is identified. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Docstring CoverageExplanation Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 1 functions across 1 files. (1 skipped: 1 unsupported.)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
…endency, sync params with Dash Core in preparation for v24 (#83) * [57a2802] sdk%doc: clean up comments in `dash-params` and `dash-primitives` (Kittywhiskers Van Gogh) * [8a4f29f] params%refac: move network parameters into a `params` module (Kittywhiskers Van Gogh) * [0b09299] params%refac: split chain parameter types per module (Kittywhiskers Van Gogh) * [94d639b] params%refac!: describe genesis blocks with `GenesisParams` (Kittywhiskers Van Gogh) * [b5ec09a] sdk%refac!: invert `dash-params` and `dash-primitives` dependency (Kittywhiskers Van Gogh) * [0756e42] sdk%refac!: invert `dash-params` and `dash-script` dependency (Kittywhiskers Van Gogh) * [5d6e8d4] sdk%lint(codeql): apply codec and ordering policies to `dash-params` (Kittywhiskers Van Gogh) * [aa762a6] params%fix: move v24 deployment to version bit 13 per dashpay/dash#7739 (Kittywhiskers Van Gogh) * [f73b54b] params%fix: schedule the v24 deployment on testnet per dashpay/dash#7725 (Kittywhiskers Van Gogh) * [de29aee] params%feat!: add the `evo_shares` deployment per dashpay/dash#7807 (Kittywhiskers Van Gogh) * [8108fb7] params%fix!: drop per-chain `require_standard` per dashpay/dash#7710 (Kittywhiskers Van Gogh) * [93e6c34] params%feat!: add the bech32m HRP to `AddrParams` per dashpay/dash#7285 (Kittywhiskers Van Gogh) * [ce22bf5] params%fix(llmq)!: add the `LlmqNone` quorum type (Kittywhiskers Van Gogh) * [482a397] params%feat(llmq): add size, DKG and signing parameters per LLMQ type (Kittywhiskers Van Gogh) * [d3c65c4] params%feat: sync params with dashpay/dash#7379 (Kittywhiskers Van Gogh) Description: ````` ## Motivation The coupling between `dash-params` and `dash-{primitives,script}` proved to be expensive, namely by * Creating circular dependencies that had to be worked around by snaking through parameters using `__private` * Coupling an otherwise trivial crate (primarily holding fixed/infrequently updated values) to high-churn crates * And tying those values to data structures that downstream consumers may not share This pull request attempts to dissolve these differences while syncing them with new parameter updates in preparation for Dash Core v24. ## Breaking Changes Affecting `dash-params`: ### Changed - `ChainParams::genesis`, storing the new `GenesisParams` descriptor. - `AddrParams::bech32_hrp`, the human-readable part of DIP-18 Platform addresses. Struct literals must set it. - `LlmqType` gains `LlmqNone` for code `0xff`. The code previously decoded to `LlmqType::Unknown(255)`, exhaustive matches must handle the new variant. ### Removed - `Network::genesis()`. Build the block with `Block::from(&network.chain().genesis)` from `dash-primitives`. - `ChainParams::require_standard`. - Dependency on `dash-primitives` and `dash-script`, now becoming dependents for them. The `portable` feature has been dropped as a result of this inversion. Affecting `dash-primitives`: ### Removed - `LlmqType`, superseded by `dash_params::LlmqType`. Affecting `dash-script`: ### Removed - `AddrParams`, superseded by `dash_params::AddrParams`. ## How Has This Been Tested? ``` just test lint ``` ## Checklist - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have added or updated relevant unit/integration/functional tests - [ ] I have made corresponding changes to the documentation - [x] I did not use agentic assistance (i.e. LLMs, AI) except as [disclosed](#agent-disclosure) and can answer questions, comments and concerns without said assistance. I assume authorship of the code submitted. - [x] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_ ### Agent disclosure Code generated with Claude Code using Opus 5.5, medium effort. Reviewed with Codex using GPT-6.1-Sol, medium effort as adversarial review and Claude Code using Fable 5.1, medium effort. `````
Issue being fixed or feature implemented
This gets develop ready for tagging v24.0.0-rc.1. Release candidates are tagged on develop itself, so develop needs to report 24.0.0 and testnet needs a concrete V24 signalling start time.
The scope is deliberately narrow. Mainnet deployment parameters will follow in a separate PR.
MIN_MASTERNODE_PROTO_VERSIONis in its own PR. Release notes, chain work/assumevalid, checkpoints and seeds are not touched here.What was done?
1.
configure.ac: 23.1.8 -> 24.0.0,_CLIENT_VERSION_IS_RELEASEstaysfalse.This follows the v23 precedent. f819f1b ("chore: bump develop to merging for v23") moved develop to 23.0.0, and
v23.0.0-rc.1was tagged withMAJOR 23 / MINOR 0 / BUILD 0 / IS_RELEASE false. Dash has no_CLIENT_VERSION_RCdefine: non-release builds take their version string fromgit describe(#5653), so the RC tag supplies the-rc.1suffix.I grepped for
23.1.8/230108/CLIENT_VERSION_*to find anything else that carries the version. Nothing else needs to change in this PR:doc/Doxyfile.in,share/qt/Info.plist.in,share/setup.nsi.inandsrc/bitcoin-util-res.rcare substituted from the configure values automatically.contrib/guixgets its version from the git tag.CMakeLists.txton develop is the IDE helper and carries no version.doc/man/*.1(v23.1.8) andcontrib/flatpak/org.dash.dash-core.metainfo.xmlare left alone on purpose.doc/release-process.mdtreats both as release-time steps, and atv23.0.0-rc.1the man pages still said v22.1.0; they were regenerated for the final release (docs: update man pages for 23.0 #6928).2.
src/chainparams.cpp: testnetDEPLOYMENT_V24.nStartTime=1790208000(Thursday, September 24, 2026 00:00:00 UTC).The format follows 15ba788 (#5567).
nTimeout(NO_TIMEOUT), the 100-block window and the 80 -> 60 threshold are unchanged. Mainnet staysNEVER_ACTIVEwith its TODO. Devnet and regtest are untouched.This start time is a placeholder, and maintainers may want to move it. Every v24-gated consensus change still pending has to be merged and running on testnet nodes before activation.
What actually happens after the start time (EHF,
useEHF = true)nStartTime, which is roughly 6 blocks (~15 min) after the wall-clock time. From then on,CEHFSignalsHandler::UpdatedBlockTipsees thatIsValidMNActivation(12, MTP)is in range and no bit-12 signal is known, so members of theLLMQ_50_60quorum sign the bit-12 MnEHF request. The recovered signature becomes anMNHF_SIGNALspecial transaction that miners include.SignalHeight()returns H. The deployment movesDEFINED -> STARTEDat the first 100-block period boundary at or after H. Miners then set bit 12, and the fork locks in once a full 100-block window has >= 80 signalling blocks. After the first window that threshold decays byn^2/5per failed window, down to a floor of 60 after 10 windows.ACTIVEfollows one window afterLOCKED_IN. So the earliest activation is about 200-300 blocks (~8-12.5 h) after the signal is mined: a few hours after the start time at the very soonest.d6220b5d9ca0318f24befcf0e6a748bb84836bd79efbdcf165867da638292220sits in block 1349780 (MTP 2025-10-22). Today's nodes usenStartTime = NEVER_ACTIVE(-2), soIsValidMNActivationtreats any time as in range and they accepted it. With this PR,CMNHFManager::GetSignalsStagemarks that signal as expired because its MTP is before the newnStartTime, so v24 nodes need a new signal after the start time. I confirmed this on a copy of a synced testnet datadir running this branch offline. It logsmnhf signal bit=12 height:1349780 is expired, andgetdeploymentinfoshowsv24asdefinedwithstart_time 1790208000.signal_time < -2is never true. So a block containing the new bit-12 MnEHF tx failsCMNHFManager::ProcessBlockthere withbad-mnhf-duplicate. Old nodes therefore split off when the new signal is mined, soon after the start time, not at activation. Old miners skip the duplicate signal in block assembly and keep extending their own chain. In practice, testnet nodes (masternodes and miners in particular) need to run the RC before the start time, and that is one more reason to pick a date that leaves room after rc.1 is published.How Has This Been Tested?
Tested on macOS arm64 (Darwin 25.5),
./configure --without-gui --disable-bench --disable-fuzz-binaryagainst an existing depends prefix:make -j12builds cleanly. Built withBITCOIN_GENBUILD_NO_GIT=1,src/dashd -versionreportsDash Core version v24.0.0-unk, andbitcoin-config.hhasPACKAGE_VERSION "24.0.0". With git build info the version string comes fromgit describe, so it only showsv24.0.0-rc.1once that tag exists.src/test/test_dash --run_test=versionbits_tests,evo_mnhf_tests,argsman_testspasses (no errors).test/functional/test_runner.py feature_mnehf.py feature_versionbits_warning.py rpc_blockchain.pypasses:feature_mnehf.py,feature_versionbits_warning.py, andrpc_blockchain.pyunder both v1 and v2 transport. These run on regtest, where the V24 params are unchanged, so they show that the EHF/versionbits machinery is unaffected. They do not exercise the new testnet value.dashdoffline (-connect=0) on an APFS clone of a testnet datadir synced to height 1549291 and checkedgetdeploymentinfo, plus the expired-signal log line described above.test/lint/lint-whitespace.pypasses.src/chainparams.cppis not intest/util/data/non-backported.txt, so the clang-format CI job does not cover it; the comment column follows the existing alignment and the chore: v20 Testnet signaling starttime #5567 precedent.Breaking Changes
Testnet only. After 2026-09-24 00:00 UTC, v24 masternodes on testnet will sign and mine a new bit-12 MnEHF signal, and testnet nodes running v23.x or older develop builds will reject the block that contains it (see above). Mainnet behaviour is unchanged. Apart from the version string, nothing else changes.
Checklist:
🤖 Generated with Claude Code