rpc, wallet: addhdseed, infer seed when importing descriptor with xpub #23544

pull Sjors wants to merge 30 commits into bitcoin:master from Sjors:2021/11/no_descriptors changing 23 files +1277 βˆ’356
  1. Sjors commented at 4:40 pm on November 18, 2021: member

    Builds on top of #25907 and one commit from #22341.

    First this PR introduces a descriptor wallet RPC addhdseed. Similar to its legacy wallet counterpart sethdseed it either generates a fresh random seed, for use on a blank wallet, or the user can provide a WIF. Unlike sethdseed this RPC call does not add keys / fill the keypool.

    This allows a user to create a blank wallet (createwallet), provide it with a seed (addhdseed) and then craft custom descriptors. (An alternative approach would to add a nodescriptors argument to createwallet, but this RPC seems useful anyway)

    An example use case of this is setting up a multisig between Core and a hardware wallet. After adding the seed to an otherwise empty wallet, the user would call getxpub m/87'/0'/0'. They would then combine this xpub and origin info with the one from their hardware wallet (e.g. using hwi --fingerprint .... getxpub m/87'/0'/0' and craft a descriptor like wsh(sorted_multi(2, [...../87'/0'/0']our_xpub, [..../87'/0'/0']their_xpub)), and import that. The resulting wallet will be able to sign its part of the transaction.

    The second part of this PR enables to ability descriptors, such as in the multisig example above, in such a way that any fingerprint + xpub that is covered by our hd seed(s) can be signed for.

  2. Sjors force-pushed on Nov 18, 2021
  3. DrahtBot added the label Build system on Nov 18, 2021
  4. DrahtBot added the label Descriptors on Nov 18, 2021
  5. DrahtBot added the label RPC/REST/ZMQ on Nov 18, 2021
  6. DrahtBot added the label Wallet on Nov 18, 2021
  7. Sjors force-pushed on Nov 18, 2021
  8. DrahtBot commented at 11:20 pm on November 18, 2021: contributor

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    Reviews

    See the guideline for information on the review process.

    Type Reviewers
    Concept ACK Rspigler

    If your review is incorrectly listed, please react with πŸ‘Ž to this comment and the bot will ignore it on the next update.

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #bitcoin-core/gui/650 (Add Import to Wallet GUI by KolbyML)
    • #26627 (wallet: Migrate non-HD keys with single combo containing a list of keys by achow101)
    • #26596 (wallet: Migrate legacy wallets to descriptor wallets without requiring BDB by achow101)
    • #26573 (Wallet: don’t underestimate the fees when spending a Taproot output by darosior)
    • #26567 (Wallet: estimate the size of signed inputs using descriptors by darosior)
    • #26462 (wallet: fix crash on loading descriptor wallet containing legacy key type entries by theStack)
    • #26008 (wallet: cache IsMine scriptPubKeys to improve performance of wallets with a lot of non-ranged descriptors by achow101)
    • #25991 (Wallet: Add foreign_outputs metadata to support CoinJoin transactions by luke-jr)
    • #25766 (wallet: Include a signature with encrypted keys to mitigate a wallet scam by achow101)
    • #25680 (rpc, docs: Add note for commands that supports only legacy wallets by yusufsahinhamza)
    • #24914 (wallet: Load database records in a particular order by achow101)
    • #24897 ([Draft / POC] Silent Payments by w0xlt)
    • #22838 (descriptors: Be able to specify change and receiving in a single descriptor string by achow101)
    • #22341 (rpc: add getxpub by Sjors)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

  9. Rspigler commented at 8:15 pm on November 25, 2021: contributor
    Concept ACK! Thanks for continuing this work
  10. fanquake removed the label Build system on Dec 10, 2021
  11. DrahtBot added the label Needs rebase on Dec 13, 2021
  12. Rspigler commented at 3:08 pm on December 22, 2021: contributor

    So cool! :rocket:

    I tried testing this as far as I could.

    First Node:

    Created an empty wallet.

    listdescriptors:

    { “wallet_name”: “1”, “descriptors”: [ ] }

    :heavy_check_mark:

    addhdseed:

    { “fingerprint”: “2aba6847” }

    getxpub "m/87'/0'/0'":

    { “xpub”: “xpub6Bp9vBsEbMipghoCm7fnWbSvXc9gVyZS5Duzfc8WgrEEbCC8mDeg8YGHAtihrLg1XdjJT1qKYgM4Q7REz8B7zgoH6mWEHdMPDwMCihsbSgK”, “fingerprint”: “2aba6847”, “origin”: “[2aba6847/87’/0’/0’]” }

    Now on to second node, since I don’t have any HWW:

    Created an empty wallet:

    listdescriptors:

    { “wallet_name”: “2”, “descriptors”: [ ] }

    :heavy_check_mark:

    addhdseed:

    { “fingerprint”: “ad8a04e6” }

    getxpub "m/87'/0'/0'":

    { “xpub”: “xpub6DR65ocDPDwTphuxNogrNSWWsmUnFEpBWjhZABGxupZ65st8kaSWVmFripasF8in6JELXPNPbjwyqE8s7dqiGSYyrE9k5UGDF4XQCSALkqi”, “fingerprint”: “ad8a04e6”, “origin”: “[ad8a04e6/87’/0’/0’]” }

    Now back to first node, to combine into descriptor:

    wsh(sorted_multi(2,[2aba6847/87'/0'/0']xpub6Bp9vBsEbMipghoCm7fnWbSvXc9gVyZS5Duzfc8WgrEEbCC8mDeg8YGHAtihrLg1XdjJT1qKYgM4Q7REz8B7zgoH6mWEHdMPDwMCihsbSgK,[ad8a04e6/87'/0'/0']xpub6DR65ocDPDwTphuxNogrNSWWsmUnFEpBWjhZABGxupZ65st8kaSWVmFripasF8in6JELXPNPbjwyqE8s7dqiGSYyrE9k5UGDF4XQCSALkqi))

    I tried various formats/syntax for importdescriptors, but all failed. I’m sure it is something I did on my end. Can you help? For example:

    importdescriptors '[{ "desc": "wsh(sorted_multi(2,[2aba6847/87'/0'/0']xpub6Bp9vBsEbMipghoCm7fnWbSvXc9gVyZS5Duzfc8WgrEEbCC8mDeg8YGHAtihrLg1XdjJT1qKYgM4Q7REz8B7zgoH6mWEHdMPDwMCihsbSgK,[ad8a04e6/87'/0'/0']xpub6DR65ocDPDwTphuxNogrNSWWsmUnFEpBWjhZABGxupZ65st8kaSWVmFripasF8in6JELXPNPbjwyqE8s7dqiGSYyrE9k5UGDF4XQCSALkqi))>", "timestamp":now, "internal": true }

  13. Sjors commented at 2:41 am on December 23, 2021: member

    @Rspigler in your examples the descriptors you importing are missing a derivation rule after the xpub, e.g. xpub.../0/* and they’re missing a checksum (add a wrong one and it will tell you the right answers, e.g. #00000000). Also the > seems out of place.

    Btw, you could try running the Trezor or ColdCard emulator, it’ll work with HWI.

  14. Rspigler commented at 6:53 pm on December 26, 2021: contributor

    Those were silly mistakes, sorry.

    Tried this:

    importdescriptors '[{ "desc": "wsh(sorted_multi(2,[3c9567fe/87'/0'/0'/0/*]xpub6DJT4N7LcSaLhKPSRkczg1nfD5z2wy1Kw48LAZHGTKDdWcjCc95wdRwQogYUX7M4fyzcXo3wQUrTH86RJ5w8cZ6T6nYdWe6guBN8SEBkPyD,[ad8a04e6/87'/0'/0'/0/*]xpub6DR65ocDPDwTphuxNogrNSWWsmUnFEpBWjhZABGxupZ65st8kaSWVmFripasF8in6JELXPNPbjwyqE8s7dqiGSYyrE9k5UGDF4XQCSALkqi))#00000000", "timestamp": now, "internal": "true" }]'

    But still received Error: Error parsing JSON error code.

    (The first descriptor is different because I re-compiled on Node 1)

  15. Sjors commented at 1:47 pm on December 28, 2021: member
    That’s still the wrong format. The final /0/* needs to be after the xpub. And “now” is missing quotes, whereas true should not be in quotes, which is probably what triggers the JSON parsing error. (I know it’s tedious). You probably also want to set internal to false if you want to generate receive addresses (true is used for change addresses)
  16. Sjors force-pushed on Dec 30, 2021
  17. DrahtBot removed the label Needs rebase on Dec 30, 2021
  18. Rspigler commented at 1:19 am on January 7, 2022: contributor

    Thanks for being patient with me.

    Still getting errors but will continue to work on this myself rather than crowd the PR.

  19. DrahtBot added the label Needs rebase on Jan 11, 2022
  20. in src/wallet/scriptpubkeyman.cpp:2082 in 96913f90e5 outdated
    1751-    // Calculate the new range_end
    1752-    int32_t new_range_end = std::max(m_wallet_descriptor.next_index + (int32_t)target_size, m_wallet_descriptor.range_end);
    1753+    {
    1754+        LOCK2(cs_desc_man, m_keyman.cs_keyman);
    1755+        // Calculate the new range_end
    1756+        int32_t new_range_end = std::max(m_wallet_descriptor.next_index + (int32_t)target_size, m_wallet_descriptor.range_end);
    


    PastaPastaPasta commented at 1:03 pm on February 1, 2022:
    please convert this to a functional cast
  21. Rspigler commented at 8:14 pm on July 11, 2022: contributor

    Tested commit 96913f90e53adb42c4398a075f49fe67de079508

    Received this error while compiling, but can still run:

    CXX wallet/libbitcoin_wallet_a-keyman.o In file included from ./script/signingprovider.h:11, from ./wallet/crypter.h:10, from wallet/keyman.cpp:8: ./script/keyorigin.h: In member function β€˜std::optional<std::pair<CExtPubKey, KeyOriginInfo> > KeyManager::GetExtPubKey(std::vector) const’: ./script/keyorigin.h:11:8: warning: β€˜origin’ may be used uninitialized in this function [-Wmaybe-uninitialized] 11 | struct KeyOriginInfo | ^~~~~~~~~~~~~ wallet/keyman.cpp:88:19: note: β€˜origin’ was declared here 88 | KeyOriginInfo origin; | ^~~~~~ CXX wallet/libbitcoin_wallet_a-load.o

    make check passes, but a large number of functional tests fail.

    example_test.py | βœ– Failed | 3 s feature_bip68_sequence.py | βœ– Failed | 26 s feature_coinstatsindex.py –descriptors | βœ– Failed | 5 s feature_dbcrash.py | βœ– Failed | 3385 s feature_fee_estimation.py | βœ– Failed | 1 s feature_maxuploadtarget.py | βœ– Failed | 85 s feature_notifications.py | βœ– Failed | 14 s feature_nulldummy.py –descriptors | βœ– Failed | 1 s feature_pruning.py | βœ– Failed | 200 s feature_rbf.py –descriptors | βœ– Failed | 4 s feature_segwit.py –descriptors | βœ– Failed | 37 s feature_taproot.py | βœ– Failed | 176 s interface_bitcoin_cli.py –descriptors | βœ– Failed | 3 s interface_rest.py | βœ– Failed | 6 s interface_zmq.py | βœ– Failed | 2 s mempool_accept.py | βœ– Failed | 10 s mempool_package_onemore.py | βœ– Failed | 2 s mempool_packages.py | βœ– Failed | 7 s mempool_persist.py | βœ– Failed | 8 s mempool_unbroadcast.py | βœ– Failed | 3 s mempool_updatefromblock.py | βœ– Failed | 37 s mining_basic.py | βœ– Failed | 2 s mining_prioritisetransaction.py | βœ– Failed | 4 s p2p_compactblocks.py | βœ– Failed | 19 s p2p_segwit.py | βœ– Failed | 118 s rpc_createmultisig.py –descriptors | βœ– Failed | 10 s rpc_fundrawtransaction.py –descriptors | βœ– Failed | 28 s rpc_invalid_address_message.py | βœ– Failed | 1 s rpc_psbt.py –descriptors | βœ– Failed | 32 s rpc_rawtransaction.py –descriptors | βœ– Failed | 10 s rpc_scantxoutset.py | βœ– Failed | 1 s rpc_signrawtransaction.py –descriptors | βœ– Failed | 5 s tool_wallet.py –descriptors | βœ– Failed | 3 s wallet_abandonconflict.py –descriptors | βœ– Failed | 11 s wallet_address_types.py –descriptors | βœ– Failed | 19 s wallet_avoidreuse.py –descriptors | βœ– Failed | 2 s wallet_backup.py –descriptors | βœ– Failed | 39 s wallet_balance.py –descriptors | βœ– Failed | 19 s wallet_basic.py –descriptors | βœ– Failed | 3 s wallet_bumpfee.py –descriptors | βœ– Failed | 46 s wallet_coinbase_category.py –descriptors | βœ– Failed | 1 s wallet_create_tx.py –descriptors | βœ– Failed | 2 s wallet_createwallet.py –descriptors | βœ– Failed | 4 s wallet_createwallet.py –usecli | βœ– Failed | 5 s wallet_descriptor.py –descriptors | βœ– Failed | 5 s wallet_encryption.py –descriptors | βœ– Failed | 5 s wallet_fallbackfee.py –descriptors | βœ– Failed | 1 s wallet_getxpub.py | βœ– Failed | 2 s wallet_groups.py –descriptors | βœ– Failed | 87 s wallet_hd.py –descriptors | βœ– Failed | 4 s wallet_importdescriptors.py –descriptors | βœ– Failed | 27 s wallet_importprunedfunds.py –descriptors | βœ– Failed | 2 s wallet_keypool.py –descriptors | βœ– Failed | 4 s wallet_keypool_topup.py –descriptors | βœ– Failed | 3 s wallet_labels.py –descriptors | βœ– Failed | 2 s wallet_listdescriptors.py –descriptors | βœ– Failed | 1 s wallet_listreceivedby.py –descriptors | βœ– Failed | 18 s wallet_listsinceblock.py –descriptors | βœ– Failed | 23 s wallet_listtransactions.py –descriptors | βœ– Failed | 22 s wallet_multisig_descriptor_psbt.py | βœ– Failed | 4 s wallet_multiwallet.py –descriptors | βœ– Failed | 1 s wallet_multiwallet.py –usecli | βœ– Failed | 1 s wallet_orphanedreward.py | βœ– Failed | 5 s wallet_reorgsrestore.py | βœ– Failed | 4 s wallet_resendwallettransactions.py –descriptors | βœ– Failed | 1 s wallet_send.py –descriptors | βœ– Failed | 16 s wallet_signer.py –descriptors | βœ– Failed | 4 s wallet_signmessagewithaddress.py | βœ– Failed | 1 s wallet_taproot.py | βœ– Failed | 12 s wallet_transactiontime_rescan.py –descriptors | βœ– Failed | 9 s wallet_txn_clone.py | βœ– Failed | 4 s wallet_txn_clone.py –mineblock | βœ– Failed | 4 s wallet_txn_clone.py –segwit | βœ– Failed | 3 s wallet_txn_doublespend.py –descriptors | βœ– Failed | 2 s wallet_txn_doublespend.py –mineblock | βœ– Failed | 4 s

    Error when opening bitcoin-qt:

    QVariant::load: unknown user type with name BitcoinUnits::Unit.

    First Node:

    Create an empty wallet:

    listdescriptors:

    { “wallet_name”: “23544_1”, “descriptors”: [ ] }

    :heavy_check_mark:

    addhdseed:

    { “fingerprint”: “a019ad21” }

    getxpub "m/87'/0'/0'"

    { “xpub”: “xpub6CXL18AKPyWayxP6P5ko3SmwZssuWXY4sZ79HyKsif5p9BHYftwAUCgUfUwZa62G23aWpsTB9tEKjjZnNysZJpDDKkTPd7SQMeJCUM8GvtN”, “fingerprint”: “a019ad21”, “origin”: “[a019ad21/87’/0’/0’]” }

    Second Node:

    listdescriptors:

    { “wallet_name”: “23544_2”, “descriptors”: [ ] }

    :heavy_check_mark:

    addhdseed:

    { “fingerprint”: “a970df20” }

    getxpub "m/87'/0'/0'":

    { “xpub”: “xpub6D3ZW5ojVdtYjYSYvUbwTXcVhjmki6YxoRtfTL9v1AxEUTAwXeFC3oPUEs5UMhd85x94uDmQs51D7hcaX6mLdw3W3ESECnrtLqeqjLQLuGL”, “fingerprint”: “a970df20”, “origin”: “[a970df20/87’/0’/0’]” }

    Combine Descriptor on Third Node:

    listdescriptors:

    { “wallet_name”: “23544_3”, “descriptors”: [ ] }

    importdescriptors "[{ \"desc\": \"wsh(sorted_multi(2,([a019ad21/87'/0'/0']xpub6CXL18AKPyWayxP6P5ko3SmwZssuWXY4sZ79HyKsif5p9BHYftwAUCgUfUwZa62G23aWpsTB9tEKjjZnNysZJpDDKkTPd7SQMeJCUM8GvtN/0/*)#00000000\", \"timestamp\": \"now\" }, { \"desc\": \"([a970df20/87'/0'/0']xpub6D3ZW5ojVdtYjYSYvUbwTXcVhjmki6YxoRtfTL9v1AxEUTAwXeFC3oPUEs5UMhd85x94uDmQs51D7hcaX6mLdw3W3ESECnrtLqeqjLQLuGL/0/*)#000000))\", \"timestamp\": \"now\" }]"

    [ { “success”: false, “error”: { “code”: -5, “message”: “Provided checksum ‘00000000’ does not match computed checksum ‘7r3pkh7a’” } }, { “success”: false, “error”: { “code”: -5, “message”: “Provided checksum ‘000000))’ does not match computed checksum ‘mehsqsx4’” } } ]

    ->

    importdescriptors "[{ \"desc\": \"wsh(sorted_multi(2,([a019ad21/87'/0'/0']xpub6CXL18AKPyWayxP6P5ko3SmwZssuWXY4sZ79HyKsif5p9BHYftwAUCgUfUwZa62G23aWpsTB9tEKjjZnNysZJpDDKkTPd7SQMeJCUM8GvtN/0/*)#7r3pkh7a\", \"timestamp\": \"now\" }, { \"desc\": \"([a970df20/87'/0'/0']xpub6D3ZW5ojVdtYjYSYvUbwTXcVhjmki6YxoRtfTL9v1AxEUTAwXeFC3oPUEs5UMhd85x94uDmQs51D7hcaX6mLdw3W3ESECnrtLqeqjLQLuGL/0/*)#mehsqsx4))\", \"timestamp\": \"now\" }]"

    [ { “success”: false, “error”: { “code”: -5, “message”: “A function is needed within P2WSH” } }, { “success”: false, “error”: { “code”: -5, “message”: “Expected 8 character checksum, not 10 characters” } } ]

    Hm, weird, for some reason the import/checksum works for the ‘first descriptor’ in the combined, but not the second. Even though we have already calculated it. Let’s try calculating the second, with the first a part of the calculation?

    importdescriptors "[{ \"desc\": \"wsh(sorted_multi(2,([a019ad21/87'/0'/0']xpub6CXL18AKPyWayxP6P5ko3SmwZssuWXY4sZ79HyKsif5p9BHYftwAUCgUfUwZa62G23aWpsTB9tEKjjZnNysZJpDDKkTPd7SQMeJCUM8GvtN/0/*)#7r3pkh7a\", \"timestamp\": \"now\" }, { \"desc\": \"([a970df20/87'/0'/0']xpub6D3ZW5ojVdtYjYSYvUbwTXcVhjmki6YxoRtfTL9v1AxEUTAwXeFC3oPUEs5UMhd85x94uDmQs51D7hcaX6mLdw3W3ESECnrtLqeqjLQLuGL/0/*)#000000))\", \"timestamp\": \"now\" }]"

    [ { “success”: false, “error”: { “code”: -5, “message”: “A function is needed within P2WSH” } }, { “success”: false, “error”: { “code”: -5, “message”: “Provided checksum ‘000000))’ does not match computed checksum ‘mehsqsx4’” } } ]

    Same result

    importdescriptors "[{ \"desc\": \"wsh(sorted_multi(2,([a019ad21/87'/0'/0']xpub6CXL18AKPyWayxP6P5ko3SmwZssuWXY4sZ79HyKsif5p9BHYftwAUCgUfUwZa62G23aWpsTB9tEKjjZnNysZJpDDKkTPd7SQMeJCUM8GvtN/0/*)#7r3pkh7a\", \"timestamp\": \"now\" }, { \"desc\": \"([a970df20/87'/0'/0']xpub6D3ZW5ojVdtYjYSYvUbwTXcVhjmki6YxoRtfTL9v1AxEUTAwXeFC3oPUEs5UMhd85x94uDmQs51D7hcaX6mLdw3W3ESECnrtLqeqjLQLuGL/0/*)#mehsqsx4))\", \"timestamp\": \"now\" }]"

    [ { “success”: false, “error”: { “code”: -5, “message”: “A function is needed within P2WSH” } }, { “success”: false, “error”: { “code”: -5, “message”: “Expected 8 character checksum, not 10 characters” } } ]

    Don’t know what to do from but feel I am so close

  22. Sjors commented at 2:43 pm on September 6, 2022: member
    There’s some overlap between addhdseed that’s introduced here and #24193, so I’ll wait for that to evolve a bit and then maybe rebase on it.
  23. Sjors commented at 11:18 am on September 22, 2022: member
    I’ll rebase this on #25907 at some point.
  24. Sjors commented at 12:06 pm on September 28, 2022: member

    Rebased fe5db8d077a4cc35912a083501654bd931529097 on top of #25907. This uses a hardcoded xpriv, so don’t bother testing just yet (and ignore the broken test case).

    The approach now is that when calling importdescriptors is that if it finds missing private keys, it will try to derive them from the seed (using the new keyman.GetActiveHDKey() method). Will implement this derivation later using some stuff from #22341.

    I’m not a huge fan of using string manipulation in the RPC code like this though.

  25. Sjors force-pushed on Sep 28, 2022
  26. DrahtBot removed the label Needs rebase on Sep 28, 2022
  27. Sjors force-pushed on Sep 28, 2022
  28. Sjors commented at 3:28 pm on September 28, 2022: member
    It now works for the simplest case. Still need to clean up the part where I inject the master key xpub into the descriptor (hopefully that fixes the test too). I’d rather manipulate the Descriptor object directly than to manipulate strings and then re-parse.
  29. Sjors force-pushed on Sep 28, 2022
  30. DrahtBot added the label Needs rebase on Oct 13, 2022
  31. moveonly: move WalletStorage to separate file 18054704cf
  32. walletdb: Add HDKey records 312245433d
  33. walletdb: Add WriteKeyManKey and WriteCryptedKeyManKey
    These functions write new key records for keys handled by a KeyManager
    3fa66d009a
  34. walletdb: Allow duplicate descriptor keys
    If a descriptor (crypted) key is being written and one already exists,
    make sure that the one being written and the one already on disk
    match each other.
    632b29608f
  35. descspkm: Track CKeyIDs of our keys
    When DescriptorScriptPubKeyMan no longer manages its keys, it still
    needs to know the IDs of its keys.
    ebec893ce1
  36. wallet: Add KeyManager class db6efef098
  37. descspkm: Add KeyManager to DescriptorScriptPubKeyMan and use for keys 60a499b5dd
  38. descspkm: Encrypt with KeyManager instead of direct map access 1e99ebda77
  39. descspkm: Use KeyManager::LoadKey and LoadCryptedKey when loading 9b44055c4f
  40. descspkm: Replace GetKeys with KeyManager::GetKeys d04dd5becf
  41. descspkm: Replace HavePrivateKeys with KeyManager::HavePrivateKeys() d4c78ace5a
  42. keyman: Make some members private 38e099bd2b
  43. wallet: Have KeyManager in CWallet rather than DescriptorScriptPubKeyMan fc89a37d81
  44. walletdb: Refactor deserialaization of keys with checksums
    This will become shared later.
    b21982f390
  45. walletdb: Load keys into KeyManager directly 8436d2ff55
  46. wallet: Add flag for using KeyManager
    KeyManager will be a backwards compatible background upgrade to
    descriptor wallets. A flag indicating that the upgrade has occurred is
    added so that the upgrade (not yet implemented) will only happen once.
    6e5fbd56a4
  47. wallet: Use KeyManager to generate master key b0adf464c2
  48. descriptor: Be able to get the pubkeys involved in a descriptor 4ca53084e7
  49. walletdb: Implement upgrading a wallet to use KeyManager f7fbd0a5fd
  50. descspkm: Remove unneeded key loading
    Key management will be done entirely by KeyManager, so
    DescriptorScriptPubKeyMan does not need key loading functions.
    aee80e5a0d
  51. rpc: Add getxpub command c9af030cd6
  52. wallet: Refactor function for single DescSPKM setup
    We will need access to a function that sets up a singular
    DescriptorSPKM, so refactor this out of the multiple DescriptorSPKM
    setup function.
    e8d2afdffc
  53. wallet, descspkm: Move GetID into WalletDescriptor 60afd5b51a
  54. wallet, descspkm: Refactor wallet descriptor generation to static func b27e5d6ac8
  55. walletdb: Allow overwriting keyman active hd key 322db472e8
  56. wallet: Re-enable sethdseed for descriptors wallets
    Descriptor wallets store an HD master key that is used for new
    automatically generated descriptors. sethdseed is an existing RPC that
    can be repurposed to allow the users to set that HD key whenever they
    want.
    
    Also fixes the whitespace of sethdseed. Best to review this with
    --ignore-all-space
    40237aa36c
  57. wallet, rpc: Add createwalletdescriptor RPC 3b42bd677a
  58. wallet: Test for descriptor wallet sethdseed and createwalletdescriptor b2c3deea89
  59. wallet: GetExtPubKey() cfb3af5e10
  60. wallet: match xpub in imported descriptor to existing seed 7841583080
  61. Sjors force-pushed on Nov 29, 2022
  62. DrahtBot removed the label Needs rebase on Nov 29, 2022
  63. DrahtBot added the label Needs rebase on Dec 5, 2022
  64. DrahtBot commented at 10:51 pm on December 5, 2022: contributor

    πŸ™ This pull request conflicts with the target branch and needs rebase.

  65. DrahtBot commented at 0:57 am on March 5, 2023: contributor

    There hasn’t been much activity lately and the patch still needs rebase. What is the status here?

    • Is it still relevant? ➑️ Please solve the conflicts to make it ready for review and to ensure the CI passes.
    • Is it no longer relevant? ➑️ Please close.
    • Did the author lose interest or time to work on this? ➑️ Please close it and mark it ‘Up for grabs’ with the label, so that it can be picked up in the future.
  66. DrahtBot commented at 1:19 am on June 3, 2023: contributor

    There hasn’t been much activity lately and the patch still needs rebase. What is the status here?

    • Is it still relevant? ➑️ Please solve the conflicts to make it ready for review and to ensure the CI passes.
    • Is it no longer relevant? ➑️ Please close.
    • Did the author lose interest or time to work on this? ➑️ Please close it and mark it ‘Up for grabs’ with the label, so that it can be picked up in the future.
  67. Sjors commented at 2:15 pm on August 1, 2023: member
    This is very out of date and it’s not on my priority list at the moment. Happy to review if someone else takes it over.
  68. Sjors closed this on Aug 1, 2023

  69. bitcoin locked this on Jul 31, 2024

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2024-12-03 15:12 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me