# Fiber Funding Protocol ## Metadata **Status**:: #x **Zettel**:: #zettel/permanent **Created**:: [[2024-04-26]] **Notion**:: [notion.so](https://www.notion.so/cryptape/Funding-Protocol-45a3964eab6f489bb9656c1ff714c224?pvs=4) ## Wallet Interface Demo 会将 Wallet 实现为单独的 Actor,最终目的是方便集成不同的 Wallet 实现。 ### 查询接口 查询接口用于重启后 Wallet 可以索引使用中的 live cells 接口需要返回所有当前进行中且还没有上链且有足够确认的 funding txs。Wallet 必须索引这些 funding txs 在使用的 live cells 避免在其它交易中使用这些 live cells。 ### Channel Aborted Event 如果在 Funding Tx 上链前退出 Channel 的创建,需要通知 Wallet 释放被锁定的 live cells。 ### Funding Event 在以下情况时,CKB Channel Actor 要通知 Wallet Actor 完成 Funding - Channel 已方应该先注资但是还未完成注资。 - 只有一方要注资的由要注资这一方先注资。 - 双方都要注资的由不支付手续费的一方先注资。这是为了减少消息轮次,手续费需要有完整的交易才能完成计算。 - Channel 对方已完成注资。 - 修改 fee rate 之后已方为支付手续费的一方 约定一方先完成注资是为了减少消息数量和简化流程。在实现上要正确处理任何状态下对方发来的 `TxUpdate` 消息以兼容不同的实现。 除了在处理网络消息时实时通知,在重启时如果满足上列条件也需要通知 Wallet Actor 完成 Funding。 Event 包含以下信息: - 当前的 Funding Tx - Funding Tx 哪些部分是由自己添加的 - 双方的目标金额和已出资金额 - 目标 fee rate 手续费为双方的超额出资的部分。如果是 UDT,则是双方约定的需要提供的 CKB Capacity 之外的超额部分。 Wallet Actor 通过调用 Fund 接口完成注资。Fund 的参数即为 `TxUpdate` 消息。 Channel Actor 收到 Funding 通知后需要更新 Funding Tx,并将 `TxRemove`, `TxAdd` 消息转发给对方。如果双方都完成了注资则向对方发送 `TxComplete` 完成 Funding Tx 的构建。 Wallet 应该设置一个手续费上限,防止对方放一个 cycles 或者 size 很大的 partial tx 来蹭手续费。 ### Signing Event 当确认完 commitment tx 之后,且轮到已方签名时,Channel Actor 通知 Wallet Actor 签名。 Event 包含 Funding Tx,可以和 Funding Event 使用相同的结构。 Wallet Actor 通过调用 Sign 接口完成签名。 ## Funding Tx Negotiating Protocol 如果对方不遵守以下规则,应该退出 Channel 的创建,并通过 Channel Aborted Event 通知 Wallet Actor 解锁 live cells。 在完成构建之后,如果因为双花冲突导致提交失败,应该退出 channel 的构建。 在完成签名后提交到交易池成功但是上链超时应该进行 RBF 的协商阶段。Demo 可以先不做 RBF。 ### TxUpdate Tx 的更新需要发给对方完成的 funding tx。通过对比差异来确认哪些部分被移除了。双方只能移除自己添加的部分。其中 `inputs`, `header_deps`, `cell_deps` 都有唯一性,outputs 有可能是有两个完全一模一下,只要能找到有一个能对应上即可。 验证规则 - `version`: 由双方的第一个 `TxUpdate` 消息确定,后续的所有 `TxUpdate` 都必须相同的 `version`。 - `inputs`: 不可和已有 inputs 冲突,必须 live 且确定数 >= N - `outputs`: 第一个 input 必须是 funding cell,且金额和已经注资的部分一致。 - `witnesses`: 必须为空,所有 witnesses 的添加在 Signing 阶段 - `header_deps`: 不允许冲突,live 且确定数 >= N - `cell_deps`: 不允许冲突,live 且确定数 >= N 合并规则 - `inputs`: append - `outputs`: append - `witnesses`: append. - `header_deps`: append - `cell_deps`: append ## Funding Tx Signing Protocol 见 Peer Protocol 和上文中的 Signing Event 的说明。