38个版本
0.4.0 | 2024年8月5日 |
---|---|
0.4.0-rc.4 | 2024年7月26日 |
0.3.3 | 2024年7月25日 |
0.3.0-rc.3 | 2024年3月26日 |
0.2.0-rc3 | 2023年11月29日 |
#697 in 神奇豆
713 次每月下载
1MB
23K SLoC
恢复工具
recoverytool 允许从离线联邦中提取钱包描述符及其对应的私钥。这在联邦关闭且用户已提款,但因其电子现金票据丢失或其他运营困难而在联邦的链上钱包中仍有资金的情况下很有用。
重要:
- 这是一个专家工具,请小心使用
- 不要与不可信的各方共享任何输出,它包含密钥材料
- 在联邦运行时或预期再次启动时不要使用
用法
Tool to recover the on-chain wallet of a Fedimint federation
Usage: recoverytool [OPTIONS] --password <PASSWORD> <--cfg <CONFIG>|--descriptor <DESCRIPTOR>> <COMMAND>
Commands:
direct Derive the wallet descriptor using a single tweak
utxos Derive all wallet descriptors of confirmed UTXOs in the on-chain wallet. Note that unconfirmed change UTXOs will not appear here
epochs Derive all wallet descriptors of tweaks that were ever used according to the epoch log. In a long-running and busy federation this list will contain many empty descriptors
help Print this message or the help of the given subcommand(s)
Options:
--cfg <CONFIG> Directory containing server config files
--password <PASSWORD> The password that encrypts the configs [env: FM_PASSWORD=]
--descriptor <DESCRIPTOR> Wallet descriptor, can be used instead of --cfg
--key <KEY> Wallet secret key, can be used instead of config together with --descriptor
--network <NETWORK> Network to operate on, has to be specified if --cfg isn't present [default: bitcoin]
--readonly Open the database in read-only mode, useful for debugging, should not be used in production
-h, --help Print help
要恢复钱包,此工具需要看护者的密钥、联邦的钱包描述符以及用于推导钱包描述符的调整。
密钥和钱包描述符可以以两种方式提供
- 配置:通过指定
--cfg
标志,工具将直接从配置文件中读取密钥和描述符 - 直接参数:否则必须提供
--key
和--descriptor
标志。在这种情况下,可以提供--network
标志来指定网络,因为它不能从配置中确定。
组成钱包的调整可以以三种方式提供,这些对应于上面帮助中列出的命令
- 直接:手动提供单个调整(例如,从尝试在联邦关闭后进行接引的用户钱包中提取)
- utxos:从提供的数据库中读取所有已确认的UTXOs,这将排除在途UTXOs。
- epochs:在提供的数据库中扫描整个epoch历史以进行调整,这将返回最多的钱包描述符,其中大部分为空,但应该涵盖资金和边缘情况。
在处理utxos和epochs时,提供的数据库不必是尝试恢复的保管人数据库,而是任何一直处于一致状态直到最后的保管人数据库。这意味着即使在只有一个数据库和t
的n
配置/密钥的情况下,资金也是可恢复的。
恢复
此工具旨在与Bitcoin Core钱包和jq
工具一起使用。虽然下面简要概述了可能的用法模式,但请参阅Bitcoin Core文档以获取有关钱包和交易处理的更多信息。
recoverytool
的输出由一个钱包描述符数组组成,其中可选地包含一些元数据。描述符包括n-1个公钥和1个私钥(属于运行脚本的保管人)
$ recoverytool --cfg fedimintd-1 --password pass1 utxos --db fedimintd-1/database/ | jq
[
{
"outpoint": "c76d51c9c6dc6b8e462c37b3fa376e7c2055f04f16a8fffc2ab66c5bf0deff55:1",
"descriptor": "wsh(sortedmulti(3,0280bf3115766b7e1cb23f2f57caf4de5a9171d3985934f2895cc568b384b52319,cSRM825vXJwf8iXcngedon8nQsPC9VMB18wSiG1Fgw6Y1Kzi16ta,021123625d9b21822e1178fc0d2b3f737d0397584cfac821df3250e49c3127cab5,03865705be62a71a3776cca1169908099ad6d138a0c0ed4aeeaf2c8e64616f4085))#h2zg3uhw",
"amount_sat": 20000
},
{
"outpoint": "d19b1545907679882e925ea0c2130969eab26ab2e27431404fef7d30a5fd649c:1",
"descriptor": "wsh(sortedmulti(3,025fbaf8b94d101215d608ae6485b5746142933c261dc5616190f3a331eeaf5f3a,cTgHDPq43RFCy5i9jr2XwMQQNEJ1Y2cYHxhyvXj2wLpF8pi2LxUj,02e25f08feee064cb4bbbb3b33c7e0ddf4d06ed261201f40532c4f5d2152072ecf,03b215967b608d4309fec126a42d49950f6049406b439d4f743cb368362a0cfce0))#v6s5xpsa",
"amount_sat": 10000
}
]
要将其导入到bitcoin core中,请使用以下jq
命令将工具的输出转换为bitcoin-cli importdescriptors
的有效输入格式
$ WALLETS="$(recoverytool --cfg fedimintd-1 --password pass1 utxos --db fedimintd-1/database/ | jq '. | map({"desc": .descriptor, "timestamp":0})')"
[
{
"desc": "wsh(sortedmulti(3,0280bf3115766b7e1cb23f2f57caf4de5a9171d3985934f2895cc568b384b52319,cSRM825vXJwf8iXcngedon8nQsPC9VMB18wSiG1Fgw6Y1Kzi16ta,021123625d9b21822e1178fc0d2b3f737d0397584cfac821df3250e49c3127cab5,03865705be62a71a3776cca1169908099ad6d138a0c0ed4aeeaf2c8e64616f4085))#h2zg3uhw",
"timestamp": 0
},
{
"desc": "wsh(sortedmulti(3,025fbaf8b94d101215d608ae6485b5746142933c261dc5616190f3a331eeaf5f3a,cTgHDPq43RFCy5i9jr2XwMQQNEJ1Y2cYHxhyvXj2wLpF8pi2LxUj,02e25f08feee064cb4bbbb3b33c7e0ddf4d06ed261201f40532c4f5d2152072ecf,03b215967b608d4309fec126a42d49950f6049406b439d4f743cb368362a0cfce0))#v6s5xpsa",
"timestamp": 0
}
]
并在bitcoin-cli
中运行importdescriptors
$ bitcoin-cli importdescriptors "$WALLETS"
[
{
"success": true,
"warnings": [
"Not all private keys provided. Some wallet functionality may return unexpected errors" ] },
{
"success": true,
"warnings": [
"Not all private keys provided. Some wallet functionality may return unexpected errors"
]
} ]
要转移这些资金,请使用walletcreatefundedpsbt
创建交易,使用walletprocesspsbt
在钱包中使用t
进行签名,并使用finalizepsbt
提取最终交易。该交易可以使用sendrawtransaction
进行广播。
此工作流程已在Bitcoin Core和PSBT上进行测试,以协同签署交易,有n个不同的钱包。尽管如此,您可能能够将所有密钥导入一个钱包并立即签署交易。
依赖项
~103MB
~2M SLoC