#swap #script #bitcoin #on-chain #preimage #reverse #boltz

boltz-client

一个用于 BTC/LBTC 与 LN 之间交换的 boltz 客户端

3 个版本

0.1.2 2024 年 2 月 1 日
0.1.1 2024 年 1 月 31 日
0.1.0 2024 年 1 月 25 日

#2508 in 魔法豆

每月下载 24

MIT 许可证

165KB
3.5K SLoC

boltz-rust

脚本

这需要为以下比特币脚本构建一个 一次性 使用 并销毁的钱包

BOLTZ 正常交换:p2shwsh

    HASH160 <hash of the preimage> 
    EQUAL
    IF <reciever public key>
    ELSE <timeout block height> 
    CHECKLOCKTIMEVERIFY
    DROP <sender public key> 
    ENDIF
    CHECKSIG

BOLTZ 反向交换:p2sh

    SIZE
    [32]
    EQUAL
    IF
    HASH160 <hash of the preimage>
    EQUALVERIFY <reciever public key>
    ELSE
    DROP <timeout block height>
    CLTV
    DROP <sender public key> 
    ENDIF
    CHECKSIG

此脚本捕获以下支出条件:

Either; a preimage and the reciever's signature is required // happy case (claimTx)
Or; after a timeout the senders signature is required. // dispute (refundTx)

接收者将能够通过链上提取资金,在反向交换的情况下,我们是接收者,而在正常交换的情况下,这将是 boltz。

发送者将能够在 LN 上提取资金,一旦接收者提取了链上资金并揭示了预图像。在正常交换的情况下,我们是发送者,而在反向交换的情况下,boltz 可以提取资金。

程序

我们没有持久化数据的需要,因此不需要数据库。

我们只需要创建密钥、构建脚本、生成与该密钥对应的一个地址、监视该地址以获取付款,并通过构建交易、解决支出条件并广播来支出未花费的交易输出(utxo)。我们不需要存储交易历史或地址索引等。这必须由客户端处理。

客户端必须确保他们正在轮换所使用的密钥和预图像。为此,有一些辅助结构和方法。

正常交换 的情况下;在最佳情况下,一切顺利,boltz 支付我们的账单并提取链上资金。客户端(我们)只需创建交换脚本并在 boltz 欺诈的情况下在超时后从脚本中提取链上资金。在这种情况下,我们将是 发送者;在争议的情况下,只能在超时后进行支出。

在发生反向兑换的情况下;在愉快的情况下,客户端(我们)将始终需要从脚本中构建和支出以索赔链上资金。我们将是接收者;而我们要为反向兑换创建的解决方案是来自我们密钥的哈希和签名预像

在大多数情况下,正常兑换只需与boltz.exchange api交互,这使得整个过程相当直接。在发生争议并且我们需要从我们资助的链上脚本中收回资金的情况下,我们需要构建脚本并支出它(退款交易)。

为了统一实现挑战,我们将查看进行反向兑换愉快情况的正常程序。

  • 创建一个密钥对.{seckey,pubkey}
  • 创建一个随机秘密(预像)
  • 创建hash=sha256(preimage)
  • keypair.pubkeyhash与boltz.exchange共享
  • boltz将使用这些信息在他们端创建脚本,并将其作为redeem_script发送回我们,同时附上我们需要支付的LN invoice和一个他们将为我们提供的用于索赔的链上address
  • boltz还将返回他们的pubkey和使用的timeout
  • 验证boltz的响应以及在发票中使用的预像(boltz在预像未知之前不能索赔发票)
  • 使用:our_pubkey, hash, boltz_pubkey 和 timeout在我们的端构建脚本
  • 从脚本生成地址并与boltz提供的地址进行匹配检查
  • 确保我们的脚本与boltz提供的redeemScript匹配
  • 支付invoice(使用本地clightning)
  • boltz将确认已支付invoice并将资金发送到创建的地址,从而创建我们可以使用的utxo
  • 构建一个交易/psbt以支出此utxo
  • 解决支出条件:hashlock + signature
  • 将utxo撤回至您的现有比特币钱包
  • 一旦utxo被支出,预像将公开揭示,boltz现在可以索赔invoice

Liquid

liquid的程序与比特币相同,但增加了与AssetValue相关的盲化逻辑。

核心库/API

资源

  • teleport coinswap的脚本钱包

  • bitcoin-wallet 一个简单的rust比特币钱包

  • rust-bitcoin-wallet 另一个旧的简单rust比特币钱包 - 只到Psbt构建

  • boltz Boltz-core - 解决索赔脚本

  • tdryja-ct Tadge Dryja在MIT Opencourseware上的关于保密交易的演讲

  • elements 来自main elements仓库的保密交易文档

测试

开始深入了解此存储库的最佳地方是tests目录。它包含比特币和liquid的集成测试。

它们包含了库的全部用法示例。

运行所有测试,除了被忽略的测试

./test # test helper script
# OR MANUALLY
cargo test
cargo test -- --nocapture # for println! logs

被忽略的测试

运行完整的反向交换集成测试

cargo test test_rsi -- --nocapture --include-ignored

test_rsi是交互式的。它会阻塞终端并提示您支付一个ln发票以继续。

cargo test test_normal_swap -- --nocapture --include-ignored

test_normal_swap被忽略,因为它要求始终使用新的发票,否则会错误地返回409

因此,在手动测试时,请确保更新发票变量。

在运行所有忽略的单元测试之前,请先阅读测试内容。

将boltz的ln测试网频道连接起来

为了确保支付路线是保证的,最好是直接连接到boltz进行测试。

使用botlz的02*频道进行小额测试。

export FUND=2100000
lightning-cli --lightning-dir=/.lightning connect 029040945df331e634fba152ce6a21e3dfca87b68d275e078caeee4753f43e9acb 212.46.38.66:9736
lightning-cli --lightning-dir=/.lightning fundchannel 029040945df331e634fba152ce6a21e3dfca87b68d275e078caeee4753f43e9acb $FUND

里程碑

  • 正常交换(BTC):索赔(已支付发票)
  • 正常交换(BTC):退款
  • 反向交换(BTC):索赔
  • 反向交换(BTC):退款(发票过期)
  • 正常交换(L-BTC):索赔(已支付发票)
  • 正常交换(L-BTC):退款
  • 反向交换(L-BTC):索赔
  • 反向交换(L-BTC):退款(发票过期)

假设

此库做出以下假设

  • 反向交换只花费1个utxo

在比特币中,我们使用listunspent只取第一个utxo(数组0索引)。唯一可能出错的情况是,如果脚本在任何时候有多个utxo,这不太可能。Boltz总会用整个金额来资助脚本地址。

现在当我们获取utxos时,我们期望有一个用交换的确切金额资助的单一utxo。如果金额不匹配或存在多个utxo,我们不会索赔交易。

对此的改进是使SwapTx中的utxos字段使用Vec,并确保总是使用所有可用/可花费的utxos进行清理。我们还应确保金额等于或超过交换的价值,并相应地通知用户意外金额。

  • 比特币反向交换清理/排空是1个输出

  • Liquid反向交换清理/排空是1个保密输出和1个显式费用输出

  • Liquid反向交换utxo始终是保密的。如果boltz使用显式值资助交换脚本,库将错误。它目前只能处理保密交易。

认可

此库由Bull Bitcoin(www.bullbitcoin.com)开发和维护。

特别感谢

  • michael1011在实现和交换方面的指导
  • stratospher的贡献以及通过理解liquid保密交易与我们配对
  • RCasatta在liquid方面的指导

依赖

~24MB
~377K SLoC