wallet: derivehdkey RPC to get xpub at arbitrary path #32784

pull Sjors wants to merge 13 commits into bitcoin:master from Sjors:2025/06/gethdkey changing 21 files +823 −89
  1. Sjors commented at 11:04 am on June 20, 2025: member

    Given a (blank) wallet with an unused(KEY) descriptor, derivehdkey "m/87h/0h/0h" gets the xpub or xpriv at any given path.

    This is particularly useful for multisig setup where it’s not desirable to use our default derivations (e.g. 44h).

    I updated the multisig tutorial and the functional test.

    Based on:

  2. DrahtBot renamed this:
    wallet: derivehdkey RPC to get xpub at arbitrary path
    wallet: derivehdkey RPC to get xpub at arbitrary path
    on Jun 20, 2025
  3. DrahtBot added the label Wallet on Jun 20, 2025
  4. DrahtBot commented at 11:04 am on June 20, 2025: contributor

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

    Code Coverage & Benchmarks

    For details see: https://corecheck.dev/bitcoin/bitcoin/pulls/32784.

    Reviews

    See the guideline for information on the review process.

    Type Reviewers
    Concept ACK rkrux

    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:

    • #33230 (cli: Handle arguments that can be either JSON or string by achow101)
    • #33135 (wallet: prevent accidental unsafe older() import by Sjors)
    • #32652 (wallet: add codex32 argument to addhdkey by roconnor-blockstream)
    • #32489 (wallet: Add exportwatchonlywallet RPC to export a watchonly version of a wallet by achow101)
    • #30341 (WIP: Permit Combiner to strip bip32_deriv information by willcl-ark)
    • #30243 (descriptors: taproot partial descriptors by Eunovo)

    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.

  5. DrahtBot added the label CI failed on Jun 20, 2025
  6. DrahtBot commented at 11:47 am on June 20, 2025: contributor

    🚧 At least one of the CI tasks failed. Task lint: https://github.com/bitcoin/bitcoin/runs/44475268764 LLM reason (✨ experimental): The CI failure is caused by errors from the lint check ‘py_lint’, specifically due to unused imports flagged by ruff.

    Try to run the tests locally, according to the documentation. However, a CI failure may still happen due to a number of reasons, for example:

    • Possibly due to a silent merge conflict (the changes in this pull request being incompatible with the current code in the target branch). If so, make sure to rebase on the latest commit of the target branch.

    • A sanitizer issue, which can only be found by compiling with the sanitizer and running the affected test.

    • An intermittent issue.

    Leave a comment here, if you need help tracking down a confusing failure.

  7. Sjors force-pushed on Jun 20, 2025
  8. Sjors force-pushed on Jun 20, 2025
  9. Sjors force-pushed on Jun 20, 2025
  10. DrahtBot removed the label CI failed on Jun 20, 2025
  11. in src/rpc/util.h:156 in 30d5e5ccf7 outdated
    151@@ -152,6 +152,14 @@ std::pair<int64_t, int64_t> ParseDescriptorRange(const UniValue& value);
    152 /** Evaluate a descriptor given as a string, or as a {"desc":...,"range":...} object, with default range of 1000. */
    153 std::vector<CScript> EvalDescriptorStringOrObject(const UniValue& scanobject, FlatSigningProvider& provider, const bool expand_priv = false);
    154 
    155+//! Get extended key and origin info for a given path
    156+//! @params[in] path The BIP 32 path
    


    DrahtBot commented at 9:41 am on June 25, 2025:
    In util.h: “@params[in] path” → “@param[in] path” [Doxygen tag typo]
    
  12. Sjors force-pushed on Jun 26, 2025
  13. Sjors force-pushed on Jun 27, 2025
  14. in doc/multisig-tutorial.md:96 in 35eec44491 outdated
    137 
    138-./build/bin/bitcoin-cli  -signet -rpcwallet="multisig_wallet_01" getwalletinfo
    139+./build/bin/bitcoin rpc  -signet -rpcwallet="multisig_wallet_01" listdescriptors
    140 ```
    141 
    142+The `<0;1>` notation in `desc` caused the creation of two descriptors. One uses the chain 0 for external addressesd the other the chain 1 for internal ones (change).
    


    DrahtBot commented at 4:37 am on July 2, 2025:
    addressesd -> addresses [extra “d” makes “addresses” misspelled]
    
  15. rkrux commented at 11:11 am on July 18, 2025: contributor
    Very nice, Concept ACK. I will review this PR.
  16. descriptor: Add unused(KEY) descriptor
    unused() descriptors do not have scriptPubKeys. Instead, the wallet uses
    them to store keys without having any scripts to watch for.
    18062990b8
  17. test: Simple test for importing unused(KEY) fb2eb22905
  18. wallet: Add addhdkey RPC 71b4900f85
  19. wallet, rpc: Disallow import of unused() if key already exists 3aff52c989
  20. wallet, rpc: Disallow importing unused() to wallets without privkeys 844dd63a7d
  21. doc: Release note for addhdkey 439734e0ef
  22. rpc: add DeriveExtKey() helper 7fd996efd6
  23. Have ParseHDKeypath handle h derivation marker 8a8c8d16e0
  24. rpc: ParsePathBIP32 helper 25256e7479
  25. rpc: add derivehdkey 6ea5c9c995
  26. test: use derivehdkey in M-of-N multisig demo
    Use derivehdkey instead of extracting each participant xpub (and derivation info) from  the listdescriptors output.
    
    Additionally use the new <0;1> descriptor syntax.
    
    Finally this commits adds a few debug log lines, and expand the explanation for why we use m/44h/1h/0h.
    e5499fd5b0
  27. Sjors force-pushed on Aug 1, 2025
  28. rpc: Handle -named argument parsing where '=' character is used 30f30d2c48
  29. doc: use derivehdkey in multisig tutorial
    Use derivehdkey instead of extracting each participant xpub
    from  the listdescriptors output.
    
    Additionally use the new <0;1> descriptor syntax.
    
    Also use bitcoin rpc instead of bitcoin-cli.
    017fb68100
  30. Sjors force-pushed on Aug 1, 2025

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: 2025-08-23 03:13 UTC

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