DIP: Dash Platform Application Key Exchange and State Transition Signing#181
DIP: Dash Platform Application Key Exchange and State Transition Signing#181PastaPastaPasta wants to merge 6 commits into
Conversation
…ansition Signing Defines the dash-key: and dash-st: URI protocols for wallet-based QR code login to Dash Platform applications. Covers ECDH key exchange, AES-256-GCM encryption, BIP32+HKDF key derivation, the loginKeyResponse contract schema, and first-time key registration flow.
|
Need the big picture first? Review this PR in Change Stack to see what changed before going file by file. Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds two new DIPs: dip-pasta-yappr.md describing dash-key and dash-st wallet–app URI protocols, cryptographic flows, encodings, and UX/validation; and dip-pasta-masternode-shares.md defining provider payload v4 with a unified ChangesDIP: Wallet–App Protocols (dash-key / dash-st)
Masternode Reward Shares
Sequence Diagram(s)sequenceDiagram
participant App
participant Wallet
participant Node
App->>Wallet: Open `dash-key:` URI (includes login request)
Wallet->>Wallet: Derive deterministic login key (BIP32 + HKDF)
Wallet->>App: Provide public key / Base58 payload (encrypted loginKeyResponse request)
App->>Node: Query `loginKeyResponse` contract / poll
Node-->>App: Return `loginKeyResponse` (encrypted payload)
App->>Wallet: Forward encrypted loginKeyResponse
Wallet->>Wallet: ECDH -> derive shared-secret, decrypt (AES-256-GCM)
Wallet-->>App: Confirm login (signed response / auth keys)
sequenceDiagram
participant App
participant Wallet
participant Node
participant IdentityStore
App->>Wallet: Open `dash-st:` URI with unsigned state transition
Wallet->>Wallet: Validate wallet identity/keys, fetch signing keys
Wallet->>IdentityStore: (optional) check identity/key metadata
Wallet->>Node: (optional) request additional state or fees
Wallet->>Wallet: Sign state transition per-identity/key selection
Wallet-->>App: Return signed state transition (encoded)
App->>Node: Submit signed state transition to network
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ 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 |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
dip-pasta-yappr.md (2)
262-265: Consider clarifying concurrent request handling.The keyIndex logic states that if no document exists,
keyIndexis0. If a wallet processes multiple key exchange requests for the same identity and contract concurrently (before the first document is created), both could usekeyIndex0, potentially creating a race condition. Consider adding guidance on how wallets should handle this scenario (e.g., serialize requests per identity+contract or retry on conflict).🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@dip-pasta-yappr.md` around lines 262 - 265, Clarify concurrent-request behavior for keyIndex/loginKeyResponse: explain that when no loginKeyResponse exists wallets must handle races by serializing requests per identity+contract or using a create-if-not-exists atomic operation and retry-on-conflict; reference the keyIndex and loginKeyResponse documents and state a recommended strategy (e.g., queue/serialize per identity+contract, use optimistic concurrency/version checks on loginKeyResponse, or retry on conflict) so two concurrent requests cannot both assume keyIndex = 0 and create duplicate keys.
391-401: Consider exponential backoff for revision conflict retries.The document lifecycle specifies retrying up to 3 times with a fixed 500ms delay on revision conflicts. Consider recommending exponential backoff (e.g., 500ms, 1000ms, 2000ms) to reduce contention under high load while maintaining the same maximum retry count.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@dip-pasta-yappr.md` around lines 391 - 401, The retry logic for handling revision conflicts when updating a loginKeyResponse document should use exponential backoff instead of a fixed 500ms delay: update the retry loop that currently retries up to 3 times with a fixed 500ms pause to instead wait 500ms, then 1000ms, then 2000ms between attempts (keeping the same max retry count), and continue to re-query the loginKeyResponse document on each retry and preserve the existing update/create flow and revision bump behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@dip-pasta-yappr.md`:
- Line 36: The Table of Contents link fragment "#supported-encodings" is broken
because the actual header is "## Encoding"; update either the TOC entry or the
heading so they match—e.g., change the TOC item "* [Supported
Encodings](`#supported-encodings`)" to "* [Encoding](`#encoding`)" or rename the
header "## Encoding" to "## Supported Encodings" so the fragment and header text
are consistent.
---
Nitpick comments:
In `@dip-pasta-yappr.md`:
- Around line 262-265: Clarify concurrent-request behavior for
keyIndex/loginKeyResponse: explain that when no loginKeyResponse exists wallets
must handle races by serializing requests per identity+contract or using a
create-if-not-exists atomic operation and retry-on-conflict; reference the
keyIndex and loginKeyResponse documents and state a recommended strategy (e.g.,
queue/serialize per identity+contract, use optimistic concurrency/version checks
on loginKeyResponse, or retry on conflict) so two concurrent requests cannot
both assume keyIndex = 0 and create duplicate keys.
- Around line 391-401: The retry logic for handling revision conflicts when
updating a loginKeyResponse document should use exponential backoff instead of a
fixed 500ms delay: update the retry loop that currently retries up to 3 times
with a fixed 500ms pause to instead wait 500ms, then 1000ms, then 2000ms between
attempts (keeping the same max retry count), and continue to re-query the
loginKeyResponse document on each retry and preserve the existing update/create
flow and revision bump behavior.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 6edfd7c4-83bf-45c9-b579-c785373b1631
📒 Files selected for processing (1)
dip-pasta-yappr.md
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9482c77c3f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| | ---------- | ----- | ----------- | | ||
| | 9' | Feature purpose (per [DIP-0009](https://github.com/dashpay/dips/blob/master/dip-0009.md)) | | | ||
| | coin_type' | `5` (mainnet) or `1` (testnet/devnet/regtest) | Per [BIP-0044](https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki) | | ||
| | 21' | Key exchange feature index | | |
| | --------- | -------- | ----------- | | ||
| | `n` | Yes | Network identifier (`m`, `t`, `d`, or `r`) | | ||
| | `v` | Yes | Protocol version; must be `1` | | ||
| | `id` | No | Base58-encoded identity identifier hint (32 bytes); wallet should pre-select this identity | |
There was a problem hiding this comment.
Extraneous word?
| | `id` | No | Base58-encoded identity identifier hint (32 bytes); wallet should pre-select this identity | | |
| | `id` | No | Base58-encoded identity identifier (32 bytes); wallet should pre-select this identity | |
- Fix broken ToC link: rename heading to 'Supported Encodings' to match ToC entry - Make Binary Payload Layout a subsection of URI Format and reorder above Network Identifiers - Simplify BIP32 path table by removing empty Description column - Add hyperlink to Network Identifiers from dash-st component table - Remove extraneous 'hint' from id parameter description - Remove unnecessary 'Read Only' rows from key registration tables
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@dip-pasta-masternode-shares.md`:
- Around line 15-28: The Table of Contents entries use two spaces after numeric
list markers which violates markdownlint MD030; update each TOC line (e.g., "1.
[Abstract](`#abstract`)", "4. [Specification](`#specification`)" and the nested
items like "4. 1. [Terminology](`#terminology`)") to use a single space after
the period (e.g., "1. [Abstract](`#abstract`)"), and apply the same single-space
fix to the remaining TOC entries indicated in the comment (including lines
29-32) so all numbered list markers conform to MD030.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 4d7df077-48e0-48c6-b473-46f573c1b5eb
📒 Files selected for processing (1)
dip-pasta-masternode-shares.md
| 1. [Abstract](#abstract) | ||
| 2. [Motivation](#motivation) | ||
| 3. [Prior Work](#prior-work) | ||
| 4. [Specification](#specification) | ||
| 1. [Terminology](#terminology) | ||
| 2. [Provider Transaction Version](#provider-transaction-version) | ||
| 3. [Masternode Payout Share](#masternode-payout-share) | ||
| 4. [Registering a Masternode](#registering-a-masternode) | ||
| 5. [Updating Masternode Payout Shares](#updating-masternode-payout-shares) | ||
| 6. [Masternode List State](#masternode-list-state) | ||
| 7. [Masternode Reward Payments](#masternode-reward-payments) | ||
| 8. [Validation Rules](#validation-rules) | ||
| 9. [RPC and JSON Interfaces](#rpc-and-json-interfaces) | ||
| 10. [Special Transaction Filtering](#special-transaction-filtering) |
There was a problem hiding this comment.
Fix list marker spacing to pass markdownlint.
The Table of Contents uses 2 spaces after numbered list markers, but markdownlint rule MD030 expects exactly 1 space. This will cause the GitHub Actions lint check to fail.
📝 Proposed fix for list marker spacing
-1. [Abstract](`#abstract`)
-2. [Motivation](`#motivation`)
-3. [Prior Work](`#prior-work`)
-4. [Specification](`#specification`)
- 1. [Terminology](`#terminology`)
- 2. [Provider Transaction Version](`#provider-transaction-version`)
- 3. [Masternode Payout Share](`#masternode-payout-share`)
- 4. [Registering a Masternode](`#registering-a-masternode`)
- 5. [Updating Masternode Payout Shares](`#updating-masternode-payout-shares`)
- 6. [Masternode List State](`#masternode-list-state`)
- 7. [Masternode Reward Payments](`#masternode-reward-payments`)
- 8. [Validation Rules](`#validation-rules`)
- 9. [RPC and JSON Interfaces](`#rpc-and-json-interfaces`)
- 10. [Special Transaction Filtering](`#special-transaction-filtering`)
+1. [Abstract](`#abstract`)
+2. [Motivation](`#motivation`)
+3. [Prior Work](`#prior-work`)
+4. [Specification](`#specification`)
+ 1. [Terminology](`#terminology`)
+ 2. [Provider Transaction Version](`#provider-transaction-version`)
+ 3. [Masternode Payout Share](`#masternode-payout-share`)
+ 4. [Registering a Masternode](`#registering-a-masternode`)
+ 5. [Updating Masternode Payout Shares](`#updating-masternode-payout-shares`)
+ 6. [Masternode List State](`#masternode-list-state`)
+ 7. [Masternode Reward Payments](`#masternode-reward-payments`)
+ 8. [Validation Rules](`#validation-rules`)
+ 9. [RPC and JSON Interfaces](`#rpc-and-json-interfaces`)
+ 10. [Special Transaction Filtering](`#special-transaction-filtering`)Apply the same 1-space correction to the remaining TOC entries (lines 29-32).
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| 1. [Abstract](#abstract) | |
| 2. [Motivation](#motivation) | |
| 3. [Prior Work](#prior-work) | |
| 4. [Specification](#specification) | |
| 1. [Terminology](#terminology) | |
| 2. [Provider Transaction Version](#provider-transaction-version) | |
| 3. [Masternode Payout Share](#masternode-payout-share) | |
| 4. [Registering a Masternode](#registering-a-masternode) | |
| 5. [Updating Masternode Payout Shares](#updating-masternode-payout-shares) | |
| 6. [Masternode List State](#masternode-list-state) | |
| 7. [Masternode Reward Payments](#masternode-reward-payments) | |
| 8. [Validation Rules](#validation-rules) | |
| 9. [RPC and JSON Interfaces](#rpc-and-json-interfaces) | |
| 10. [Special Transaction Filtering](#special-transaction-filtering) | |
| 1. [Abstract](`#abstract`) | |
| 2. [Motivation](`#motivation`) | |
| 3. [Prior Work](`#prior-work`) | |
| 4. [Specification](`#specification`) | |
| 1. [Terminology](`#terminology`) | |
| 2. [Provider Transaction Version](`#provider-transaction-version`) | |
| 3. [Masternode Payout Share](`#masternode-payout-share`) | |
| 4. [Registering a Masternode](`#registering-a-masternode`) | |
| 5. [Updating Masternode Payout Shares](`#updating-masternode-payout-shares`) | |
| 6. [Masternode List State](`#masternode-list-state`) | |
| 7. [Masternode Reward Payments](`#masternode-reward-payments`) | |
| 8. [Validation Rules](`#validation-rules`) | |
| 9. [RPC and JSON Interfaces](`#rpc-and-json-interfaces`) | |
| 10. [Special Transaction Filtering](`#special-transaction-filtering`) |
🧰 Tools
🪛 GitHub Check: lint
[failure] 24-24: Spaces after list markers
dip-pasta-masternode-shares.md:24:5 MD030/list-marker-space Spaces after list markers [Expected: 1; Actual: 2] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md030.md
[failure] 23-23: Spaces after list markers
dip-pasta-masternode-shares.md:23:5 MD030/list-marker-space Spaces after list markers [Expected: 1; Actual: 2] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md030.md
[failure] 22-22: Spaces after list markers
dip-pasta-masternode-shares.md:22:5 MD030/list-marker-space Spaces after list markers [Expected: 1; Actual: 2] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md030.md
[failure] 21-21: Spaces after list markers
dip-pasta-masternode-shares.md:21:5 MD030/list-marker-space Spaces after list markers [Expected: 1; Actual: 2] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md030.md
[failure] 20-20: Spaces after list markers
dip-pasta-masternode-shares.md:20:5 MD030/list-marker-space Spaces after list markers [Expected: 1; Actual: 2] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md030.md
[failure] 19-19: Spaces after list markers
dip-pasta-masternode-shares.md:19:5 MD030/list-marker-space Spaces after list markers [Expected: 1; Actual: 2] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md030.md
[failure] 18-18: Spaces after list markers
dip-pasta-masternode-shares.md:18:1 MD030/list-marker-space Spaces after list markers [Expected: 1; Actual: 2] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md030.md
[failure] 17-17: Spaces after list markers
dip-pasta-masternode-shares.md:17:1 MD030/list-marker-space Spaces after list markers [Expected: 1; Actual: 2] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md030.md
[failure] 16-16: Spaces after list markers
dip-pasta-masternode-shares.md:16:1 MD030/list-marker-space Spaces after list markers [Expected: 1; Actual: 2] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md030.md
[failure] 15-15: Spaces after list markers
dip-pasta-masternode-shares.md:15:1 MD030/list-marker-space Spaces after list markers [Expected: 1; Actual: 2] https://github.com/DavidAnson/markdownlint/blob/v0.38.0/doc/md030.md
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@dip-pasta-masternode-shares.md` around lines 15 - 28, The Table of Contents
entries use two spaces after numeric list markers which violates markdownlint
MD030; update each TOC line (e.g., "1. [Abstract](`#abstract`)", "4.
[Specification](`#specification`)" and the nested items like "4. 1.
[Terminology](`#terminology`)") to use a single space after the period (e.g., "1.
[Abstract](`#abstract`)"), and apply the same single-space fix to the remaining
TOC entries indicated in the comment (including lines 29-32) so all numbered
list markers conform to MD030.
|
@PastaPastaPasta those last 4 commits don't belong on this branch? |
Summary
dash-key:URI protocol for wallet-based QR code login to Dash Platform applications using ECDH key exchange and AES-256-GCM encryptiondash-st:URI protocol for requesting wallet signature and broadcast of unsigned state transitionsm/9'/coin_type'/21'/account'), HKDF key derivation, ECDH shared secret, and per-contract/per-identity key isolationloginKeyResponsePlatform contract schema, indices, and polling mechanismIdentityUpdateTransitionwith ECDSA_HASH160 keysTest plan
🤖 Generated with Claude Code
Summary by CodeRabbit