Bitcoin Core描述符钱包如何导出私钥?
去年2024.6.23教链文章《真的假的?Bitcoin Core不支持导入私钥了?》介绍了手搓BTC私钥后如何导入到Bitcoin Core最新的描述符钱包(descriptor wallet)的方法和相关具体指令。有朋友看后问了一些延伸问题,作此文简要补充。
问题一:描述符钱包是否支持导入BIP39助记词?
答:不支持。
描述符钱包虽然支持BIP32分层确定性钱包,但是并不支持BIP39助记词。
这就是教链为何在《刘教链超级小白课》中不建议使用助记词制作囤BTC的冷钱包,而是直接创建并抄写私钥的原因之一。而即便是助记词,不同的软硬件钱包也可能按照不同的规范实现,导致你在A软件中创建的助记词无法导入到B软件,或者导入进去后得到的是全然不同的地址,从而找不到自己囤的BTC了。
问题二:如何创建支持私钥的描述符钱包?
答:最新版本Bitcoin Core不会自动帮你初始化钱包。你需要使用命令自行创建钱包。创建时禁用私钥则会创建为观察钱包(watch-only wallet),不禁用私钥创建标准钱包。具体命令如下:
$ bitcoin-cli -named createwallet wallet_name="testwallet" descriptors=true disable_private_keys=false
请注意上述命令中的 disable_private_keys=false 显式指明不禁用私钥。
如果要增加安全性,最好把钱包加密。
$ bitcoin-cli -rpcwallet=testwallet encryptwallet "你的本地加密密码"
问题三:那么,如何导出描述钱包中某个地址的私钥呢?
答:十分简单!直接把描述符显示出来就可以了。具体命令:
$ bitcoin-cli listdescriptors true{ "wallet_name": "testwallet", "descriptors": [ { "desc": "pkh(5KQ2upQdz2wPfYCT2MfXdgmqZKZtFPDmzm8ubXimR76pYMANUdM)#8rrz94h2", "timestamp": 1753270055, "active": false },...
上面命令的结果所显示的就是2024.6.23教链文章《真的假的?Bitcoin Core不支持导入私钥了?》中导入的私钥描述符。可见,Bitcoin Core既不加密、也不隐藏你导入的描述符,而是完整地展现出来。
请注意listdescriptors命令后面的参数true,它指明了显示私钥描述符。如果不加这个参数的话,则只会显示公钥描述符,那么你就看不见私钥。
看到私钥描述符后,我们就可以用2024.6.23教链文章《真的假的?Bitcoin Core不支持导入私钥了?》中介绍过的getdescriptorinfo进行验证:
$ bitcoin-cli getdescriptorinfo "pkh(5KQ2upQdz2wPfYCT2MfXdgmqZKZtFPDmzm8ubXimR76pYMANUdM)"{ "descriptor": "pkh(04e510bfa12225bbc2044a1847eda44a26e8a842cbf45c11d74ade893e506fc9e209c7c0044c5321ea22edf9dc1d8e45bed3663ed7c637eb564a7dd0a23ca8e45c)#afvrzgrk", "checksum": "8rrz94h2", "isrange": false, "issolvable": true, "hasprivatekeys": true}
结果不是很直观,看不见私钥描述符对应的BTC地址。我们还需要使用下面的命令来查看对应地址:
$ bitcoin-cli deriveaddresses "pkh(04e510bfa12225bbc2044a1847eda44a26e8a842cbf45c11d74ade893e506fc9e209c7c0044c5321ea22edf9dc1d8e45bed3663ed7c637eb564a7dd0a23ca8e45c)#afvrzgrk"[ "13cuZK94jvtCBPDoXd86MiiFTyMnQWkCS6"]
注意上面deriveaddresses指令后面给的参数是上一命令执行结果中的公钥描述符。
至此我们就足够确信最初从描述符列表中获取到的私钥描述符及其所对应的地址了。
是不是很简单?啊,其实并不是!所以教链偷懒,用的其实是electrum。这在之前手搓私钥等文章中早就说过了。
另外说一句,上面演示命令教链其实是使用Bitcoin Knots操作的。Knots是Core的一个分支版本,增加了一些过滤瘦身功能,有助于节省运行节点所需的资源。
什么,你还想问HD钱包地址和私钥的问题?这篇文章已经太长了。这个更复杂、困难的话题,我们还是留着以后再说吧!
(来源:比推)