Status: draft
Version records:
- 2024/09/05 created by Owen, v0.9.0
Bitlayer-流动性再质押协议合作技术方案提案
Abstract
在 Bitlayer 等比特币2层网络上,存在一类BTC质押项目:用户可以在 Bitlayer (代称:2层网络)上参与BTC质押活动,同时项目方将用户的2层BTC(BL-BTC)相对应的 比特币网络(1层网络)上的BTC 质押到1层质押协议中(如 Babylon ),为用户赚取双重/多重质押收益。 本着维护网络及用户资产安全、实现生态共建共赢的原则,本文提出 Bitlayer 与流动性再质押协议项目方的技术合作方案,实现托管资金的多方共管,切实保障用户资产的安全。
Motivation
- 由于比特币1层网络的限制,没法在比特币网络运行流动性质押/再质押协议;而用户直接在 Bitlayer(2层网络 )参与相应协议时,涉及到1层资金的安全托管问题;如果用户在2层质押的资金,完全交由项目方提取并跨出到1层去参与1层的质押,则存在完全的中心化信任的问题;这对用户资金安全、2层网络信誉及生态繁荣 都存在较大的风险;
- Bitlayer 官方致力于建设和发展继承比特币网络安全性、免信任、可编程的比特币2层网络,原则上不会直接参与各种链上协议的建设,但也会在保障安全的前提下,尽可能为用户提供更多捕获资金收益的机会(包含流动性质押/再质押等)。
Specification
2层质押合约规范
质押
- 用户参与质押时,需要触发质押事件,事件定义如下:
event TokenStaked(uint256 indexed reqId, address indexed user, uint256 indexed amount, address token, uint256 planId, uint256 duration, bytes extraInfo);
- 协议需为用户的每一个操作提供全局唯一的 id ,
reqId
,用于标识事件的唯一性。 - token指币种合约地址;对于 native token,使用 0地址表示(
0x0000000000000000000000000000000000000000
)。 - 质押活动可以分期开展,可以按每期的总额度整体执行1层上的质押/解除质押 操作,此时,可通过 planId 标识用户所参与的是哪一期。
- 后面的 duration 质押期限 和 extraInfo 额外的自定义信息,都是可选的,根据需要做扩展。
解除质押
支持两种解除质押方式:按活动分期 (plan)整体开放赎回、按需申请(提前)解绑。
整体开放赎回
合约提供以下函数,供 Bitlayer 同意开放赎回:
function approveWithdraw(uint256 planId);
按需申请解绑
需分步骤执行:
- 用户申请解除质押时,发出如下事件:
event UnboundRequired(uint256 indexed reqId, address indexed user, uint256 indexed amount, address token, bytes extraInfo);
- Bitlayer (官方跨链桥)收到1层的相应资金后,同意用户的解除质押申请,2层质押合约提供如下接口(支持批量放行)并发出如下事件:
function approveUnbound(uint256[] reqIds);
event UnboundApproved(uint256 indexed reqId, bytes extraInfo);
- 用户最终领取质押本金,相关函数和事件由协议自行决定,本提案不涉及。
合约权限管理规范
- 质押合约应该尽量去中心化,尽量避免中心化管理权限;
- 所有涉及合约内资金使用/转移的管理权限,必须使用多签钱包/DAO合约 等共管/去中心化治理 的方案进行管理,Bitlayer 需成为其中不可或缺的参与方。相关权限包括但不限于:
- 合约升级权限;
- 能直接提取/转移质押合约内用户资金的权限;
- 执行任意代码的权限(建议避免出现这样的功能,若必须存在,则必须多签控制)
1层资金管理规范
- 需基于MPC自托管或第三方托管,提供专用的钱包账号;
- 账号管理权限需由 项目方 与 Bitlayer 两方共同管理;
- 托管服务需要有白名单功能,专用钱包只能往 白名单地址转账及去做质押;
- 将 Bitlayer 官方桥热钱包设置为 白名单;白名单的任何变更均需 Bitlayer 参与审批。
1层和2层联动方案及流程
流程如下图所示:
其中:
- Step 3 和 step 7 ,资金在 桥热钱包与质押专用钱包之间的转账,需要携带2层用户质押/申请解除质押 时的 reqId ,以实现订单关联;
- 交易中携带reqId 的方式:在交易的 OP_RETURN 中,携带Json字符串内容:
{"StReqIds":"id1,id2"}
,多个Id之间使用 “,”分隔,如{"StReqIds":"100,101"}
。
- 交易中携带reqId 的方式:在交易的 OP_RETURN 中,携带Json字符串内容:
- 如果因为一些客观限制而无法做到,则 Bridge Relayer 将按照 金额匹配、先申请先审批的原则放行。如果没有单笔解绑申请与当前收到金额完全匹配,则允许按先申请先放行的原则组合放行。
- 例如:当前有 3 笔申请,金额分别为 1,2,1 ;这时桥热钱包收到从质押专用钱包转账过来 3 BTC,则按时间顺序放行前两笔申请。
另外,对于统一赎回的情形,上图中不需要 step 5,并且 step 8 改为执行
approveWithdraw(uint256 planId)
函数。
- 例如:当前有 3 笔申请,金额分别为 1,2,1 ;这时桥热钱包收到从质押专用钱包转账过来 3 BTC,则按时间顺序放行前两笔申请。
另外,对于统一赎回的情形,上图中不需要 step 5,并且 step 8 改为执行