From e4e7d4fadb2859bff0825a043badcc489ae59f85 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Wed, 18 Feb 2026 08:27:42 +0700 Subject: [PATCH 1/6] docs(dip-9): add asset lock subfeatures and document authentication key types Add subfeatures 4' (Asset Lock Address Topup Funding) and 5' (Asset Lock Shielded Address Topup Funding) to the Identity Keys feature assignments. Document ECDSA (0') and BLS (1') key types within the authentication subfeature. Fix typo in invitation funding link anchor. Co-Authored-By: Claude Opus 4.6 --- dip-0009/assignments.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dip-0009/assignments.md b/dip-0009/assignments.md index d0f6adaf..14ef22be 100644 --- a/dip-0009/assignments.md +++ b/dip-0009/assignments.md @@ -6,7 +6,7 @@ Here is a table of current feature paths and any associated DIP. Future DIPs may | ------------------ | ------------ | ------------------- | ---- | | `3'` | Masternode Keys | [DIP 0003: Deterministic Masternode List](https://github.com/dashpay/dips/blob/master/dip-0003.md) | The masternode related keys are located in the following sub-paths:
`0'/*` - _Reserved_
`1'/*` - Voting Key
`2'/*` - Owner Key
`3'/*` - Operator Key
`4'/*` - [Platform P2P Key](../dip-0028.md#calculating-the-platform-node-id) (ED25519)

For example, the first voting key for Dash would be at `m/9'/5'/3'/1'/0` | | `4'` | CoinJoin Keys | CoinJoin | The masternode related keys are located in the following sub-paths:
`0'/0/*` - Account 0 (external)
`0'/1/*` - Account 0 (change, not typically used)

For example, the first key of Account 0 for CoinJoin would be at `m/9'/5'/4'/0'/0/0`.

The main purpose of this using this path is to segregate CoinJoin-related keys from the BIP44 paths that are used to receive coins and change. CoinJoin derivation paths may require different lookup or gap values than the BIP44 paths that have much less transaction activity. Additionally, it may be possible to prune used keys from the BIP37 bloom filters used by mobile apps.| -| `5'` | Identity Keys | [DIP 0013: Identities in Hierarchical Deterministic wallets](../dip-0013.md) | The related keys are located in the following sub-paths:
`0'/key type'/identity index'/key index'/*` - Identity Authentication ([details](../dip-0013.md#identity-authentication-keys))
`1'/*` - Identity Registration Funding ([details](../dip-0013.md#identity-registration-funding-keys))
`2'/*` - Identity Topup Funding ([details](../dip-0013.md#identity-top-up-funding-keys))
`3'/*` - Identity Invitation Funding ([details](../dip-0013.md#identity-invitatation-funding-keys))

For example, the first Identity Registration Funding key for Dash would be at `m/9'/5'/5'/1'/0` | +| `5'` | Identity Keys | [DIP 0013: Identities in Hierarchical Deterministic wallets](../dip-0013.md) | The related keys are located in the following sub-paths:
`0'/key type'/identity index'/key index'` - Identity Authentication ([details](../dip-0013.md#identity-authentication-keys))
    Key types:
    `0'` - ECDSA (secp256k1)
    `1'` - BLS (bls12381)
`1'/*` - Identity Registration Funding ([details](../dip-0013.md#identity-registration-funding-keys))
`2'/*` - Identity Topup Funding ([details](../dip-0013.md#identity-top-up-funding-keys))
`3'/*` - Identity Invitation Funding ([details](../dip-0013.md#identity-invitation-funding-keys))
`4'/*` - Asset Lock Address Topup Funding
`5'/*` - Asset Lock Shielded Address Topup Funding

For example, the first ECDSA authentication key for the first identity on Dash would be at `m/9'/5'/5'/0'/0'/0'/0'`
The first Identity Registration Funding key for Dash would be at `m/9'/5'/5'/1'/0` | | `15'` | DashPay - Incoming Funds | [DIP 0015: DashPay](../dip-0015.md#dashpay-incoming-funds-derivation-path) | The related keys are located in the following sub-paths: `/0'/account'/*`

For example, incoming funds for the first identity would be at `m/9'/5'/15'/0'/*` | | `16'` | DashPay - Auto Accept Proof | [DIP 0015: DashPay](../dip-0015.md#auto-accept-proof-autoacceptproof) | The related keys are located in the following sub-paths: `16'/expiration timestamp'`

For example, the key for a proof expiring at a Unix epoch time of `1605927033` would be at `m/9'/5'/16'/1605927033'` | From aadb929878aec085bc2ec83369f27f0de7300391 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Wed, 18 Feb 2026 08:31:23 +0700 Subject: [PATCH 2/6] docs(dip-9): add 'Asset Lock' to identity funding subfeature names Clarify that subfeatures 1'-3' are asset lock funding paths by renaming them to Identity Registration/Topup/Invitation Asset Lock Funding, consistent with the naming of subfeatures 4' and 5'. Co-Authored-By: Claude Opus 4.6 --- dip-0009/assignments.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dip-0009/assignments.md b/dip-0009/assignments.md index 14ef22be..f29dc3a2 100644 --- a/dip-0009/assignments.md +++ b/dip-0009/assignments.md @@ -6,7 +6,7 @@ Here is a table of current feature paths and any associated DIP. Future DIPs may | ------------------ | ------------ | ------------------- | ---- | | `3'` | Masternode Keys | [DIP 0003: Deterministic Masternode List](https://github.com/dashpay/dips/blob/master/dip-0003.md) | The masternode related keys are located in the following sub-paths:
`0'/*` - _Reserved_
`1'/*` - Voting Key
`2'/*` - Owner Key
`3'/*` - Operator Key
`4'/*` - [Platform P2P Key](../dip-0028.md#calculating-the-platform-node-id) (ED25519)

For example, the first voting key for Dash would be at `m/9'/5'/3'/1'/0` | | `4'` | CoinJoin Keys | CoinJoin | The masternode related keys are located in the following sub-paths:
`0'/0/*` - Account 0 (external)
`0'/1/*` - Account 0 (change, not typically used)

For example, the first key of Account 0 for CoinJoin would be at `m/9'/5'/4'/0'/0/0`.

The main purpose of this using this path is to segregate CoinJoin-related keys from the BIP44 paths that are used to receive coins and change. CoinJoin derivation paths may require different lookup or gap values than the BIP44 paths that have much less transaction activity. Additionally, it may be possible to prune used keys from the BIP37 bloom filters used by mobile apps.| -| `5'` | Identity Keys | [DIP 0013: Identities in Hierarchical Deterministic wallets](../dip-0013.md) | The related keys are located in the following sub-paths:
`0'/key type'/identity index'/key index'` - Identity Authentication ([details](../dip-0013.md#identity-authentication-keys))
    Key types:
    `0'` - ECDSA (secp256k1)
    `1'` - BLS (bls12381)
`1'/*` - Identity Registration Funding ([details](../dip-0013.md#identity-registration-funding-keys))
`2'/*` - Identity Topup Funding ([details](../dip-0013.md#identity-top-up-funding-keys))
`3'/*` - Identity Invitation Funding ([details](../dip-0013.md#identity-invitation-funding-keys))
`4'/*` - Asset Lock Address Topup Funding
`5'/*` - Asset Lock Shielded Address Topup Funding

For example, the first ECDSA authentication key for the first identity on Dash would be at `m/9'/5'/5'/0'/0'/0'/0'`
The first Identity Registration Funding key for Dash would be at `m/9'/5'/5'/1'/0` | +| `5'` | Identity Keys | [DIP 0013: Identities in Hierarchical Deterministic wallets](../dip-0013.md) | The related keys are located in the following sub-paths:
`0'/key type'/identity index'/key index'` - Identity Authentication ([details](../dip-0013.md#identity-authentication-keys))
    Key types:
    `0'` - ECDSA (secp256k1)
    `1'` - BLS (bls12381)
`1'/*` - Identity Registration Asset Lock Funding ([details](../dip-0013.md#identity-registration-funding-keys))
`2'/*` - Identity Topup Asset Lock Funding ([details](../dip-0013.md#identity-top-up-funding-keys))
`3'/*` - Identity Invitation Asset Lock Funding ([details](../dip-0013.md#identity-invitation-funding-keys))
`4'/*` - Asset Lock Address Topup Funding
`5'/*` - Asset Lock Shielded Address Topup Funding

For example, the first ECDSA authentication key for the first identity on Dash would be at `m/9'/5'/5'/0'/0'/0'/0'`
The first Identity Registration Asset Lock Funding key for Dash would be at `m/9'/5'/5'/1'/0` | | `15'` | DashPay - Incoming Funds | [DIP 0015: DashPay](../dip-0015.md#dashpay-incoming-funds-derivation-path) | The related keys are located in the following sub-paths: `/0'/account'/*`

For example, incoming funds for the first identity would be at `m/9'/5'/15'/0'/*` | | `16'` | DashPay - Auto Accept Proof | [DIP 0015: DashPay](../dip-0015.md#auto-accept-proof-autoacceptproof) | The related keys are located in the following sub-paths: `16'/expiration timestamp'`

For example, the key for a proof expiring at a Unix epoch time of `1605927033` would be at `m/9'/5'/16'/1605927033'` | From 563940ef4d6f19a8ec5fef7562c4d4c669e82f61 Mon Sep 17 00:00:00 2001 From: Quantum Explorer Date: Wed, 18 Feb 2026 08:51:17 +0700 Subject: [PATCH 3/6] docs(dip-9, dip-13): document both identity topup funding methods DIP-13 now documents two derivation methods for top up funding keys: - Not bound to identity: m/9'/coinType'/5'/2'/funding_index - Bound to specific identity: m/9'/coinType'/5'/2'/registration_index'/top_up_index DIP-9 assignments updated to show both sub-paths under subfeature 2'. Co-Authored-By: Claude Opus 4.6 --- dip-0009/assignments.md | 2 +- dip-0013.md | 28 ++++++++++++++++++++++------ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/dip-0009/assignments.md b/dip-0009/assignments.md index f29dc3a2..066e1eea 100644 --- a/dip-0009/assignments.md +++ b/dip-0009/assignments.md @@ -6,7 +6,7 @@ Here is a table of current feature paths and any associated DIP. Future DIPs may | ------------------ | ------------ | ------------------- | ---- | | `3'` | Masternode Keys | [DIP 0003: Deterministic Masternode List](https://github.com/dashpay/dips/blob/master/dip-0003.md) | The masternode related keys are located in the following sub-paths:
`0'/*` - _Reserved_
`1'/*` - Voting Key
`2'/*` - Owner Key
`3'/*` - Operator Key
`4'/*` - [Platform P2P Key](../dip-0028.md#calculating-the-platform-node-id) (ED25519)

For example, the first voting key for Dash would be at `m/9'/5'/3'/1'/0` | | `4'` | CoinJoin Keys | CoinJoin | The masternode related keys are located in the following sub-paths:
`0'/0/*` - Account 0 (external)
`0'/1/*` - Account 0 (change, not typically used)

For example, the first key of Account 0 for CoinJoin would be at `m/9'/5'/4'/0'/0/0`.

The main purpose of this using this path is to segregate CoinJoin-related keys from the BIP44 paths that are used to receive coins and change. CoinJoin derivation paths may require different lookup or gap values than the BIP44 paths that have much less transaction activity. Additionally, it may be possible to prune used keys from the BIP37 bloom filters used by mobile apps.| -| `5'` | Identity Keys | [DIP 0013: Identities in Hierarchical Deterministic wallets](../dip-0013.md) | The related keys are located in the following sub-paths:
`0'/key type'/identity index'/key index'` - Identity Authentication ([details](../dip-0013.md#identity-authentication-keys))
    Key types:
    `0'` - ECDSA (secp256k1)
    `1'` - BLS (bls12381)
`1'/*` - Identity Registration Asset Lock Funding ([details](../dip-0013.md#identity-registration-funding-keys))
`2'/*` - Identity Topup Asset Lock Funding ([details](../dip-0013.md#identity-top-up-funding-keys))
`3'/*` - Identity Invitation Asset Lock Funding ([details](../dip-0013.md#identity-invitation-funding-keys))
`4'/*` - Asset Lock Address Topup Funding
`5'/*` - Asset Lock Shielded Address Topup Funding

For example, the first ECDSA authentication key for the first identity on Dash would be at `m/9'/5'/5'/0'/0'/0'/0'`
The first Identity Registration Asset Lock Funding key for Dash would be at `m/9'/5'/5'/1'/0` | +| `5'` | Identity Keys | [DIP 0013: Identities in Hierarchical Deterministic wallets](../dip-0013.md) | The related keys are located in the following sub-paths:
`0'/key type'/identity index'/key index'` - Identity Authentication ([details](../dip-0013.md#identity-authentication-keys))
    Key types:
    `0'` - ECDSA (secp256k1)
    `1'` - BLS (bls12381)
`1'/*` - Identity Registration Asset Lock Funding ([details](../dip-0013.md#identity-registration-funding-keys))
`2'/*` - Identity Topup Asset Lock Funding ([details](../dip-0013.md#identity-top-up-funding-keys))
    `2'/funding index` - Not bound to a specific identity
    `2'/registration index'/top up index` - Bound to a specific identity
`3'/*` - Identity Invitation Asset Lock Funding ([details](../dip-0013.md#identity-invitation-funding-keys))
`4'/*` - Asset Lock Address Topup Funding
`5'/*` - Asset Lock Shielded Address Topup Funding

For example, the first ECDSA authentication key for the first identity on Dash would be at `m/9'/5'/5'/0'/0'/0'/0'`
The first Identity Registration Asset Lock Funding key for Dash would be at `m/9'/5'/5'/1'/0` | | `15'` | DashPay - Incoming Funds | [DIP 0015: DashPay](../dip-0015.md#dashpay-incoming-funds-derivation-path) | The related keys are located in the following sub-paths: `/0'/account'/*`

For example, incoming funds for the first identity would be at `m/9'/5'/15'/0'/*` | | `16'` | DashPay - Auto Accept Proof | [DIP 0015: DashPay](../dip-0015.md#auto-accept-proof-autoacceptproof) | The related keys are located in the following sub-paths: `16'/expiration timestamp'`

For example, the key for a proof expiring at a Unix epoch time of `1605927033` would be at `m/9'/5'/16'/1605927033'` | diff --git a/dip-0013.md b/dip-0013.md index 8cf6c9b7..f116c10c 100644 --- a/dip-0013.md +++ b/dip-0013.md @@ -137,16 +137,32 @@ must use HASH160 of the public key which is one round of SHA256 followed by one Identity Funding keys used for topup are the third sub-feature for identities. They are always derived as ECDSA keys. -We define the following levels for them: +Sub feature is set to `2'`. + +There are two derivation methods for top up funding keys: + +## Top Up Funding keys not bound to a specific identity `m / purpose' / coin_type' / feature' / sub feature' / funding index` -Sub feature is set to `2'`. +These keys do not reference an identity and can be used to top up any identity. It is useful to +point out that a registration funding key is a source of entropy in the unique identifier of the +identity it will fund, and this is obviously not the case for top up funding keys. + +For example, the first unbound top up funding key for Dash would be at `m/9'/5'/5'/2'/0`. + +## Top Up Funding keys bound to a specific identity + +`m / purpose' / coin_type' / feature' / sub feature' / registration index' / top up index` + +These keys include a hardened registration index that ties the top up to a specific identity. +The registration index corresponds to the identity being topped up, and the top up index is a +sequential non-hardened index for each top up transaction. + +For example, the first top up funding key for the first identity on Dash would be at +`m/9'/5'/5'/2'/0'/0`. -We should note that unlike Identity Registration keys, Top Up Funding keys do not reference an -identity and can be used to top up any identity. It is useful to point out that a registration -funding key is a source of entropy in the unique identifier of the identity it will fund, and this -is obviously not the case for top up funding keys. +## Recovery and reuse If a wallet recovers an unused top up funding transaction, the wallet should attempt to reuse it. This is done in a few steps. First, the wallet must recognise the key used in a returned identity From 5aa7cb6ca277d59a5d8bb0cbe4786cbd5b5401a8 Mon Sep 17 00:00:00 2001 From: thephez Date: Thu, 19 Feb 2026 11:21:01 -0500 Subject: [PATCH 4/6] docs: consistently use top up --- dip-0009/assignments.md | 2 +- dip-0013.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dip-0009/assignments.md b/dip-0009/assignments.md index 066e1eea..d3f3d6b0 100644 --- a/dip-0009/assignments.md +++ b/dip-0009/assignments.md @@ -6,7 +6,7 @@ Here is a table of current feature paths and any associated DIP. Future DIPs may | ------------------ | ------------ | ------------------- | ---- | | `3'` | Masternode Keys | [DIP 0003: Deterministic Masternode List](https://github.com/dashpay/dips/blob/master/dip-0003.md) | The masternode related keys are located in the following sub-paths:
`0'/*` - _Reserved_
`1'/*` - Voting Key
`2'/*` - Owner Key
`3'/*` - Operator Key
`4'/*` - [Platform P2P Key](../dip-0028.md#calculating-the-platform-node-id) (ED25519)

For example, the first voting key for Dash would be at `m/9'/5'/3'/1'/0` | | `4'` | CoinJoin Keys | CoinJoin | The masternode related keys are located in the following sub-paths:
`0'/0/*` - Account 0 (external)
`0'/1/*` - Account 0 (change, not typically used)

For example, the first key of Account 0 for CoinJoin would be at `m/9'/5'/4'/0'/0/0`.

The main purpose of this using this path is to segregate CoinJoin-related keys from the BIP44 paths that are used to receive coins and change. CoinJoin derivation paths may require different lookup or gap values than the BIP44 paths that have much less transaction activity. Additionally, it may be possible to prune used keys from the BIP37 bloom filters used by mobile apps.| -| `5'` | Identity Keys | [DIP 0013: Identities in Hierarchical Deterministic wallets](../dip-0013.md) | The related keys are located in the following sub-paths:
`0'/key type'/identity index'/key index'` - Identity Authentication ([details](../dip-0013.md#identity-authentication-keys))
    Key types:
    `0'` - ECDSA (secp256k1)
    `1'` - BLS (bls12381)
`1'/*` - Identity Registration Asset Lock Funding ([details](../dip-0013.md#identity-registration-funding-keys))
`2'/*` - Identity Topup Asset Lock Funding ([details](../dip-0013.md#identity-top-up-funding-keys))
    `2'/funding index` - Not bound to a specific identity
    `2'/registration index'/top up index` - Bound to a specific identity
`3'/*` - Identity Invitation Asset Lock Funding ([details](../dip-0013.md#identity-invitation-funding-keys))
`4'/*` - Asset Lock Address Topup Funding
`5'/*` - Asset Lock Shielded Address Topup Funding

For example, the first ECDSA authentication key for the first identity on Dash would be at `m/9'/5'/5'/0'/0'/0'/0'`
The first Identity Registration Asset Lock Funding key for Dash would be at `m/9'/5'/5'/1'/0` | +| `5'` | Identity Keys | [DIP 0013: Identities in Hierarchical Deterministic wallets](../dip-0013.md) | The related keys are located in the following sub-paths:
`0'/key type'/identity index'/key index'` - Identity Authentication ([details](../dip-0013.md#identity-authentication-keys))
    Key types:
    `0'` - ECDSA (secp256k1)
    `1'` - BLS (bls12381)
`1'/*` - Identity Registration Asset Lock Funding ([details](../dip-0013.md#identity-registration-funding-keys))
`2'/*` - Identity Top up Asset Lock Funding ([details](../dip-0013.md#identity-top-up-funding-keys))
    `2'/funding index` - Not bound to a specific identity
    `2'/registration index'/top up index` - Bound to a specific identity
`3'/*` - Identity Invitation Asset Lock Funding ([details](../dip-0013.md#identity-invitation-funding-keys))
`4'/*` - Asset Lock Address Top up Funding
`5'/*` - Asset Lock Shielded Address Top up Funding

For example, the first ECDSA authentication key for the first identity on Dash would be at `m/9'/5'/5'/0'/0'/0'/0'`
The first Identity Registration Asset Lock Funding key for Dash would be at `m/9'/5'/5'/1'/0` | | `15'` | DashPay - Incoming Funds | [DIP 0015: DashPay](../dip-0015.md#dashpay-incoming-funds-derivation-path) | The related keys are located in the following sub-paths: `/0'/account'/*`

For example, incoming funds for the first identity would be at `m/9'/5'/15'/0'/*` | | `16'` | DashPay - Auto Accept Proof | [DIP 0015: DashPay](../dip-0015.md#auto-accept-proof-autoacceptproof) | The related keys are located in the following sub-paths: `16'/expiration timestamp'`

For example, the key for a proof expiring at a Unix epoch time of `1605927033` would be at `m/9'/5'/16'/1605927033'` | diff --git a/dip-0013.md b/dip-0013.md index f116c10c..0409d0cf 100644 --- a/dip-0013.md +++ b/dip-0013.md @@ -102,7 +102,7 @@ the case with non-hardened keys. # Identity Registration Funding keys -Identity Funding keys can either be for a registration or for a topup. We will create for each +Identity Funding keys can either be for a registration or for a top up. We will create for each wallet two sets of secp256k1 keys. Funding transactions using these keys will be perceived as identical on the network. However by separating these keys based on two derivation paths, wallets can keep track of the motivation behind each credit funding transaction. @@ -134,7 +134,7 @@ must use HASH160 of the public key which is one round of SHA256 followed by one # Identity Top Up Funding keys -Identity Funding keys used for topup are the third sub-feature for identities. They are always +Identity Funding keys used for top up are the third sub-feature for identities. They are always derived as ECDSA keys. Sub feature is set to `2'`. From b73d8e8755b1a034c9f04e91c377f0bdb2a6d9ba Mon Sep 17 00:00:00 2001 From: thephez Date: Thu, 19 Feb 2026 11:53:50 -0500 Subject: [PATCH 5/6] docs(dip-13): update bloom filter details to cover both types of topups --- dip-0013.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dip-0013.md b/dip-0013.md index 0409d0cf..6ffb26a7 100644 --- a/dip-0013.md +++ b/dip-0013.md @@ -171,8 +171,9 @@ the top up transaction has already been used and the balance transferred into cr not the case, the wallet can then perform an identity top up transition as defined in DIP11 using the top up funding key. -It is recommended that 30 address hashes of these keys be added to the bloom filter sent to peers. -If transactions containing 25 address hashes or more have been found, the filter should be +It is recommended that 30 address hashes of both unbound top up funding keys and bound top up +funding keys for each known identity be added to the bloom filter sent to peers. If transactions +containing 25 address hashes or more have been found for either category, the filter should be regenerated with 30 more. # Identity Invitation Funding keys From 57d70142a9ec09e70f2723566289e0bda62550ea Mon Sep 17 00:00:00 2001 From: thephez Date: Thu, 19 Feb 2026 12:15:16 -0500 Subject: [PATCH 6/6] docs(dip-13): clarify bloom filter more --- dip-0013.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/dip-0013.md b/dip-0013.md index 6ffb26a7..e5c6349d 100644 --- a/dip-0013.md +++ b/dip-0013.md @@ -171,10 +171,11 @@ the top up transaction has already been used and the balance transferred into cr not the case, the wallet can then perform an identity top up transition as defined in DIP11 using the top up funding key. -It is recommended that 30 address hashes of both unbound top up funding keys and bound top up -funding keys for each known identity be added to the bloom filter sent to peers. If transactions -containing 25 address hashes or more have been found for either category, the filter should be -regenerated with 30 more. +It is recommended that 30 address hashes of unbound top up funding keys and 30 address hashes of +bound top up funding keys for each known identity be added to the bloom filter sent to peers. If +transactions containing 25 address hashes or more have been found for unbound keys, the filter +should be regenerated with 30 more. If transactions containing 25 address hashes or more have been +found for one or more identities, the relevant filter(s) should be regenerated with 30 more. # Identity Invitation Funding keys