Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1002self.nodes[0].createwallet("encrypted_wallet", blank=True, passphrase="passphrase")1003encrypted_wallet = self.nodes[0].get_wallet_rpc("encrypted_wallet")1005self.log.info("Wallet must be unlocked to import a descriptor")1006assert_raises_rpc_error(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.",1007encrypted_wallet.importdescriptors, [descriptor])1009self.log.info("A locked wallet rejects an empty importdescriptors request")1010assert_raises_rpc_error(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.",1011encrypted_wallet.importdescriptors, [])1013self.log.info("An unlocked wallet accepts an empty importdescriptors request")1014self.nodes[0].createwallet("unencrypted_wallet", blank=True)1015unencrypted_wallet = self.nodes[0].get_wallet_rpc("unencrypted_wallet")1016assert_equal(unencrypted_wallet.importdescriptors([]), [])1018descriptor["timestamp"] = 01019descriptor["next_index"] = 01021encrypted_wallet.walletpassphrase("passphrase", 99999)1022with concurrent.futures.ThreadPoolExecutor(max_workers=1) as thread:1023with self.nodes[0].assert_debug_log(expected_msgs=["Rescan started from block 0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206... (slow variant inspecting all blocks)"], timeout=10):1024importing = thread.submit(encrypted_wallet.importdescriptors, requests=[descriptor])1026# Set the passphrase timeout to 1 to test that the wallet remains unlocked during the rescan1027self.nodes[0].cli("-rpcwallet=encrypted_wallet").walletpassphrase("passphrase", 1)1029try:1030self.nodes[0].cli("-rpcwallet=encrypted_wallet").walletlock()1031except JSONRPCException as e:1032assert_equal(e.error["code"], -4)1033assert "Error: the wallet is currently being used to rescan the blockchain for related transactions. Please call `abortrescan` before locking the wallet." in e.error["message"]1035try:1036self.nodes[0].cli("-rpcwallet=encrypted_wallet").walletpassphrasechange("passphrase", "newpassphrase")1037except JSONRPCException as e:1038assert_equal(e.error["code"], -4)1039assert "Error: the wallet is currently being used to rescan the blockchain for related transactions. Please call `abortrescan` before changing the passphrase." in e.error["message"]1041assert_equal(importing.result(), [{"success": True}])1043assert_equal(temp_wallet.getbalance(), encrypted_wallet.getbalance())1045self.log.info("Multipath descriptors")1046self.nodes[1].createwallet(wallet_name="multipath", blank=True)1047w_multipath = self.nodes[1].get_wallet_rpc("multipath")1048self.nodes[1].createwallet(wallet_name="multipath_split", blank=True)1049w_multisplit = self.nodes[1].get_wallet_rpc("multipath_split")1050timestamp = int(time.time())1052self.test_importdesc({"desc": descsum_create(f"wpkh({xpriv}/<10;20>/0/*)"),1053"active": True,1054"range": 10,1055"timestamp": "now",1056"label": "some label"},1057success=False,1058error_code=-8,1059error_message="Multipath descriptors should not have a label",1060wallet=w_multipath)1061self.test_importdesc({"desc": descsum_create(f"wpkh({xpriv}/<10;20>/0/*)"),1062"active": True,1063"range": 10,1064"timestamp": timestamp,1065"internal": True},1066success=False,1067error_code=-5,1068error_message="Cannot have multipath descriptor while also specifying \'internal\'",1069wallet=w_multipath)1071self.test_importdesc({"desc": descsum_create(f"wpkh({xpriv}/<10;20>/0/*)"),1072"active": True,1073"range": 10,1074"timestamp": timestamp},1075success=True,1076wallet=w_multipath)1078self.test_importdesc({"desc": descsum_create(f"wpkh({xpriv}/10/0/*)"),1079"active": True,1080"range": 10,1081"timestamp": timestamp},1082success=True,1083wallet=w_multisplit)1084self.test_importdesc({"desc": descsum_create(f"wpkh({xpriv}/20/0/*)"),1085"active": True,1086"range": 10,1087"internal": True,1088"timestamp": timestamp},1089success=True,1090wallet=w_multisplit)1091for _ in range(0, 10):1092assert_equal(w_multipath.getnewaddress(address_type="bech32"), w_multisplit.getnewaddress(address_type="bech32"))1093assert_equal(w_multipath.getrawchangeaddress(address_type="bech32"), w_multisplit.getrawchangeaddress(address_type="bech32"))1094assert_equal(sorted(w_multipath.listdescriptors()["descriptors"], key=lambda x: x["desc"]), sorted(w_multisplit.listdescriptors()["descriptors"], key=lambda x: x["desc"]))1096self.log.info("Test older() safety")1098for flag in [0, SEQUENCE_LOCKTIME_TYPE_FLAG]:1099self.log.debug("Importing a safe value always works")1100safe_value = (65535 | flag)1101self.test_importdesc(1102{1103'desc': descsum_create(f"wsh(and_v(v:pk([12345678/0h/0h]{xpub}/*),older({safe_value})))"),1104'active': True,1105'range': [0, 2],1106'timestamp': 'now'1107},1108success=True1109)1111self.log.debug("Importing an unsafe value results in a warning")1112unsafe_value = safe_value + 11113desc = descsum_create(f"wsh(and_v(v:pk([12345678/0h/0h]{xpub}/*),older({unsafe_value})))")1114expected_warning = (1115f"time-based relative locktime: older({unsafe_value}) > (65535 * 512) seconds is unsafe"1116if flag == SEQUENCE_LOCKTIME_TYPE_FLAG1117else f"height-based relative locktime: older({unsafe_value}) > 65535 blocks is unsafe"1118)1119self.test_importdesc(1120{1121'desc': desc,1122'active': True,1123'range': [0, 2],1124'timestamp': 'now'1125},1126success=True,1127warnings=[expected_warning],1128)1131self.test_import_unused_key()1132self.test_import_unused_key_existing()1133self.test_import_unused_noprivs()1134self.test_per_item_errors_are_reported_in_order()1135self.test_rescan_fails_import()1137if __name__ == '__main__':1138ImportDescriptorsTest(__file__).main()
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.