#钱包 #描述符 #联邦 #密钥 #链上 #资金 #私钥

应用 fedimint-recoverytool

从退役的Fedimint联邦中检索链上资金的工具

38个版本

0.4.0 2024年8月5日
0.4.0-rc.42024年7月26日
0.3.3 2024年7月25日
0.3.0-rc.32024年3月26日
0.2.0-rc32023年11月29日

#697 in 神奇豆

Download history 6/week @ 2024-04-27 81/week @ 2024-05-04 12/week @ 2024-05-11 67/week @ 2024-05-18 14/week @ 2024-05-25 1/week @ 2024-06-01 146/week @ 2024-06-29 34/week @ 2024-07-06 188/week @ 2024-07-13 400/week @ 2024-07-20 130/week @ 2024-07-27 104/week @ 2024-08-03 8/week @ 2024-08-10

713 次每月下载

MIT 许可证

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

要恢复钱包,此工具需要看护者的密钥、联邦的钱包描述符以及用于推导钱包描述符的调整。

密钥和钱包描述符可以以两种方式提供

  1. 配置:通过指定 --cfg 标志,工具将直接从配置文件中读取密钥和描述符
  2. 直接参数:否则必须提供 --key--descriptor 标志。在这种情况下,可以提供 --network 标志来指定网络,因为它不能从配置中确定。

组成钱包的调整可以以三种方式提供,这些对应于上面帮助中列出的命令

  1. 直接:手动提供单个调整(例如,从尝试在联邦关闭后进行接引的用户钱包中提取)
  2. utxos:从提供的数据库中读取所有已确认的UTXOs,这将排除在途UTXOs。
  3. epochs:在提供的数据库中扫描整个epoch历史以进行调整,这将返回最多的钱包描述符,其中大部分为空,但应该涵盖资金和边缘情况。

在处理utxosepochs时,提供的数据库不必是尝试恢复的保管人数据库,而是任何一直处于一致状态直到最后的保管人数据库。这意味着即使在只有一个数据库和tn配置/密钥的情况下,资金也是可恢复的。

恢复

此工具旨在与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