You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Dash-QT has long lacked first-class Dash Platform support: usernames (DPNS), DashPay profiles, contact requests, and contact-to-contact payments — the feature set of the DashPay mobile wallets — without coupling Dash Core to Platform.
A complete implementation exists in PastaPastaPasta#67. The original implementation, PastaPastaPasta#49, was about 17.9k lines and included hand-written C++ versions of GroveDB proof verification, codecs, and BLAKE3. The architecture pivoted on 2026-08-07/08 to use the canonical Platform Rust crates and upstream transport-free query/verification components instead. #49 remains provenance; #67 is the composite integration and manual-test reference.
The implementation is being landed as small, reviewable PRs across dashpay/dash and dashpay/platform. This issue is the living cross-repo map.
Optional Rust/CXX foundation. Mergeable, but source-tarball bridge freshness mishandles equal-second ustar timestamps; optional-Rust workflow documentation is also requested. Guix automation additionally needs a commit signed by an authorized Core team member.
Wallet seams. Mergeable, but only corrupt platform/seed-id records should fail wallet loading, and nonempty mnemonics must be validated before Platform seed derivation.
Node interfaces. Conflicts with current develop; targeted endpoint, quorum-key, and IS-lock serialization tests are missing. Domain endpoint widening is not currently planned because the first Platform endpoint is guaranteed to be a CService; tests should pin that invariant.
dash-platform-queries extraction. Mergeable; README must describe the declared breaking migrations instead of promising no SDK-user changes. Codecov reds are threshold noise on code motion.
Request decoding and pure builders, stacked on #4388. CI green, but proof verification must reject wire versions unavailable at the supplied PlatformVersion and document limits above DEFAULT_QUERY_LIMIT.
Current full integration. Mergeable; ASAN red is known QDBus LSan noise. It pins #4389 and therefore inherits its verifier blockers. Seed recovery exists here but is not extracted and has not completed a live-testnet recovery E2E.
Compile-time optional GUI feature:--enable-platform-gui. dashd and dash-cli link no Rust; default developer builds do no Rust work. The target release configuration enables Platform GUI for dash-qt, making deterministic Guix builds with the feature enabled a release gate.
Canonical Rust crates: proof verification, response decoding, and state-transition/document construction use the real dashpay/platform crates behind a CXX bridge. The in-Core rust/platform wrapper is interim.
Core-owned C++ responsibilities: gRPC-Web/HTTP1.1/TLS transport using mbedTLS; endpoint selection, retry, and backoff from the locally synced deterministic masternode list; wallet signing seams; and Qt UI.
Local trust anchor: queries use prove=true. Rust FromProof verification receives locally synced Platform LLMQ keys through ContextProvider; no remote key service is trusted.
Keys do not cross the FFI: Rust produces signable digests; C++/wallet code signs them. Friendship receiving keychains are imported, while a contact's outgoing chain is derived statelessly and deliberately not imported as IsMine.
Request construction target: move request construction to upstream dash-platform-queries so Core no longer maintains parallel protobuf/CBOR/bincode construction logic.
End-state FFI: wrapper/FFI logic should live upstream in dashpay/platform, with Core pinning a released upstream revision and keeping only a thin bridge.
Two independent aarch64 builders cross-compiling x86_64 produced byte-identical main, debug, and source artifacts. This is useful deterministic-build evidence, but it does not prove reproducibility across different build architectures.
Seed recovery is implemented only on the composite and currently:
supports identity index 0; nonzero identity indexes are explicitly refused;
has not completed a live-testnet recovery E2E;
reconstructs the payment cursor using a fixed 100-entry window, which could reuse a destination after more than 100 historical payments;
logs rescan BUSY/FAILURE without surfacing or retrying it; and
still needs extraction into a focused Core PR with functional coverage.
Release gates
Deterministic Guix builds with Platform GUI enabled across release targets.
Seed-only recovery extracted and covered by full-backup, mnemonic-only, and interrupted-registration recovery tests.
Live-testnet recovery E2E.
Malformed-input fuzzing of all attacker-controlled verify_* and decode_* bridge inputs.
Explicit decision on DAPI TLS authentication/certificate pinning. Reads are proof-gated, but transport authentication remains a release-level design decision.
Flag-on builds from release source tarballs, including pre-generated CXX bridge artifacts and every Platform GUI header/source.
Correct upstream verifier parity for supported wire versions and server query limits.
Extract seed recovery as the next focused Core PR.
Continue the transport, identity/profile UI, and contacts/send-to-username train.
The earlier Aug. 20–21 RC1 target assumed the foundations would already be review-clear. With multiple correctness blockers still open on Aug. 17, that schedule is at material risk and should not be represented as committed until the immediate items above are cleared.
2026-08-01 — DIP-14 compatibility semantics. Sub-2^32 indexes use raw BIP32 index space; the private path folds the hardened flag into the high bit, while the public path rejects high-bit indexes.
2026-08-01 — No QWizard. Registration uses QDialog + QStackedWidget because the depends/Guix Qt build disables the wizard feature.
2026-08-07 — Canonical Rust crates replace C++ reimplementations. This removed roughly 6,300 lines of hand-maintained security-critical C++ and retained byte-exact fixture coverage.
2026-08-08 — Refactor upstream rather than duplicate. Platform gained an optional transport surface and the query core is being extracted; proof verification uses upstream FromProof + ContextProvider with local LLMQ keys.
2026-08-08 — panic=unwind for the bridge. Residual parser panics from attacker-controlled bytes become catchable C++ exceptions rather than aborting dash-qt.
2026-08-11 — Keep mbedTLS transport. Drogon/Trantor did not satisfy HTTPS, cancellation, deadline, and bounded-input requirements. The transport swap seam remains isolated.
2026-08-12 — Final release target enables Platform GUI in dash-qt. Guix/release validation with the feature enabled is therefore mandatory.
2026-08-12 — Seed-only recovery is required for the wallet wave. The composite implementation is progress toward this gate, not completion of it.
2026-08-12 — FFI end state is upstream; mechanism remains TBD. Decide through a target-state E2E prototype rather than maintaining a permanent Core-owned wrapper.
What / why
Dash-QT has long lacked first-class Dash Platform support: usernames (DPNS), DashPay profiles, contact requests, and contact-to-contact payments — the feature set of the DashPay mobile wallets — without coupling Dash Core to Platform.
A complete implementation exists in PastaPastaPasta#67. The original implementation, PastaPastaPasta#49, was about 17.9k lines and included hand-written C++ versions of GroveDB proof verification, codecs, and BLAKE3. The architecture pivoted on 2026-08-07/08 to use the canonical Platform Rust crates and upstream transport-free query/verification components instead. #49 remains provenance; #67 is the composite integration and manual-test reference.
The implementation is being landed as small, reviewable PRs across dashpay/dash and dashpay/platform. This issue is the living cross-repo map.
Current status (2026-08-17)
Derive256)dapi-grpcoptionaltransportfeaturers-drive-proof-verifierplatform/seed-idrecords should fail wallet loading, and nonempty mnemonics must be validated before Platform seed derivation.develop; targeted endpoint, quorum-key, and IS-lock serialization tests are missing. Domain endpoint widening is not currently planned because the first Platform endpoint is guaranteed to be aCService; tests should pin that invariant.dash-platform-queriesextraction. Mergeable; README must describe the declared breaking migrations instead of promising no SDK-user changes. Codecov reds are threshold noise on code motion.PlatformVersionand document limits aboveDEFAULT_QUERY_LIMIT.The series is not only waiting for human review. #7580, #7581, #7591, #4388, and #4389 have concrete work remaining.
Known unrelated CI noise on the current Core branches:
QDBusConnectionManagerleak in Qt tests, reproduced across build: add optional Rust and CXX bridge support #7580, refactor: expose masternode Platform endpoints, quorum keys and islocks via node interface #7591, and fix walletpassphrase logic/params/description #67.feature_governance.pynot(24 == 25)flake; the PR does not touch governance.Architecture
--enable-platform-gui.dashdanddash-clilink no Rust; default developer builds do no Rust work. The target release configuration enables Platform GUI fordash-qt, making deterministic Guix builds with the feature enabled a release gate.rust/platformwrapper is interim.prove=true. RustFromProofverification receives locally synced Platform LLMQ keys throughContextProvider; no remote key service is trusted.IsMine.dash-platform-queriesso Core no longer maintains parallel protobuf/CBOR/bincode construction logic.Plan — dashpay/platform
dapi-grpcoptional transport featuredash-platform-queriesextraction documentation and obtain reviewrs-platform-primitives-ffivs. adaptingrs-sdk-ffi)vsss-rs branch="main", MSRV policyPlan — dashpay/dash
Foundations
Derive256Wallet/node seams
platform/seed-id; validate mnemonics; add regression testsCServiceendpoint contractPlatform client and GUI
dash-qtComposite reference and recovery state
PastaPastaPasta#67 currently combines:
Two independent aarch64 builders cross-compiling x86_64 produced byte-identical main, debug, and source artifacts. This is useful deterministic-build evidence, but it does not prove reproducibility across different build architectures.
Seed recovery is implemented only on the composite and currently:
Release gates
verify_*anddecode_*bridge inputs.Immediate critical path
The earlier Aug. 20–21 RC1 target assumed the foundations would already be review-clear. With multiple correctness blockers still open on Aug. 17, that schedule is at material risk and should not be represented as committed until the immediate items above are cleared.
Decisions log
FromProof+ContextProviderwith local LLMQ keys.panic=unwindfor the bridge. Residual parser panics from attacker-controlled bytes become catchable C++ exceptions rather than abortingdash-qt.dash-qt. Guix/release validation with the feature enabled is therefore mandatory.