目标
在DAO质押的时候,还能够拥有流动性的资产(既有质押的收益,又有流动性的UDT可以进行其他操作)
方式
创建一个新的UDT,用于表示Nervos DAO中锁定的CKB数量(不考虑收益情况)
这种UDT可以叫做dCKB,它与其他的UDT类似,转账等操作都没有任何限制。
所以1dCKB的价值略大于CKB
用户要取回质押的CKB时,销毁等量的dCKB,就可以取回CKB+收益
默认的方式:https://mp.weixin.qq.com/s/P4KIzRom6-rbfTe3ZOlB5A
Input1: Cell: {
capacity: 10000
lock: User
type: null
data: null
}
Output1: Cell: {
capacity: 10000
lock: User
type: Nervos DAO
data: 0x0000000000000000
}
新的方式:
Input: Cell: {
capacity: 10000
lock: User
type: null
data: null
}
Output1: Cell: {
capacity: 10000
lock: 特殊的lock
type: Nervos DAO
data: 0x0000000000000000
}
Output2: Cell: {
capacity: 150
lock: User
type: DAO Info
data: 10000
}
Output3: Cell: {
capacity: 150
lock: User
type: dCKB(UDT)
data: 10000
}
大家可以发现,新的方式比默认的复杂了很多,这就是为了流动性引入的。
Output1和Output2的lock相同,它的解锁不需要任何签名,仅仅要求存在type为“DAO Info”的cell,其他的逻辑交给“DAO Info”处理。
下面的流程涉及到多个script,多个script之间需要相互信任(可以通过配置组等方式规避循环依赖问题)
流程1:质押CKB流程
- “DAO Info”要求output1的lock为“特殊的lock”
- “DAO Info”要求output1的type为"Nervos DAO"
- “DAO Info”要求data中保存的是要铸造的dCKB数量
- “DAO Info”要求dCKB增加的数量等于CKB锁定数量
- “DAO Info”要求"Nervos DAO"处于存款流程
- "dCKB"为自定义的UDT,它的args为DAO Info
- “dCKB"要求output中存在type为"DAO Info”(铸造流程)
- “Nervos DAO”:验证对应的流程
流程2:取款阶段1
Input1: Cell: {
capacity: 10000
lock: 特殊的lock
type: Nervos DAO
data: 0x0000000000000000
}
Input2: Cell: {
capacity: 150
lock: 特殊的lock
type: DAO Info
data: Owner
}
Input3: Cell: {
capacity: 150
lock: User
type: dCKB(UDT)
data: 10000
}
Output1: Cell: {
capacity: 10000
lock: User
type: Nervos DAO
data: 0x0012300000000000
}
- “特殊的lock”:判断input2的type为“DAO Info”
- “DAO Info”:判断input1、input2、input3的type正确
- “DAO Info”:判断input1、input2的tx_hash一致
- “DAO Info”:判断dCKB销毁的数量等于CKB存款数量
- “Nervos DAO”:验证对应的流程
流程3:取款阶段2
Input1: Cell: {
capacity: 10000
lock: User
type: Nervos DAO
data: 0x0012300000000000
}
Output1: Cell: {
capacity: 10010
lock: User
type: null
data: null
}
该流程与原有流程一样。