wallet, rpc: add an option to list private descriptors #21500

pull S3RK wants to merge 1 commits into bitcoin:master from S3RK:listdescriptors_private changing 6 files +52 −7
  1. S3RK commented at 8:38 am on March 22, 2021: member

    Rationale: make it possible to backup your wallet with listdescriptors command

    • The default behaviour is still to show public version
    • For private version only the root xprv is returned

    Example use-case:

    0> bitcoin-cli -regtest -named createwallet wallet_name=old descriptors=true
    1> bitcoin-cli -regtest -rpcwallet=old listdescriptors true | jq '.descriptors' > descriptors.txt
    2
    3> bitcoin-cli -regtest -named createwallet wallet_name=new descriptors=true blank=true
    4> bitcoin-cli -regtest -rpcwallet=new importdescriptors "$(cat descriptors.txt)"
    

    In case of watch-only wallet without private keys there will be following output:

    0error code: -4
    1error message:
    2Can't get descriptor string.
    
  2. fanquake added the label Wallet on Mar 22, 2021
  3. DrahtBot commented at 11:27 am on March 22, 2021: member

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

    Conflicts

    No conflicts as of last run.

  4. DrahtBot added the label Needs rebase on Apr 2, 2021
  5. S3RK force-pushed on Apr 2, 2021
  6. DrahtBot removed the label Needs rebase on Apr 2, 2021
  7. DrahtBot commented at 9:33 am on May 3, 2021: member

    🕵️ @achow101 @sipa have been requested to review this pull request as specified in the REVIEWERS file.

  8. in src/wallet/rpcdump.cpp:1740 in b78fe4338e outdated
    1735@@ -1736,7 +1736,9 @@ RPCHelpMan listdescriptors()
    1736     return RPCHelpMan{
    1737         "listdescriptors",
    1738         "\nList descriptors imported into a descriptor-enabled wallet.",
    1739-        {},
    1740+        {
    1741+            {"private", RPCArg::Type::BOOL, /* default */ "false", "Show private descriptors."}
    


    luke-jr commented at 10:47 pm on May 13, 2021:
    I don’t think this should be a numbered parameter.

    luke-jr commented at 10:47 pm on May 13, 2021:
    IMO it would be better to have a separate RPC method for private data.

    S3RK commented at 7:50 am on May 19, 2021:
    Are you saying it shouldn’t be a parameter at all? Or it should be a “named-only” parameter? I can’t see how to make it “named-only”

    luke-jr commented at 3:33 pm on June 24, 2021:
    Named-only parameters are provided in the positional API as an “options” Object.
  9. luke-jr changes_requested
  10. achow101 commented at 9:01 pm on June 3, 2021: member
    Concept ACK. The second commit seems unrelated.
  11. S3RK force-pushed on Jun 24, 2021
  12. S3RK commented at 6:41 am on June 24, 2021: member
    Fixed silent merge conflict and split the 2nd commit into #22334
  13. DrahtBot added the label Needs rebase on Jun 30, 2021
  14. S3RK force-pushed on Jul 6, 2021
  15. DrahtBot removed the label Needs rebase on Jul 6, 2021
  16. S3RK force-pushed on Jul 7, 2021
  17. ghost commented at 1:21 pm on July 7, 2021: none

    Tried listdescriptors RPC although I have no clue what are these 6 descriptors.

    Create Wallet:

    0POST / HTTP/1.1
    1Host: 127.0.0.1:18777
    2Authorization: Basic hObGNqTTZjR0Z6YzNkd
    3Content-Type: text/plain
    4Content-Length: 106
    5
    6{"jsonrpc": "1.0", "id": "curltest", "method": "createwallet", "params": ["DT1",false,false,"",true,true]}
    

    List descriptors:

    0
    1POST /wallet/DT1 HTTP/1.1
    2Host: 127.0.0.1:18777
    3Authorization: Basic hObGNqTTZjR0Z6YzNkd
    4Content-Type: text/plain
    5Content-Length: 83
    6
    7{"jsonrpc": "1.0", "id": "curltest", "method": "listdescriptors", "params": [true]}
    

    Response (I get the same response for true and false in params:

     0{
     1    "result": {
     2        "wallet_name": "DT1",
     3        "descriptors": [
     4            {
     5                "desc": "pkh([07f2e700/44'/1'/0']tpubDC89pDwHmvJV6xtEEWniQYEZ9Nga9cshwTHAT3dHfyWftFUtUWoQ5qAr4scvE853a2rFLqH4ZhoJtNDhSB8HS9oG8KDN5rWCaFotTFmKSAV/0/*)#ek3c29xk",
     6                "timestamp": 1625657174,
     7                "active": true,
     8                "internal": false,
     9                "range": [
    10                    0,
    11                    999
    12                ],
    13                "next": 0
    14            },
    15            {
    16                "desc": "wpkh([07f2e700/84'/1'/0']tpubDD49UXKp4mBeHhZKURhTFqhnnuMu5EA88v5GWFm3wnQJfZmyMwSsQqM6X3eFUwkAcRD4j9wiwoGzmphJMwEB1PwdwQuTbPdKUjhmpEsfqmh/0/*)#07l98jpn",
    17                "timestamp": 1625657175,
    18                "active": true,
    19                "internal": false,
    20                "range": [
    21                    0,
    22                    999
    23                ],
    24                "next": 0
    25            },
    26            {
    27                "desc": "pkh([07f2e700/44'/1'/0']tpubDC89pDwHmvJV6xtEEWniQYEZ9Nga9cshwTHAT3dHfyWftFUtUWoQ5qAr4scvE853a2rFLqH4ZhoJtNDhSB8HS9oG8KDN5rWCaFotTFmKSAV/1/*)#gz5ehskw",
    28                "timestamp": 1625657175,
    29                "active": true,
    30                "internal": true,
    31                "range": [
    32                    0,
    33                    999
    34                ],
    35                "next": 0
    36            },
    37            {
    38                "desc": "sh(wpkh([07f2e700/49'/1'/0']tpubDDMzDzQabs6VaDCvGa8jxNPZuDp28No6UBzathahL63xj3zWndRnNzTGqrCRSNpJDSZNnhkEKq2GwPfyGMkGip9Kqq4UkqE5Jb2x9EBsMzM/0/*))#kx6a8xhn",
    39                "timestamp": 1625657174,
    40                "active": true,
    41                "internal": false,
    42                "range": [
    43                    0,
    44                    999
    45                ],
    46                "next": 0
    47            },
    48            {
    49                "desc": "sh(wpkh([07f2e700/49'/1'/0']tpubDDMzDzQabs6VaDCvGa8jxNPZuDp28No6UBzathahL63xj3zWndRnNzTGqrCRSNpJDSZNnhkEKq2GwPfyGMkGip9Kqq4UkqE5Jb2x9EBsMzM/1/*))#r85tlezv",
    50                "timestamp": 1625657175,
    51                "active": true,
    52                "internal": true,
    53                "range": [
    54                    0,
    55                    999
    56                ],
    57                "next": 0
    58            },
    59            {
    60                "desc": "wpkh([07f2e700/84'/1'/0']tpubDD49UXKp4mBeHhZKURhTFqhnnuMu5EA88v5GWFm3wnQJfZmyMwSsQqM6X3eFUwkAcRD4j9wiwoGzmphJMwEB1PwdwQuTbPdKUjhmpEsfqmh/1/*)#726y683t",
    61                "timestamp": 1625657175,
    62                "active": true,
    63                "internal": true,
    64                "range": [
    65                    0,
    66                    999
    67                ],
    68                "next": 0
    69            }
    70        ]
    71    },
    72    "error": null,
    73    "id": "curltest"
    74}
    
  18. achow101 commented at 4:31 pm on July 7, 2021: member

    Response (I get the same response for true and false in params:

    Are you sure you are using this branch? I get the private key with true, and the normalized public descriptor with false.

  19. achow101 commented at 4:31 pm on July 7, 2021: member

    ACK 2854ddca9bf9662170fecc2657ec3c19d364d2e2

    Reviewed code and tested manually.

  20. ghost commented at 5:13 pm on July 7, 2021: none

    Are you sure you are using this branch? I get the private key with true, and the normalized public descriptor with false.

    Yes just noticed the difference. false returns tpub and true returns tprv

    Sorry they looked same and both had 6 results. So, I was confused.

  21. S3RK commented at 7:43 pm on July 7, 2021: member

    @prayank23 Thanks for testing! By default descriptor wallet has two descriptors for each type:

    1. Legacy — pkh(...)
    2. Wrapped SegWit — sh(wpkh(...))
    3. Native SegWit, bech32 — wpkh(...)

    One of the two descriptors is for receiving, marked with internal: false and one for change internal: true.

    So in the end you’ve got 6 of them. Each descriptor is derived from the same extended master private key (you can see it’s fingerprint repeating in the descriptors; 07f2e700 in your example) using corresponding derivation paths. See BIPs: 44, 49 and 84.

  22. unknown approved
  23. Rspigler commented at 8:59 pm on July 7, 2021: contributor

    I’m getting a build error trying to test:

    (edited out).

    I’m getting these on master as well, so investigating/removing from here as it is not this PR specific.

  24. in src/wallet/rpcdump.cpp:1758 in 2854ddca9b outdated
    1755@@ -1756,7 +1756,9 @@ RPCHelpMan listdescriptors()
    1756     return RPCHelpMan{
    1757         "listdescriptors",
    1758         "\nList descriptors imported into a descriptor-enabled wallet.",
    


    jonatack commented at 1:02 pm on July 8, 2021:
    0        "\nList descriptors imported into a descriptor-enabled wallet.\n",
    
     0$ ./src/bitcoin-cli help listdescriptors
     1listdescriptors ( private )
     2
     3List descriptors imported into a descriptor-enabled wallet.
     4
     5Arguments:
     61. private    (boolean, optional, default=false) Show private descriptors.
     7
     8Result:
     9{                                 (json object)
    10  "wallet_name" : "str",          (string) Name of wallet this operation was performed on
    11   ...
    
  25. in src/wallet/rpcwallet.cpp:3875 in 2854ddca9b outdated
    3871@@ -3872,7 +3872,7 @@ RPCHelpMan getaddressinfo()
    3872     DescriptorScriptPubKeyMan* desc_spk_man = dynamic_cast<DescriptorScriptPubKeyMan*>(pwallet->GetScriptPubKeyMan(scriptPubKey));
    3873     if (desc_spk_man) {
    3874         std::string desc_str;
    3875-        if (desc_spk_man->GetDescriptorString(desc_str)) {
    3876+        if (desc_spk_man->GetDescriptorString(desc_str, false)) {
    


    jonatack commented at 1:10 pm on July 8, 2021:
    0        if (desc_spk_man->GetDescriptorString(desc_str, /* priv */ false)) {
    
  26. in src/wallet/scriptpubkeyman.cpp:2271 in 2854ddca9b outdated
    2267     provider.keys = GetKeys();
    2268 
    2269+    if (priv) {
    2270+        // For private version always return master key to avoid exposing child private keys.
    2271+        // The risk implications of exposing child private key together with parent xpub
    2272+        // could be not obvious for users.
    


    jonatack commented at 1:13 pm on July 8, 2021:
    0-        // For private version always return master key to avoid exposing child private keys.
    1-        // The risk implications of exposing child private key together with parent xpub
    2-        // could be not obvious for users.
    3+        // For the private version, always return the master key to avoid
    4+        // exposing child private keys. The risk implications of exposing child
    5+        // private keys together with the parent xpub may be non-obvious for users.
    
  27. in test/functional/wallet_listdescriptors.py:76 in 2854ddca9b outdated
    70@@ -71,11 +71,30 @@ def run_test(self):
    71             ],
    72         }
    73         assert_equal(expected, wallet.listdescriptors())
    74+        assert_equal(expected, wallet.listdescriptors(False))
    75+
    76+        self.log.info('Test list private descriptors.')
    


    jonatack commented at 1:15 pm on July 8, 2021:
    0        self.log.info('Test list private descriptors')
    
  28. in test/functional/wallet_listdescriptors.py:93 in 2854ddca9b outdated
    88 
    89         self.log.info("Test listdescriptors with encrypted wallet")
    90         wallet.encryptwallet("pass")
    91         assert_equal(expected, wallet.listdescriptors())
    92 
    93+        self.log.info('Test list private descriptors with encrypted wallet.')
    


    jonatack commented at 1:15 pm on July 8, 2021:
    0        self.log.info('Test list private descriptors with encrypted wallet')
    
  29. in src/wallet/rpcdump.cpp:1812 in 2854ddca9b outdated
    1806@@ -1799,8 +1807,9 @@ RPCHelpMan listdescriptors()
    1807         LOCK(desc_spk_man->cs_desc_man);
    1808         const auto& wallet_descriptor = desc_spk_man->GetWalletDescriptor();
    1809         std::string descriptor;
    1810-        if (!desc_spk_man->GetDescriptorString(descriptor)) {
    1811-            throw JSONRPCError(RPC_WALLET_ERROR, "Can't get normalized descriptor string.");
    1812+
    1813+        if (!desc_spk_man->GetDescriptorString(descriptor, priv)) {
    1814+            throw JSONRPCError(RPC_WALLET_ERROR, "Can't get descriptor string.");
    


    jonatack commented at 1:27 pm on July 8, 2021:
    This seems untested.

    S3RK commented at 1:21 pm on July 10, 2021:
    Thanks. Added a test case for this error
  30. jonatack commented at 1:28 pm on July 8, 2021: member

    ACK 2854ddca9bf9662170fecc2657ec3c19d364d2e2

    Some minor suggestions, happy to re-ACK if you update.

  31. S3RK force-pushed on Jul 10, 2021
  32. wallet, rpc: add listdescriptors private option bb822a7af8
  33. S3RK force-pushed on Jul 10, 2021
  34. S3RK commented at 1:23 pm on July 10, 2021: member
    Added a test case for the error when trying to get private descriptors for watch-only wallet. Plus minor readability and grammar fixes
  35. in test/functional/wallet_listdescriptors.py:105 in bb822a7af8
    100+        watch_only_wallet = node.get_wallet_rpc('watch-only')
    101+        watch_only_wallet.importdescriptors([{
    102+            'desc': descsum_create('wpkh(' + xpub_acc + ')'),
    103+            'timestamp': 1296688602,
    104+        }])
    105+        assert_raises_rpc_error(-4, 'Can\'t get descriptor string', watch_only_wallet.listdescriptors, True)
    


    jonatack commented at 1:47 pm on July 10, 2021:

    (pico-nit, only if you retouch)

    0        assert_raises_rpc_error(-4, "Can't get descriptor string", watch_only_wallet.listdescriptors, True)
    
  36. in test/functional/wallet_listdescriptors.py:74 in bb822a7af8
    70@@ -71,11 +71,39 @@ def run_test(self):
    71             ],
    72         }
    73         assert_equal(expected, wallet.listdescriptors())
    74+        assert_equal(expected, wallet.listdescriptors(False))
    


    jonatack commented at 1:53 pm on July 10, 2021:

    maybe use named args (as this argument is new and true/false isn’t very descriptive), feel free to ignore

     0         assert_equal(expected, wallet.listdescriptors())
     1-        assert_equal(expected, wallet.listdescriptors(False))
     2+        assert_equal(expected, wallet.listdescriptors(private=False))
     3 
     4         self.log.info('Test list private descriptors')
     5         expected_private = {
     6@@ -84,16 +84,16 @@ class ListDescriptorsTest(BitcoinTestFramework):
     7                  'next': 0},
     8             ],
     9         }
    10-        assert_equal(expected_private, wallet.listdescriptors(True))
    11+        assert_equal(expected_private, wallet.listdescriptors(private=True))
    12 
    13         self.log.info("Test listdescriptors with encrypted wallet")
    14         wallet.encryptwallet("pass")
    15         assert_equal(expected, wallet.listdescriptors())
    16 
    17         self.log.info('Test list private descriptors with encrypted wallet')
    18-        assert_raises_rpc_error(-13, 'Please enter the wallet passphrase with walletpassphrase first.', wallet.listdescriptors, True)
    19+        assert_raises_rpc_error(-13, 'Please enter the wallet passphrase with walletpassphrase first.', wallet.listdescriptors, private=True)
    20         wallet.walletpassphrase(passphrase="pass", timeout=1000000)
    21-        assert_equal(expected_private, wallet.listdescriptors(True))
    22+        assert_equal(expected_private, wallet.listdescriptors(private=True))
    23 
    24         self.log.info('Test list private descriptors with watch-only wallet')
    25         node.createwallet(wallet_name='watch-only', descriptors=True, disable_private_keys=True)
    26@@ -102,7 +102,7 @@ class ListDescriptorsTest(BitcoinTestFramework):
    27             'desc': descsum_create('wpkh(' + xpub_acc + ')'),
    28             'timestamp': 1296688602,
    29         }])
    30-        assert_raises_rpc_error(-4, 'Can\'t get descriptor string', watch_only_wallet.listdescriptors, True)
    31+        assert_raises_rpc_error(-4, 'Can\'t get descriptor string', watch_only_wallet.listdescriptors, private=True)
    32 
    33         self.log.info('Test non-active non-range combo descriptor')
    34         node.createwallet(wallet_name='w4', blank=True, descriptors=True)
    
  37. jonatack commented at 2:00 pm on July 10, 2021: member

    Thanks for adding the test!

    ACK bb822a7af86897a9b6a5d616f193c258e8e76729 per git diff 2854ddc bb822a7

     0diff --git a/test/functional/wallet_listdescriptors.py b/test/functional/wallet_listdescriptors.py
     1index 6e7be929cc..61de4621bf 100755
     2--- a/test/functional/wallet_listdescriptors.py
     3+++ b/test/functional/wallet_listdescriptors.py
     4@@ -71,7 +71,7 @@ class ListDescriptorsTest(BitcoinTestFramework):
     5             ],
     6         }
     7         assert_equal(expected, wallet.listdescriptors())
     8-        assert_equal(expected, wallet.listdescriptors(False))
     9+        # assert_equal(expected, wallet.listdescriptors(False))
    10 
    11         self.log.info('Test list private descriptors')
    12         expected_private = {
    13@@ -84,16 +84,16 @@ class ListDescriptorsTest(BitcoinTestFramework):
    14                  'next': 0},
    15             ],
    16         }
    17-        assert_equal(expected_private, wallet.listdescriptors(True))
    18+        # assert_equal(expected_private, wallet.listdescriptors(True))
    19 
    20         self.log.info("Test listdescriptors with encrypted wallet")
    21         wallet.encryptwallet("pass")
    22         assert_equal(expected, wallet.listdescriptors())
    23 
    24         self.log.info('Test list private descriptors with encrypted wallet')
    25-        assert_raises_rpc_error(-13, 'Please enter the wallet passphrase with walletpassphrase first.', wallet.listdescriptors, True)
    26+        # assert_raises_rpc_error(-13, 'Please enter the wallet passphrase with walletpassphrase first.', wallet.listdescriptors, True)
    27         wallet.walletpassphrase(passphrase="pass", timeout=1000000)
    28-        assert_equal(expected_private, wallet.listdescriptors(True))
    29+        # assert_equal(expected_private, wallet.listdescriptors(True))
    30 
    31         self.log.info('Test list private descriptors with watch-only wallet')
    32         node.createwallet(wallet_name='watch-only', descriptors=True, disable_private_keys=True)
    33@@ -102,7 +102,7 @@ class ListDescriptorsTest(BitcoinTestFramework):
    34             'desc': descsum_create('wpkh(' + xpub_acc + ')'),
    35             'timestamp': 1296688602,
    36         }])
    37-        assert_raises_rpc_error(-4, 'Can\'t get descriptor string', watch_only_wallet.listdescriptors, True)
    38+        # assert_raises_rpc_error(-4, 'Can\'t get descriptor string', watch_only_wallet.listdescriptors, True)
    39 
    40         self.log.info('Test non-active non-range combo descriptor')
    41         node.createwallet(wallet_name='w4', blank=True, descriptors=True)
    
  38. achow101 commented at 8:54 pm on July 22, 2021: member
    re-ACK bb822a7af86897a9b6a5d616f193c258e8e76729
  39. S3RK commented at 7:36 am on August 3, 2021: member
    @prayank23 @Rspigler do you want to check the latest version?
  40. ghost commented at 1:33 pm on August 3, 2021: none

    Sure. Will try today. I had two questions, maybe @practicalswift can help me:

    1. Does it make sense to try SQL queries in fuzzing descriptor wallet related RPCs? I tried but could not find anything interesting: https://link.medium.com/iQBbB5Tbqib
    2. Are emojis a part of strings that are used in fuzzing Bitcoin Core? https://github.com/danielmiessler/SecLists/blob/master/Fuzzing/big-list-of-naughty-strings.txt (few emojis in this list)
  41. unknown approved
  42. unknown commented at 11:42 pm on August 3, 2021: none

    tACK https://github.com/bitcoin/bitcoin/pull/21500/commits/bb822a7af86897a9b6a5d616f193c258e8e76729

    Tested everything mentioned in PR description and below things:

    W1: Descriptor wallet with private keys W2: Blank Descriptor wallet W3: Descriptor wallet with private keys disabled W4: Another Descriptor wallet with private keys

    1. Export descriptors from wallet W1 and import in same wallet
    2. Export descriptors from wallet W1 and import in Wallet W2 and W4
    3. Export descriptors from wallet W1 and import in Wallet W3

    Everything looks good with listdescriptors, maybe we can improve one thing in importdescriptors:

    When exporting-importing in same wallet it does not import duplicates however response is same as 2.

    0{
    1  "success": true
    2}
    
  43. ghost commented at 11:56 pm on August 3, 2021: none

    In case of watch-only wallet without private keys there will be following output: error code: -4 error message: Can’t get descriptor string.

    I don’t see this warning for watch only wallet. It returns wallet name and blank array for descriptors.

  44. Rspigler commented at 1:33 am on August 4, 2021: contributor

    tACK bb822a7af86897a9b6a5d616f193c258e8e76729

    This would be very helpful for metal or paper backups

    listdescriptors:

    { “wallet_name”: “Test_ListDescriptors”, “descriptors”: [ { “desc”: “pkh([db98369e/44’/0’/0’]xpub6DFFBCcFzoG7cfKDPRX39zd3ZBydFnM26VmDEVDLryPU6u6coYZKkBpe7DKPa8V1RjAvvdx4UebiXqSirkevEpsdByAbS1GjF1WGofMWcNc/0/)#6j60t7ur”, “timestamp”: 1628016073, “active”: true, “internal”: false, “range”: [ 0, 999 ], “next”: 0 }, { “desc”: “sh(wpkh([db98369e/49’/0’/0’]xpub6DG6d9WNZi2EwnkKm8AZTRTijvff5kiMUPFyQN7aDiNJ5Hu7Nea4zeMVi7g8st1PxNKVq6gidk5vPiV2uMyu8QgmCa92A9XaXfZ7ZfCMrZP/0/))#luvn8xr5”, “timestamp”: 1628016073, “active”: true, “internal”: false, “range”: [ 0, 999 ], “next”: 0 }, { “desc”: “wpkh([db98369e/84’/0’/0’]xpub6CPCUJH2M2VkskpSijywKte99eQ1WXZnVtTBEbWUCWKzHB36ddWSwmmg4jL4M2Nk8PRK3XS4YbTrKk5sCx1iCEgjKsZU2Vp5xQvgThhNQFH/0/)#g22fa57g”, “timestamp”: 1628016074, “active”: true, “internal”: false, “range”: [ 0, 999 ], “next”: 0 }, { “desc”: “pkh([db98369e/44’/0’/0’]xpub6DFFBCcFzoG7cfKDPRX39zd3ZBydFnM26VmDEVDLryPU6u6coYZKkBpe7DKPa8V1RjAvvdx4UebiXqSirkevEpsdByAbS1GjF1WGofMWcNc/1/)#txlwktvm”, “timestamp”: 1628016074, “active”: true, “internal”: true, “range”: [ 0, 999 ], “next”: 0 }, { “desc”: “sh(wpkh([db98369e/49’/0’/0’]xpub6DG6d9WNZi2EwnkKm8AZTRTijvff5kiMUPFyQN7aDiNJ5Hu7Nea4zeMVi7g8st1PxNKVq6gidk5vPiV2uMyu8QgmCa92A9XaXfZ7ZfCMrZP/1/))#2az9lekt”, “timestamp”: 1628016074, “active”: true, “internal”: true, “range”: [ 0, 999 ], “next”: 0 }, { “desc”: “wpkh([db98369e/84’/0’/0’]xpub6CPCUJH2M2VkskpSijywKte99eQ1WXZnVtTBEbWUCWKzHB36ddWSwmmg4jL4M2Nk8PRK3XS4YbTrKk5sCx1iCEgjKsZU2Vp5xQvgThhNQFH/1/)#e70gqpws”, “timestamp”: 1628016075, “active”: true, “internal”: true, “range”: [ 0, 999 ], “next”: 0 } ] }

    listdescriptors true:

    { “wallet_name”: “Test_ListDescriptors”, “descriptors”: [ { “desc”: “pkh(xprv9s21ZrQH143K2CBvvodeKZrxF474uqw846zfy9Q4hWEtkuNZoSRdUrtPjntix8JXUh6M5VXPFEw7z8w7jvMkqZEP2D5qVoyfvmMC2SVfHc5/44’/0’/0’/0/)#3ln4pscr”, “timestamp”: 1628016073, “active”: true, “internal”: false, “range”: [ 0, 999 ], “next”: 0 }, { “desc”: “sh(wpkh(xprv9s21ZrQH143K2CBvvodeKZrxF474uqw846zfy9Q4hWEtkuNZoSRdUrtPjntix8JXUh6M5VXPFEw7z8w7jvMkqZEP2D5qVoyfvmMC2SVfHc5/49’/0’/0’/0/))#ulkh8xrl”, “timestamp”: 1628016073, “active”: true, “internal”: false, “range”: [ 0, 999 ], “next”: 0 }, { “desc”: “wpkh(xprv9s21ZrQH143K2CBvvodeKZrxF474uqw846zfy9Q4hWEtkuNZoSRdUrtPjntix8JXUh6M5VXPFEw7z8w7jvMkqZEP2D5qVoyfvmMC2SVfHc5/84’/0’/0’/0/)#8mevkeep”, “timestamp”: 1628016074, “active”: true, “internal”: false, “range”: [ 0, 999 ], “next”: 0 }, { “desc”: “pkh(xprv9s21ZrQH143K2CBvvodeKZrxF474uqw846zfy9Q4hWEtkuNZoSRdUrtPjntix8JXUh6M5VXPFEw7z8w7jvMkqZEP2D5qVoyfvmMC2SVfHc5/44’/0’/0’/1/)#qtk5u9gm”, “timestamp”: 1628016074, “active”: true, “internal”: true, “range”: [ 0, 999 ], “next”: 0 }, { “desc”: “sh(wpkh(xprv9s21ZrQH143K2CBvvodeKZrxF474uqw846zfy9Q4hWEtkuNZoSRdUrtPjntix8JXUh6M5VXPFEw7z8w7jvMkqZEP2D5qVoyfvmMC2SVfHc5/49’/0’/0’/1/))#6u7jutgt”, “timestamp”: 1628016074, “active”: true, “internal”: true, “range”: [ 0, 999 ], “next”: 0 }, { “desc”: “wpkh(xprv9s21ZrQH143K2CBvvodeKZrxF474uqw846zfy9Q4hWEtkuNZoSRdUrtPjntix8JXUh6M5VXPFEw7z8w7jvMkqZEP2D5qVoyfvmMC2SVfHc5/84’/0’/0’/1/)#k0udtvfe”, “timestamp”: 1628016075, “active”: true, “internal”: true, “range”: [ 0, 999 ], “next”: 0 } ] }

  45. meshcollider commented at 1:32 am on August 9, 2021: contributor
    Code review ACK bb822a7af86897a9b6a5d616f193c258e8e76729
  46. meshcollider merged this on Aug 9, 2021
  47. meshcollider closed this on Aug 9, 2021

  48. sidhujag referenced this in commit 84ed070fce on Aug 10, 2021
  49. DrahtBot locked this on Aug 16, 2022

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-22 09:12 UTC

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