# 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 的说明。