# Fiber HTLC Cross-Chain Pitch ## Metadata **Status**:: #x **Zettel**:: #zettel/permanent **Created**:: [[2024-03-25]] **Topic**:: [[♯ CKB Fiber]] **Notion**:: [notion.so](https://www.notion.so/cryptape/PCN-HTLC-Cross-Chain-Pitch-d20ce063a3c84357a0fe753dd87a2181?pvs=4) ## Objective 实现 CKB Payment Network 节点能够收取 BTC Payment Network 节点支付的 BTC,并且可以向 BTC Payment Network 节点支付 BTC。 假设有以下角色: - Bob 是 BTC Payment Network 用户,通过任意的客户端节点接入,比如 lnd。 - Carol 是 CKB Payment Network 用户,通过 CKB Payment Network 客户端接入,以下称为 cln。 - Ingrid 是 Cross-Chain Provider,运行着 Cross-Chain Hub 服务(以下简称为 hub),一个 BTC Payment Network 的 lnd 节点,以及一个 cln 节点。 基中 Bob 和 Ingrid 之间不需要有直接的 BTC channel,只需要有一条支付路径存在即可。 而 Carol 和 Ingrid 之间的支付都是通过他们之间直接连接的 channel 进行。这样可以提高跨链服务的可靠性,同时也可以在完成 CKB Payment Network v0 之后就可以完成跨链服务的实现,因为 v0 里不包含多跳的支付。 Ingrid 的 Cross-Chain Hub 服务提供了公开的 RPC 接口来对外进行服务,Carol 通过调用 Ingrid 的 Hub RPC 接口和 CKB Payment Network 中的消息完成支付和收款的所有操作。 ## 支付给 BTC 节点 流程图如下: ![[ckb-cross-chain-hub-v0-pay-btc.jpg|Send BTC|320]] Carol 想向 Carol 支付 1000 sats。 1. Bob 生成 1000 sats 的 Invoice 发给 Carol。 2. Carol 通过 Hub RPC 的接口将 Invoice 提交给 Ingrid,通知 Ingrid 他想要通过 CKB Payment Network 支付这笔费用。除了 Invoice 之外,Carol 还应该提供以下信息: - Carol 想通过什么资产支付,可以选择 CKB 或者任意的 SUDT/XUDT。 3. Ingrid 收到请求后,生成一个跨链支付的定单,将定单信息返回给 Carol,并在本地数据库中保存定单信息。支付定单要包含如下信息: - 定单的有效时间 - HTLC 最小过期时间 - HTLC 使用的 pyment hash - Carol 要支付的所选择的资产的数量。这个数量是 Ingrid 在进行价格换算并加上需要收取的手续费之后的一个值。可以先通过配置文件进行配置,后续应该能配置一个外部信息来源来进行币种的转换。如果 Ingrid 不接受 Carol 提供的币种,或者当前币种和 BTC 的兑换比例波动过大,可以返回错误拒绝服务。这里注意 Ingrid 是需要承担在 BTC Payment Network 中的手续费的,所以需要保证向 Carol 收取的收费费能够承担自己支出的手续费,这个可以通过提交的 Invoice 进行预先的寻路,也可以根据经验设定一个值,在第 6 步如果发现 BTC Payment Network 需要支出的手续费过高时终止交易。 4. Carol 收到跨链支付的定单后,如果接受 Ingrid 的支付数量的提议就继续进行后面的步骤,否则中止本次服务。Carol 需要有一条和 Ingrid 直接连接的 CKB Payment Channel 并且有足够的本地余额来完成支付,否则 Carol 必须注资新那一条和 Ingrid 连接的 Channel。在找到满足条件的 Channel 后,向 Ingrid 发起新增 HTLC 的请求。HTLC 的参数需要和定单中的数据一致。 5. Ingrid 的 cln 节点在收到 CKB 网络中新增 HTLC 的请求时,如果发现有匹配的跨链支付订单,就需要取出对应的 BTC Invoice,通知自己的 lnd 节点支付。 6. Ingrid 的 lnd 根据 invoice 进行寻路并完成支付路由。 7. Bob 收到 HTLC 后会返回 peimage 完成支付的清算。 8. Ingrid 的 lnd 节点收到 peimage 后,如果发现有匹配的跨链支付订单,就通知自己的 cln 节点完成支付清算。 9. Ingrid 的 cln 节点把 peimage 发给 Carol 完成清算。 其中的 6, 7 是 lnd 负责完成,4, 9 由 cln 完成。Cross-Chain Hub 服务需要完成的是 2, 3, 5, 8。 步骤 5 需要 cln 提供 PRC 接口,通过 subscription 或者 polling,能在 cln 收到 htlc 并且自己是最后一跳,并且自己不知道支付的 preimage 的时候通知到 RPC 客户端。而 lnd 调用 payinvoice 接口即可。 步骤 8 可以使用 lnd 的 payinvoice 和 trackpayment 两个 gRPC 完成。其中 payinvoice 可以在支付的同时返回一个 stream 来跟踪交易的状态,而 trackpayment 可以在 hub 服务重启时重新跟踪还没有完成的跨链支付订单。同时 cln 需要提供一个接口提交 preimage。 ## 向 BTC 节点收款 ![[ckb-cross-chain-hub-v0-accept-btc.jpg|Accept BTC|320]] Carol 想接收 1000 sats。 1. Carol 生成跨链收款的请求给 Ingrid,其中要包含以下信息 1. 自己的 cln 节点地址 2. 要接收的 sats 数量,这里是 1000 3. 要接收的 CKB 资产类型,可以选择 CKB 或者任意的 SUDT/XUDT。 4. HTLC 最小过期时间 5. HTLC 使用的 pyment hash 2. Ingrid 收到请求后,生成一个跨链收款的定单,将定单信息返回给 Carol,并在本地数据库中保存定单信息。收款定单要包含如下信息: - BTC Payment Channel 的 payment request - Carol 可以收到的所选择的资产的数量。这个数量是 Ingrid 在进行价格换算并加上需要收取的手续费之后的一个值。可以先通过配置文件进行配置,后续应该能配置一个外部信息来源来进行币种的转换。如果 Ingrid 不接受 Carol 提供的币种,或者当前币种和 BTC 的兑换比例波动过大,可以返回错误拒绝服务。 3. Carol 收到跨链支付的定单后,如果接受 Ingrid 的支付数量的提议就继续进行后面的步骤,否则中止本次服务。Carol 必须检查 BTC payment request 中的 payment hash 是自己在第 1 步中提供的,如果一致,就可以把它发给付款人 Bob。 4. Bob 收到 payment request 后即可完成正常的 BTC Payment Network 的支付。 5. Ingrid 的 lnd 节点如果收到 HTLC 自己是最后一跳,并且不知道 preimage 时,需要通知 hub 服务。如果能找到关联的收款订单,即可进行下一步。 6. Ingrid 的 cln 找到一条和 Carol 的 CKB channel 并且有充足的本地余额,如果没有应该注资新建一条。找到后创建一个符合收款订单信息的 HTLC 给 Carol。 8. Carol 收到 HTLC 后会返回 peimage 完成支付的清算。 9. Ingrid 的 cln 节点收到 peimage 后,如果发现有匹配的跨链收款订单,就通知自己的 lnd 节点完成支付清算。 10. Ingrid 的 lnd 节点把 peimage 发给 Bob 完成清算。 Cross-Chain Hub 服务需要完成的是 1, 2, 5, 8。 步骤 5 可以使用 lnd 的 [invoices rpc](https://github.com/lightningnetwork/lnd/blob/master/lnrpc/invoicesrpc/invoices.proto) 接口实现。同时 cln 需要提供 RPC 接口来发起支付。 步骤 8 需要 cln 提供 PRC 接口,通过 subscription 或者 polling,能在 cln 收到 preimage 时通知到 RPC 客户端。而通知 lnd 可以通过 invoices rpc 里的 `settleinvoice` 完成。 ## Hub 存储 Hub 需要存储支付和收款订单,并保证对未完成订单的状态监控。 ## CKB Payment Network 节点需求汇总 - 提供 RPC 进行支付 - 提供 RPC 提交 HTLC 的 preimage - 提供按 payment hash 订阅 sending HTLC 状态的接口,并能获得最终得到的 preimage。 - 提供按 payment hash 订阅 receiving HTLC 状态的接口