3 个版本
0.1.2 | 2024 年 2 月 1 日 |
---|---|
0.1.1 | 2024 年 1 月 31 日 |
0.1.0 | 2024 年 1 月 25 日 |
#2508 in 魔法豆
每月下载 24 次
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.pubkey
和hash
与boltz.exchange共享 - boltz将使用这些信息在他们端创建脚本,并将其作为
redeem_script
发送回我们,同时附上我们需要支付的LNinvoice
和一个他们将为我们提供的用于索赔的链上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的程序与比特币相同,但增加了与Asset
和Value
相关的盲化逻辑。
核心库/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