Skip to content

build: add rudimentary support for Rust components in build system, crate vendoring, patch loader paths to Guix store locations - #7109

Draft
kwvg wants to merge 20 commits into
dashpay:developfrom
kwvg:rust_build
Draft

kwvg wants to merge 20 commits into
dashpay:developfrom
kwvg:rust_build

Conversation

@kwvg

@kwvg kwvg commented Jan 19, 2026 •

Copy link
Copy Markdown
Collaborator

Additional Information

  • Depends on backport: merge bitcoin#30423, #27038, #31048, #31099, #31172, #31450, #31608, #31818, #29881, #32458, #32400, #32760, #33178, #33312, #33780, #33181, #34102, partial bitcoin#29023, #30454, #30509, #30510, #31105, #32922, #33489, #33445 (build backports: part 5) #6927

  • Depends on build: target aarch64 over armv7, update to macOS 15.0 SDK (Xcode 16.0), add verification step to setup-sdk #7184

  • On top of ntdll.dll, Rust's standard library has a hard dependency on api-ms-win-core-synch-l1-2-0.dll (sync primitives) after rust-lang/rust#124019, which has been added to the allowlist even though this dependency isn't specified in RUST_LIBS.

  • The build system passes information about the host compiler, target macOS version and other parameters as Rust crates themselves may be FFI bindings to C/C++ codebases, this is specifically relevant for cross-compilation where host and target do not match. depends exposes whatever is needed but if attempting to build without depends, the following environment variables need to be defined.

    • OSX_MIN_VERSION (target version of macOS)
    • OSX_SDK (path to the macOS SDK)
    • NATIVE_AR (host archiver)
    • NATIVE_CC (host C compiler)
    • NATIVE_CXX (host C++ compiler)
    • RUST_NATIVE (host Rust target, if cannot be deduced by build system)
  • For integrating the crates into our C++ codebase, we use the cxx crate with the version defined in native_cxxbridge.mk

  • The version of Rust defined in native_rust.mk and rust-toolchain.toml must match as the former is what we use in depends (and is the same version used in the Guix environment, we don't rely on Guix to supply us a Rust build environment) and the latter is used to ensure that builds outside depends use a matching Rust version.

    • The version should also be synced with rust_stdlib.mk, which defines the standard libraries used. All hosts (native_rust) will have a target (rust_stdlib) but not all targets will have a host. Version management is done using contrib/devtools/update-rust-hashes.py and contrib/devtools/update-native-cxxbridge.py.

      • To avoid glibc-related issues in Guix builds due to conflicting versions, incompatible symbols or the mixing of code generated with different glibc targets, we have opted to use the musl variant of the standard library for Linux builds. Non-depends builds will need to configure their Rust environment accordingly.

      • To allow PowerPC target builds, we had to move from Rust 1.82 (the minimum version demanded by cxx) to 1.85.1

    • This also means that the CI Docker image does not have a Rust compiler as it is supplied by depends. This is done due to the fact that we already need a depends-supplied compiler to have greater control over version and variant but also to avoid increasing the size of our already-large master image.

      Future work on the CI system could provide Rust compilers to aid in debugging and development (as development images are derived from CI images) but that is out of scope for this PR.

  • The depends system introduces the following verbs

    • download-rust-src (downloads packages necessary for vendoring)

    • download-rust-std (downloads the standard library for all targets listed in rust_stdlib.mk, needed as Guix environments do not have access to the internet)

    • vendor-dep-crates (vendors dependencies by Rust packages in the depends system)

    • vendor-all-crates (vendors dependencies by Rust packages used in the codebase)

      • During development and when building without the depends system, you will need to use --enable-online-rust, failing which, you will need to define RUST_VENDORED_SOURCES (a value that is otherwise defined by the depends system).

      • Vendoring support was added as Guix environments have no access to the internet and to allow for caching crates for CI.

  • As the Guix environment does not use normal paths, we have to do the inverse of the patch that is usually done to binaries generated in Guix environments (replacing the loader with standard paths instead of store-specific paths) to ensure our native binaries will run and additionally locate the GCC runtime (libgcc_s.so.1) and move it to a location reachable to the native binaries and patch that patch too.

    This is done using contrib/guix/libexec/fix-elf-interpreter.sh and is meant only for the Guix environment as it assumes that it will always run on a Linux host.

How Has This Been Tested?

Running dashd or dash-qt should have this entry in their debug log (see below) demonstrating a call to the stub crate during init.

[...]
2026-01-19T12:56:31Z Command-line arg: testnet=""
2026-01-19T12:56:31Z chirp 0.1.0 built with rustc 1.85.1 (4eb161250 2025-03-15) reports "cheep cheep"
2026-01-19T12:56:31Z Using at most 125 automatic connections (285 file descriptors available)
2026-01-19T12:56:31Z Using 16 MiB out of 32/2 requested for signature cache, able to store 524288 elements
2026-01-19T12:56:31Z Using 16 MiB out of 32/2 requested for script execution cache, able to store 524288 elements
[...]

Breaking Changes

None expected.

Checklist

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated relevant unit/integration/functional/e2e tests
  • I have made corresponding changes to the documentation
  • I have assigned this pull request to a milestone (for repository code-owners and collaborators only)

@kwvg kwvg added this to the 23.1 milestone Jan 19, 2026
@github-actions

github-actions Bot commented Jan 19, 2026 •

Copy link
Copy Markdown

✅ No Merge Conflicts Detected

This PR currently has no conflicts with other open PRs.

@kwvg kwvg changed the title build: add build: add rudimentary support for Rust components in build system, update to macOS SDK 15.2 (from Xcode 16.0), target aarch64 over armv7 Jan 19, 2026
@kwvg kwvg changed the title build: add rudimentary support for Rust components in build system, update to macOS SDK 15.2 (from Xcode 16.0), target aarch64 over armv7 build: target aarch64 over armv7, add rudimentary support for Rust components in build system, update to macOS SDK 15.2 (from Xcode 16.0) Jan 19, 2026
@github-actions

Copy link
Copy Markdown

This pull request has conflicts, please rebase.

PastaPastaPasta added a commit that referenced this pull request Jan 24, 2026
, bitcoin#31099, bitcoin#31172, bitcoin#31450, bitcoin#31608, bitcoin#31818, bitcoin#29881, bitcoin#32458, bitcoin#32400, bitcoin#32760, bitcoin#33178, bitcoin#33312, bitcoin#33780, bitcoin#33181, bitcoin#34102, partial bitcoin#29023, bitcoin#30454, bitcoin#30509, bitcoin#30510, bitcoin#31105, bitcoin#32922, bitcoin#33489, bitcoin#33445 (build backports: part 5)

ad5c299 doc: add release notes (Kittywhiskers Van Gogh)
6350e93 merge bitcoin#34102: capnp 1.3.0 (Kittywhiskers Van Gogh)
e6e4ad0 merge bitcoin#33181: build for Linux HOSTS with `-static-libgcc` (Kittywhiskers Van Gogh)
e403bba merge bitcoin#33780: disable libsanitizer in Linux GCC build (Kittywhiskers Van Gogh)
88108ac partial bitcoin#33445: Update Clang in "tidy" job (Kittywhiskers Van Gogh)
f9686bb partial bitcoin#33489: Drop support for EOL macOS 13 (Kittywhiskers Van Gogh)
4a6de56 merge bitcoin#33312: Disable `UndefinedBinaryOperatorResult` check in `src/ipc` (Kittywhiskers Van Gogh)
00f46c2 merge bitcoin#33178: increase maximum allowed (runtime) GCC to 7 (Kittywhiskers Van Gogh)
49f815d partial bitcoin#32922: use notarized v28.2 binaries and fix macOS detection (Kittywhiskers Van Gogh)
7bf7523 merge bitcoin#32760: capnp 1.2.0 (Kittywhiskers Van Gogh)
369e875 merge bitcoin#32400: Use modern Windows randomness functions (Kittywhiskers Van Gogh)
62cb45b merge bitcoin#32458: move `*-check.py` scripts under `contrib/guix/` (Kittywhiskers Van Gogh)
362013a merge bitcoin#29881: use GCC 13 to build releases (Kittywhiskers Van Gogh)
bfcf58a merge bitcoin#31818: remove test-security/symbol-check scripts (Kittywhiskers Van Gogh)
973eca0 merge bitcoin#31608: Clarify min macOS and Xcode version (Kittywhiskers Van Gogh)
7f80572 merge bitcoin#31450: disable gcov in base-linux-gcc (Kittywhiskers Van Gogh)
e189624 merge bitcoin#31172: increase minimum supported Windows to 10.0 (Kittywhiskers Van Gogh)
8494bd6 partial bitcoin#31105: Update libmultiprocess library (Kittywhiskers Van Gogh)
29c8bd9 merge bitcoin#31099: drop macOS LLVM install instructions (Kittywhiskers Van Gogh)
84b1e17 fix: bump `darwin_cmake_system_version` to match `OSX_MIN_VERSION` (Kittywhiskers Van Gogh)
cdc411d merge bitcoin#31048: Bump minimum supported macOS to 13.0 (Kittywhiskers Van Gogh)
5515a69 partial bitcoin#30510: Add IPC wrapper for Mining interface (Kittywhiskers Van Gogh)
ce6504e merge bitcoin#27038: test for `_FORTIFY_SOURCE` usage in release binaries (Kittywhiskers Van Gogh)
140848d partial bitcoin#30509: Add -ipcbind option to bitcoin-node (Kittywhiskers Van Gogh)
9df31ce partial bitcoin#30454: Introduce CMake-based build system (Kittywhiskers Van Gogh)
310a652 merge bitcoin#30423: simplify `test-security-check` (Kittywhiskers Van Gogh)
3bb0e30 partial bitcoin#29023: add historical release notes for 26.0 (Kittywhiskers Van Gogh)
c725a30 docs: add omitted "Compatibility" heading to release notes template (Kittywhiskers Van Gogh)

Pull request description:

  ## Motivation

  While working on adding support for Rust to our build system (see [dash#7109](#7109)), there were sources of conflict between our current setup and the minimums demanded by Rust and our FFI crate, [`cxx`](https://github.com/dtolnay/cxx). Specifically, Dash Core currently targets building for Windows 7 ([source](https://github.com/dashpay/dash/blob/cc50446936f8436d9ac3a2442bb348d93d8ba314/configure.ac#L818), [`0x601`](https://learn.microsoft.com/en-gb/windows/win32/winprog/using-the-windows-headers)) in direct conflict with the decision by Rusts' maintainers to drop support for Windows 7 effective Rust 1.78 ([source](https://blog.rust-lang.org/2024/02/26/Windows-7/))

  More recent versions of Rust have issues that require additional workarounds (see [`rust-lang/rust#128218`](rust-lang/rust#128218)) to keep support for Windows 7 around and using older versions of Rust is infeasible since both [`cxx`](https://github.com/dtolnay/cxx) and Rust packages currently under evaluation for integration with Dash Core require Rust 1.82+.

  Additionally, non-conformant definitions in the macOS SDK cause issues when attempting to build crates with FFI definitions (see [`dtolnay/cxx#1574`](dtolnay/cxx#1574)) which is resolved by an additional SDK bump that is not in the scope of this PR as it is _above_ the SDK version used upstream but does give cause to also consider a macOS target version bump, which _is_ done by upstream.

  ## Additional Information

  * Dependent on #6919

  * Dependency for #7109

  * macOS 11 (Big Sur) had its support period elapse ~2 years ago ([source](https://endoflife.date/macos)). macOS 14 (Sonoma) is the lowest version of macOS still receiving support from Apple and the new minimum version elected by upstream.

  * Windows 7 had its _extended_ support period elapse ~5 years ago ([source](https://learn.microsoft.com/en-gb/lifecycle/products/windows-7)) with the second lowest version, Windows 8.1, had its _extended_ support period elapse ~2 years ago ([source](https://learn.microsoft.com/en-us/lifecycle/products/windows-81)).

  ## Breaking Changes

  Dash Core binaries will now target Windows 10 and macOS 14 (Sonoma), replacing the previous target Windows 7 and macOS 11 (Big Sur).

  ## Checklist

  - [x] I have performed a self-review of my own code
  - [x] I have commented my code, particularly in hard-to-understand areas **(note: N/A)**
  - [x] I have added or updated relevant unit/integration/functional/e2e tests
  - [x] I have made corresponding changes to the documentation
  - [x] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_

ACKs for top commit:
  UdjinM6:
    utACK ad5c299

Tree-SHA512: 650cbc12f2f129770623fd4e62bd7eb77ba0677ae33b765cc8359878633562e2a5c302f86d399400bb798d6a0ac5e6c030f3b8c657b63178f468bbe0d1b246a5
@github-actions

Copy link
Copy Markdown

This pull request has conflicts, please rebase.

@kwvg
kwvg force-pushed the rust_build branch 2 times, most recently from 68f1157 to 9da49be Compare January 29, 2026 11:24
@DashCoreAutoGuix

Copy link
Copy Markdown

Guix Automation has began to build this PR tagged as v23.0.2-devpr7109.9da49bec. A new comment will be made when the image is pushed.

@kwvg

kwvg commented Jan 29, 2026

Copy link
Copy Markdown
Collaborator Author

Checksums for 9da49bec

0f51f16f49d3a8efc62f2ba64525ba4396fd0b90b19ddedcdbbb1b3fc427c9e1  dashcore-23.0.2-1141-g9da49becf786-aarch64-linux-gnu-debug.tar.gz
773d174467573a17d13496d3226d69a13ca92f2240e5e621e728c577cb491de7  dashcore-23.0.2-1141-g9da49becf786-aarch64-linux-gnu.tar.gz
3cdf72193aab45a9cf6c785f970792367b46b71f1872e4594c4f1a09a64d925f  dashcore-23.0.2-1141-g9da49becf786-arm64-apple-darwin-unsigned.tar.gz
7b121a02935960bcbccadd4f4fd1658f17e8f12756cf84aa68950794a8218063  dashcore-23.0.2-1141-g9da49becf786-arm64-apple-darwin-unsigned.zip
198d8672dfdb6d59e87fe2a2a02fdc72852307fb61747a672ebc34852e44f6a6  dashcore-23.0.2-1141-g9da49becf786-arm64-apple-darwin.tar.gz
4d3452ce53537c479085f258a3b4b2ceccfdf73a8a77e873dfafe0bfdb99b691  dashcore-23.0.2-1141-g9da49becf786.tar.gz
a24013dce08ba8a2e57ed8f2c4bd034faf017902dc35faebb3dd3224990844f2  dashcore-23.0.2-1141-g9da49becf786-riscv64-linux-gnu-debug.tar.gz
f24329eeb491805d786dda053e88e17bf0e8dce29ace4942504705b86830d751  dashcore-23.0.2-1141-g9da49becf786-riscv64-linux-gnu.tar.gz
53db55c0f86fa5806be73353dff5db8b5bfdd6a2ea986fa3f28d1a7adef2ef39  dashcore-23.0.2-1141-g9da49becf786-x86_64-apple-darwin-unsigned.tar.gz
fd214166e0f9cc5a10aa0a61bb0b0b5d3d5346e96f461313e9f9ffa0bd69eb06  dashcore-23.0.2-1141-g9da49becf786-x86_64-apple-darwin-unsigned.zip
81e615e643a0929bafe4d828c0e95f9985bf113b700a5f19c1c93e505f2a3132  dashcore-23.0.2-1141-g9da49becf786-x86_64-apple-darwin.tar.gz
b0a9fe3de1469d42d127dc31233952cfebaf88359d07e1c067132226889f358d  dashcore-23.0.2-1141-g9da49becf786-x86_64-linux-gnu-debug.tar.gz
2a9b7d1f2d960f5779c5671106dcc20521198114f1d6e29bd7c46af4749cc14b  dashcore-23.0.2-1141-g9da49becf786-x86_64-linux-gnu.tar.gz
c123023f8a457d93085d8bbd0581acfb7af4e5003c81231b2e14eaac6b2cebff  dashcore-23.0.2-1141-g9da49becf786-win64-debug.zip
ddf80e8991fa8a375fecc1999edd963e02c5623a4efc31aa01c4d05672a46781  dashcore-23.0.2-1141-g9da49becf786-win64-setup-unsigned.exe
9370fc622a528d080b1337624363f4cf408d705d7c083e7520a5491b678e8748  dashcore-23.0.2-1141-g9da49becf786-win64-unsigned.tar.gz
bb0a8ee290f1ae2d908a14d67877f5573d18e4e5def2654f1816b76632973a93  dashcore-23.0.2-1141-g9da49becf786-win64.zip

@DashCoreAutoGuix

Copy link
Copy Markdown

Guix Automation has completed; a release should be present here: https://github.com/dashpay/dash-dev-branches/releases/tag/v23.0.2-devpr7109.9da49bec. The image should be on dockerhub soon.

@kwvg kwvg closed this Jan 29, 2026
@kwvg kwvg reopened this Jan 29, 2026
@DashCoreAutoGuix

Copy link
Copy Markdown

Guix Automation has began to build this PR tagged as v23.0.2-devpr7109.5443107c. A new comment will be made when the image is pushed.

@DashCoreAutoGuix

Copy link
Copy Markdown

Guix Automation has completed; a release should be present here: https://github.com/dashpay/dash-dev-branches/releases/tag/v23.0.2-devpr7109.5443107c. The image should be on dockerhub soon.

@kwvg
kwvg marked this pull request as ready for review January 29, 2026 12:44
@DashCoreAutoGuix

Copy link
Copy Markdown

Guix Automation has began to build this PR tagged as v23.1.0-devpr7109.3582e9c1. A new comment will be made when the image is pushed.

@DashCoreAutoGuix

Copy link
Copy Markdown

Guix Automation has failed with an unknown error for tag v23.1.0-devpr7109.3582e9c1

@thepastaclaw

Copy link
Copy Markdown
Collaborator

🔨 Guix build started for v23.1.0-devpr7109.3582e9c1.

Targets: x86_64-linux-gnu aarch64-linux-gnu riscv64-linux-gnu x86_64-w64-mingw32 x86_64-apple-darwin arm64-apple-darwin

A follow-up comment with checksums will be posted when the build completes.

@thepastaclaw

Copy link
Copy Markdown
Collaborator

✅ Guix build complete!

Release: https://github.com/dashpay/dash-dev-branches/releases/tag/v23.1.0-devpr7109.3582e9c1

Checksums for 3582e9c

017e60245aac43d75d701b3a65a5cdf003513bc29aa781da9c10a9fe508990a1  dashcore-23.1.0-devpr7109.3582e9c1-win64-setup-unsigned.exe
02cf9f1e38b62eaffd680b7568abc61ca0452d9b6843945e2ecab0450b5633a4  dashcore-23.1.0-devpr7109.3582e9c1-win64-unsigned.tar.gz
1d412758ca6e40fb36b48163db9306b2d84c6853e179988fd170dc99f02f8b32  dashcore-23.1.0-devpr7109.3582e9c1-x86_64-linux-gnu-debug.tar.gz
38cb62c0758bfb2fd3ae3e2c27d6bc66d0257fdbc9c6cff48313f69859cfb2b7  dashcore-23.1.0-devpr7109.3582e9c1-riscv64-linux-gnu-debug.tar.gz
3d79f784a68073a10a296e3fec4c517b5b127ca4932671fb5aafaafa29181eab  dashcore-23.1.0-devpr7109.3582e9c1-aarch64-linux-gnu.tar.gz
52f7d1da80ba3a5e714e0cbe908f1a4e2696b3a39f4efcf1fcc7116c3e458ad7  dashcore-23.1.0-devpr7109.3582e9c1-win64.zip
663da4033f251b9465f971bd0959e54f3bd235917f0d58665583832c6bb80435  dashcore-23.1.0-devpr7109.3582e9c1-aarch64-linux-gnu-debug.tar.gz
7567cd7a9312347da5c6e595ebe2395fa9205f88355ba017b3abf8f6a7a148d1  dashcore-23.1.0-devpr7109.3582e9c1-x86_64-apple-darwin-debug.tar.gz
75ff30dcd12fb6eb10cb2ce247deb5ba1a5d58365a32d42cb2050011fec7ac88  dashcore-23.1.0-devpr7109.3582e9c1-riscv64-linux-gnu.tar.gz
76807da7091fe002c7a430f4b299fff427ebd0710a52557ab23fb18cc3be4e05  dashcore-23.1.0-devpr7109.3582e9c1-arm64-apple-darwin-unsigned.zip
d90822d9b2f23e075d742cf4ab2271128cced9162f3fa2f4f53eb86f65150eac  dashcore-23.1.0-devpr7109.3582e9c1-arm64-apple-darwin.tar.gz
e353fafb1bb3dd7948b616c91e5a9376cfd94bdfd22595a8458c7d70fb00be08  dashcore-23.1.0-devpr7109.3582e9c1-arm64-apple-darwin-unsigned.tar.gz
e5b64918ebc69a9737c2afeac7a8e10fb3b6e251d06dfa7dc14c59c8a5605b4c  dashcore-23.1.0-devpr7109.3582e9c1-x86_64-linux-gnu.tar.gz
e9aba0b15cacc14aaa9f707623f5323900695f90bc952bf1a4b6d436b4c07b9c  dashcore-23.1.0-devpr7109.3582e9c1-x86_64-apple-darwin.tar.gz
ed53fb1eeb092c17fa076473f888ef78eacd385924e7796222a10d36a674084e  dashcore-23.1.0-devpr7109.3582e9c1-x86_64-apple-darwin-unsigned.zip
ef03f80b1e2a7989327434b0db65d7819041e6fd0dea50683ecbbf0c72b8f6ff  dashcore-23.1.0-devpr7109.3582e9c1.tar.gz
ef80c3938665c80791ec0dbb8e7dafbcc0188d1cb601474903f8fbe31b3b476a  dashcore-23.1.0-devpr7109.3582e9c1-arm64-apple-darwin-debug.tar.gz
f16f25aa24d58ad3785849af4fe89183826e9d18bbfa3c57405297340aec33df  dashcore-23.1.0-devpr7109.3582e9c1-x86_64-apple-darwin-unsigned.tar.gz
f93ca00951b1bf3cc9d363ed6ec1f80406a0c1ac674f9ed9f02d505c69e519bc  dashcore-23.1.0-devpr7109.3582e9c1-win64-debug.zip

@github-actions

Copy link
Copy Markdown

This pull request has conflicts, please rebase.

1 similar comment
@github-actions

Copy link
Copy Markdown

This pull request has conflicts, please rebase.

PastaPastaPasta added a commit to PastaPastaPasta/dash that referenced this pull request Aug 10, 2026
…st track

Measured spike results comparing three integration scopes for rebuilding
the platform-gui internals on real dashpay/platform crates (grovedb, drive,
dpp) via the dashpay#7109 Rust build track. Recommends the crypto-core
scope: canonical proof verification and DPP signing in Rust with zero async
runtime, keeping PR 49's C++ transport, quorum-sig check, GUI, and wallet
seams. Spike workspaces with lockfiles and test harnesses live in
~/workspace/platform-rust-spikes.
PastaPastaPasta added a commit to PastaPastaPasta/dash that referenced this pull request Aug 13, 2026
…st track

Measured spike results comparing three integration scopes for rebuilding
the platform-gui internals on real dashpay/platform crates (grovedb, drive,
dpp) via the dashpay#7109 Rust build track. Recommends the crypto-core
scope: canonical proof verification and DPP signing in Rust with zero async
runtime, keeping PR 49's C++ transport, quorum-sig check, GUI, and wallet
seams. Spike workspaces with lockfiles and test harnesses live in
~/workspace/platform-rust-spikes.

(cherry picked from commit d3a81f2)
PastaPastaPasta added a commit to PastaPastaPasta/dash that referenced this pull request Aug 18, 2026
…st track

Measured spike results comparing three integration scopes for rebuilding
the platform-gui internals on real dashpay/platform crates (grovedb, drive,
dpp) via the dashpay#7109 Rust build track. Recommends the crypto-core
scope: canonical proof verification and DPP signing in Rust with zero async
runtime, keeping PR 49's C++ transport, quorum-sig check, GUI, and wallet
seams. Spike workspaces with lockfiles and test harnesses live in
~/workspace/platform-rust-spikes.

(cherry picked from commit d3a81f2)
@thepastaclaw

Copy link
Copy Markdown
Collaborator

🕓 Review not started yet because this PR is a draft.

  • Request normal review — click when the PR is ready for review.
  • Request priority review — click to move this review to the front of the queue.

Commit 3582e9c. Normal review starts when eligible; priority review starts as soon as a slot is available.

PastaPastaPasta added a commit that referenced this pull request Nov 4, 2026
2bf133c docs: cite #8042 for the index fixes in the v24.0.0 release notes (pasta)
8aa11f6 docs: add the v24.0.0-rc.7 picks and index fixes to the v24.0.0 release notes (pasta)
ad4e5d6 docs: drop the index caveat from the -reindex-chainstate man page entry (pasta)
19a90bb test: blocks orphaned while the address index is disabled are removed from it (pasta)
d2f2a1f fix(index): don't adopt an empty or rebuilt async index as migrated legacy data (pasta)
e3bafdb fix(index): reject an uncommitted tip the block index lost (pasta)
9198962 fix(index): check the blocks governance resumes from at startup (pasta)
baff347 fix(index): resume from the tip a skipped commit leaves behind (pasta)
2dbf5ca fix(index): write a rewound block's erasures in one batch with its locator (pasta)
252acbe fix(index): move the committed locator below the entries a rewind erases (Konstantin Akimov)
e9f9c8a Merge bitcoin#36150: indexes: set prune lock to genesis before first block (Konstantin Akimov)
2edeb98 partial Merge bitcoin#34897: indexes: Don't commit ahead of the flushed chainstate (Konstantin Akimov)
3eba84c Merge bitcoin#32875: index: handle case where pindex_prev equals chain tip in NextSyncBlock() (Konstantin Akimov)
399125c Merge bitcoin#32882: index: remove unnecessary locator cleaning in BaseIndex::Init() (Konstantin Akimov)
bb724c6 Merge bitcoin#33212: index: Don't commit state in BaseIndex::Rewind (Konstantin Akimov)
d5ff431 Merge bitcoin#32878: index: fix wrong assert of current_tip == m_best_block_index (Konstantin Akimov)
31c7d8f partial Merge bitcoin#32580: wallet, test: best block locator matches scan state follow-ups (Konstantin Akimov)
94f5c58 partial Merge bitcoin#30221: wallet: Ensure best block matches wallet scan state (Konstantin Akimov)
8e0b1e8 partial Merge bitcoin#32069: test: fix intermittent failure in wallet_reorgsrestore.py (Konstantin Akimov)
4d17947 Merge bitcoin#25193: indexes: Read the locator's top block during init, allow interaction with reindex-chainstate (Konstantin Akimov)
0127df8 Merge #8045: test: scale the mempool-loaded wait by timeout_factor so TSAN reindex restarts stop timing out (pasta)
62d0cef Merge #8036: fix(qt): let a shared masternode participant follow a revised invitation that keeps their share (merge-script)
775d31c Merge #8018: fix(consensus): require IPv4 masternode primaries until IPv4 is optional, pin mainnet ports (merge-script)
e1b826e Merge #8026: fix(qt): keep shared masternode contribution fields locked while coins are reserved (merge-script)
9fa3df3 Merge #8020: fix(rpc): make protx shared_sign sign only dissolutions that return every principal (merge-script)
246a465 Merge #8024: fix(qt): keep the shared masternode dissolve dialog consistent with what it will send (merge-script)
590ad0a Merge #8021: fix(qt): don't load a newer shared masternode session copy that changes your own share (merge-script)
974aaa3 Merge #8034: fix(qt): check a shared masternode's service and refund addresses before coins are reserved (merge-script)
0026e3e Merge #8027: fix(qt): fund a shared masternode's service update from this wallet by default (merge-script)
6a5d2dc Merge #8035: fix(qt): don't strand coins reserved for a shared masternode session (merge-script)
df6083a Merge #8032: fix(qt): don't offer a new operator key when reopening a shared masternode session (merge-script)
2b5bf30 Merge #8029: fix: let dashd -version, -help and first start work without an existing data directory (merge-script)
e33d9b1 Merge #8037: docs: list the config file path each Linux init system uses (merge-script)
6030ea0 docs: add the #8014 migratewallet fixes to the v24.0.0 release notes (pasta)
1b1ea95 Merge #8014: backport: bitcoin#28609, bitcoin#34215, bitcoin#34226, bitcoin#34370, partials bitcoin#31423, bitcoin#34156 (migratewallet fixes from 28.x) (merge-script)
608ff63 Merge bitcoin#28542: wallet: Check for uninitialized last processed and conflicting heights in MarkConflicted (DCG-Claude)
3af6f63 Merge bitcoin#28038: wallet: address book migration bug fixes (DCG-Claude)
2fe41fb docs: add ecosystem notes on Asset Unlock txids, coinbase payees and RPC errors (pasta)
0e3f653 docs: correct operator guidance in the v24.0.0 release notes for rc.7 (pasta)
11c8140 Merge #8019: fix(qt): stop reporting refused shared masternode broadcasts as sent (merge-script)

Pull request description:

  ## Issue being fixed or feature implemented

  Backports and release prep for v24.0.0-rc.7, on top of `v24.0.x` at 8d195f1 (v24.0.0-rc.6, #8013). This PR collects the develop merges labeled `backport-candidate-24.0.x`, the v24.0.x port of #8042 with the index fixes from #8033, and the release notes for them, so rc.7 has a single backport PR to merge.

  ## What was done?

  ### Picked

  Cherry-picked with `git cherry-pick -m1 -x`, in develop merge order, except that bitcoin#28038 goes before bitcoin#28542 as in Bitcoin Core. Each pick changes exactly the same lines as its develop merge, except as noted below for bitcoin#28542, #8014, #8020 and #8018.

  - #8019 fix(qt): stop reporting refused shared masternode broadcasts as sent
  - bitcoin#28038 (from #7863): prerequisite of #8014
  - bitcoin#28542 (from #7762): prerequisite of #8014. Its `test_conflict_txs` migrates through `self.migrate_wallet`, as on develop since bitcoin#28868.
  - #8014 backport: bitcoin#28609, bitcoin#34215, bitcoin#34226, bitcoin#34370, partials bitcoin#31423, bitcoin#34156 (migratewallet fixes from 28.x), with the Dash adaptations below
  - #8037 docs: list the config file path each Linux init system uses
  - #8029 fix: let dashd -version, -help and first start work without an existing data directory
  - #8032 fix(qt): don't offer a new operator key when reopening a shared masternode session
  - #8035 fix(qt): don't strand coins reserved for a shared masternode session
  - #8027 fix(qt): fund a shared masternode's service update from this wallet by default
  - #8034 fix(qt): check a shared masternode's service and refund addresses before coins are reserved
  - #8021 fix(qt): don't load a newer shared masternode session copy that changes your own share
  - #8024 fix(qt): keep the shared masternode dissolve dialog consistent with what it will send
  - #8020 fix(rpc): make protx shared_sign sign only dissolutions that return every principal. Its `doc/release-notes-7437.md` sentence goes into the same paragraph of `doc/release-notes.md`, since that file was folded in for v24.0.0.
  - #8026 fix(qt): keep shared masternode contribution fields locked while coins are reserved (merged on develop as cc73a04; GitHub shows the PR as closed)
  - #8018 fix(consensus): require IPv4 masternode primaries until IPv4 is optional, pin mainnet ports, with the adaptation below
  - #8036 fix(qt): let a shared masternode participant follow a revised invitation that keeps their share
  - #8045 test: scale the mempool-loaded wait by timeout_factor so TSAN reindex restarts stop timing out

  ### Index fixes: #8042 port and #8033

  The index commits are #8042 (merge 9e5e3d5), ported commit by commit to `v24.0.x`, plus the parts of #8033 that #8042 doesn't cover. #8042's v24.0.x port replaces #8033's bitcoin#33212, bitcoin#34897 and rewind-locator commits, and #8033's flushed-block announcement fix (e6a687b) is dropped: bitcoin#30221 removes the wallet's `ChainStateFlushed` locator write, and nothing else on `v24.0.x` consumes that notification. This PR replaces #8033, and #8031 comes in through it (adapted to the `v24.0.x` `CCoinsViewDB` constructor), not as a separate pick.

  - bitcoin#25193 (from #7883, via #8033): indexes: read the locator's top block during init, allow interaction with `-reindex-chainstate`
  - From #8042: partial bitcoin#32069 (only `TestNode.kill_process()`, with develop's `wait_until_stopped(**kwargs)` handling it needs), partial bitcoin#30221, partial bitcoin#32580, bitcoin#32878, bitcoin#33212, bitcoin#32882, bitcoin#32875, partial bitcoin#34897, bitcoin#36150, and #8042's own fixes: move the committed locator below the entries a rewind erases; write a rewound block's erasures in one batch with its locator; resume from the tip a skipped commit leaves behind; check the blocks an index resumes from at startup; reject an uncommitted tip the block index lost
  - From #8033: #8031 fix(index): don't adopt an empty or rebuilt async index as migrated legacy data; test: blocks orphaned while the address index is disabled are removed from it; docs: drop the index caveat from the `-reindex-chainstate` man page entry

  #### Dash adaptations for #8042

  - The governance collateral index doesn't exist on `v24.0.x`, so its hunks are dropped; from the startup resume check only the `base.{h,cpp}` part is kept.
  - `feature_pruning.py`: node 5 syncs before node 0's pruned restart, and `test_rescan_blockchain` expects the governance-disabled stderr a pruned node prints on `v24.0.x`.
  - The wallet's `blockConnected` has no birthday skip on `v24.0.x`.
  - `TestNode.wait_until_stopped()` keeps `v24.0.x`'s `None` default for a clean exit.

  Apart from these, the `v24.0.x` index, validation and index test sources differ from develop after #8042 only by differences that already existed before it.

  #### Dash adaptations for #8018

  `v24.0.x` predates bitcoin#26177, so it has no `src/kernel/chainparams.cpp` and no `GetBuriedDeployment()`. The four `IPv4OptionalHeight` values (mainnet not scheduled, testnet 0, devnet 0, regtest only through `-testactivationheight=ipv4_optional@<height>`) go into the matching classes in `src/chainparams.cpp`, and `ipv4_optional` is parsed in its `MaybeUpdateHeights()`. The `GetBuriedDeployment()` hunk is dropped; the `DeploymentName()` case is kept. Every other file, including all tests, changes exactly the same lines as the develop merge. The same notes are in the pick's commit message.

  #### Dash adaptations for #8014

  #8014 doesn't cherry-pick cleanly onto `v24.0.x`. The conflicts were resolved against `v24.0.x` APIs. No prerequisite was backported, and no hunk or test was dropped. The same notes are in the pick's commit message.

  - `src/wallet/bdb.{cpp,h}`, `dump.cpp`, `sqlite.{cpp,h}`, `transaction.{cpp,h}`, `wallet.cpp`: the changed lines are identical to the develop merge. In `wallet.cpp`, the conflict was with develop-only context (`CanGrindR`), which stays out.
  - `src/wallet/db.h`: #8014 makes `WalletDatabase::Files()` pure virtual. `v24.0.x` still defines `DummyDatabase` in `db.h`, so it gets the `Files()` override there.
  - `src/wallet/test/wallet_tests.cpp`: the test database mock on `v24.0.x` is `FailDatabase`, so it gets the same `Files()` override. `src/wallet/salvage.cpp` and `src/wallet/test/util.h` keep the `v24.0.x` side, since develop's `DummyDatabase`/`MockableDatabase` placement doesn't exist here.
  - `test/functional/tool_wallet.py`, `wallet_backup.py`, `wallet_migration.py`: the test framework on `v24.0.x` has no `TestNode.wallets_path`/`datadir_path` (bitcoin#27884), so the new tests build these paths with `os.path.join` and pass RPC paths as strings. `wallet_migration.py` takes only #8014's new tests, not the develop-only tests around them.
  - `test/functional/wallet_migration.py`: `unsynced_wallet_on_pruned_node_fails` stops its pruned node with `EXPECTED_STDERR_NO_GOV_PRUNE`, because on `v24.0.x` a pruned node still prints the governance-disabled warning. The rc.6 picks handled the same warning the same way.

  ### Separate v24.0.x PRs, merged separately

  - #8016 backport: v23.1.10 fixes for v24.0.x
  - #8022 backport: bind CoinJoin signatures to the approved transaction (#7815) for v24.0.x, which depends on #7815 merging on develop

  #8016 and #8022 each merge cleanly with this branch in either order, and all three merge to the same tree in any order.

  ### Not picked

  - #8025: closed; superseded by #8014 (picked above)
  - #8031 is not picked separately; it comes through #8033's commits above.
  - #8039, #8040, #8041, #8043, #8044 (CI and tooling), #7905, follow-ups to #8042, and the PRs in the 24.1 milestone.
  - Explicitly deferred: #7870, #7679, #7675, #7220, #7217, #7109, #6988, #4974, #8028.

  ### Release notes

  `doc/release-notes.md` corrections, checked against the code on this branch:

  - **Version 2 Asset Unlocks:** version 1 Asset Unlocks stay valid after `v24` activation. Platform withdrawals keep using version 1 until a future Dash Platform release issues version 2, so the stable txid, InstantSend locking and instance-hash relay don't apply to them yet.
  - **Masternode requirements:** the startup refusals (#7754) and the DKG bad votes for missing transaction relay or compact filters (#7755) apply from the first start of v24.0.0, not from activation. Operators should remove conflicting settings and upgrade before the `v24` start date (November 9, 2026), so their masternodes are running when the activation signal is signed. `-peerblockfilters=0` is the new refusal; `-blockfilterindex=0` already failed on v23.
  - **How to Upgrade:** a pruned node with `-addressindex` or `-spentindex` now refuses to start; v23 accepted that combination.
  - **Downgrading:** there is no supported downgrade after `v24` activation: older versions can't follow the network, and they misread the masternode list data v24.0.0 writes. Before activation, downgrading to v23.1.x works with the listed caveats. Dash-Qt's dust-protection setting is migrated to the shared settings, so it reads as disabled after a downgrade.
  - **Dash Platform:** Platform/dashmate v5.0.0 and later handle the hidden `service` and `softforks` RPC fields. Older Platform versions need both `-deprecatedrpc` options.
  - **Compatibility:** users on macOS 13 or older must upgrade macOS, or move their node, before activation.
  - **Legacy wallets:** in v24, `createwallet` with `descriptors=false` also needs `load_on_startup`; before v24 this applied only to `descriptors=true`. The notes now give a working example.
  - **Wallet migration (#8014):** failure handling in `migratewallet`, `restorewallet` and `dash-wallet createfromdump` is fixed, and the new backup and watch-only/solvables wallet names are listed.
  - **Ecosystem notes:** the txid of a version 2 Asset Unlock zeroes `requestedHeight`, `quorumHash` and `quorumSig` before hashing (the full-bytes hash is `instanceHash`); pools should emit one coinbase output per `masternode[]` and `superblock[]` template entry, since merged or deduplicated payees are invalid after activation; client libraries that send numbers or booleans as strings fail (#7099); and some wallet RPC error messages changed with upstream backports.
  - **rc.7 picks:** `doc/release-notes-8018.md` and `doc/release-notes-8029.md` are folded in and removed. #8018's IPv4-primary and mainnet standard-port rules are under Extended addresses, with a pointer from the masternode upgrade notes; #8029's `dash.conf` change is under Updated settings. The other rc.7 picks fix code that is new in v24 and need no release note.
  - **Index fixes (#8042, #8031):** nodes that ran a release candidate with the address, spent or timestamp index should rebuild them once (with `-reindex`, or by starting once with them disabled, deleting their `indexes/` directories and starting with them enabled). The notes also cover `-reindex-chainstate` with indexes enabled, older versions refusing a migrated index until `-reindex`, the new "the block the index was last synced to is not found. Please rebuild the index." startup error, and the known limitation shared with earlier versions in the remaining cases.
  - All rc.7 TODO comments are resolved.

  `configure.ac` is already 24.0.0 with `CLIENT_VERSION_IS_RELEASE` false, so the version string comes from the `v24.0.0-rc.7` tag. The man pages carry #8033's `-reindex-chainstate` change; no other pick changes non-debug help text (#8018's `-testactivationheight` change is debug-only).

  ## How Has This Been Tested?

  On this head (2bf133c):
  - Every develop pick compared with its develop merge (`git patch-id --stable` and the set of changed lines). #8019, #8037, #8032, #8035, #8027, #8034, #8021, #8024, #8026, #8036 and #8045: identical. #8029: the same changed lines; only context differs in `feature_config_args.py`. #8020: the same changed lines, in `doc/release-notes.md` instead of `doc/release-notes-7437.md`. #8018: identical except the adaptation above, checked file by file against 900f085 and reviewed separately for consensus equivalence on mainnet, testnet, devnet and regtest. #8014 and its prerequisites: as in the earlier rounds (adaptations above).
  - #8042 port: `v24.0.x`'s divergence from develop, before #8042 (058b060) versus after it (9e5e3d5), is unchanged in `src/index/*`, `src/validation.{h,cpp}`, the index unit tests and `feature_coinstatsindex.py`, apart from the adaptations listed above. The #8031, test and man page commits have the same patch-id and message as on #8033.
  - Built with `--enable-debug --enable-werror` and Qt: no warnings.
  - Unit suites pass: `baseindex_tests`, `index_migration_tests`, `txindex_tests`, `blockfilter_index_tests`, `coinstatsindex_tests`, `validation_flush_tests`, `wallet_tests`, `interfaces_tests`, `evo_netinfo_tests` and `evo_snapshot_tests`. With the develop picks (7275005), every `evo_*` suite and `test_dash-qt` (15 classes, 152 passed, 0 failed) passed too.
  - Functional tests pass: `rpc_netinfo.py`, `feature_masternode_shares.py`, `wallet_migration.py`, `feature_coinstatsindex.py` (including the unclean restart after a reorg), `feature_addressindex.py`, `feature_config_args.py` and `feature_index_prune.py`. On the same C++ tree, these pass as well: `feature_spentindex.py`, `feature_timestampindex.py`, `feature_pruning.py`, `feature_txindex.py`, `feature_reindex.py`, `feature_init.py`, `feature_abortnode.py` and `wallet_reorgsrestore.py`.
  - Regtest upgrade gates, run on a build of this exact head: all pass. They cover v23.1.10 index migration, index contents vs v23 and `-reindex`, a kill mid-migration, 9 wallets, a pre-activation downgrade and round trip, and v22.1.3/v23.0.2 upgrades. The crash-after-reorg probe and the deleted-index probe are both required to be not reproduced: 0/10 stale (rc.6: about 4/10), and the plain-delete rebuild matches.
  - Man pages: `help2man` output of the built `dashd`, `dash-cli`, `dash-tx`, `dash-wallet` and `dash-util` matched `doc/man` on the develop picks (apart from the debug-build-only `lock` log category). No later commit changes non-debug help text, so nothing is regenerated beyond #8033's `-reindex-chainstate` change.
  - `git merge-tree` against #8016 (cdb250c) and #8022 (62609bf), heads fetched 05:23 UTC: clean in both orders, and all three merge to the same tree in every order.

  From the earlier rounds: the wallet suites and functional tests listed for #8014, bitcoin#28038 and bitcoin#28542 passed, and the `createwallet` example was checked against the official v24.0.0-rc.6 binary.

  ## Breaking Changes

  - From #8014: migration backups are now named `<name>_<time>.legacy.bak`, the unnamed wallet's watch-only and solvables wallets are named `default_wallet_watchonly` and `default_wallet_solvables`, and `restorewallet` accepts an existing empty directory.
  - From #8018: on mainnet, a version 3 ProRegTx or ProUpServTx must list an IPv4 address on the standard port as the first entry of each address list; testnet and devnets are unaffected.
  - From #8029: `dashd` no longer creates an empty `dash.conf`.
  - From #8031: older versions refuse an index migrated by v24.0.0 until they run `-reindex`; nodes that ran a release candidate should rebuild these indexes once.
  - From #8042: an index whose last synced block was lost in an unclean shutdown makes startup fail with a rebuild instruction.

  The release notes describe these.

  ## Checklist:
  - [x] I have performed a self-review of my own code
  - [x] I have made corresponding changes to the documentation
  - [x] I have assigned this pull request to a milestone

  🤖 Generated with [Claude Code](https://claude.com/claude-code)

Top commit has no ACKs.

Tree-SHA512: 3c405ef570fc1c5b46d1ba8bb2e344213cf65018abe5ef4b94b7cf2b9aa7160ba2675f71a0a365c72bc8249a2f9a5defe774af2a4e33537245aeb420c5f66711
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants