NexisDAO解决了CKB在NervosDAO上流动性差的问题。NervosDAO作为Nervos的一个系统合约,是 CKB 经济模型的重要亮点之一,持有者可以随时将他们的 CKB 存入 NervosDAO 中从获取收益,但是NervosDAO 是一种定期存款,存在一个最短存款期限,造成CKB流动性比较差。dCKB是NexisDAO针对NervosDAO实现的一个代币。用户将CKB存入NervosDAO后,可以同时铸造相同数量的dCKB。这样既有NervosDAO的固定收益,又有dCKB的流动性,并且dCKB可以自由交易。当然,想要从NervosDAO取款,需要销毁对应的dCKB。
这些功能都是基于智能合约实现的。
默认的Nervos DAO,存款时,存款单的拥有者是用户自己。而dCKB的存款单的拥有者是智能合约,智能合约会给用户发放另一张存单。
同时基于xUDT,铸造出一批dCKB(数量等于存款单上的CKB数量)。用户想从 Nervos DAO 中取出已存储的CKB,需要销毁dCKB和存单。
存款流程:
普通的Nervos DAO交易
Input1: Cell: {
capacity: 10000
lock: User
type: null
data: null
}
Output1: Cell: {
capacity: 10000
lock: User
type: Nervos DAO
data: 0x0000000000000000
}
dCKB的交易:
Input: Cell: {
capacity: 10300
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(xUDT)
data: 10000
}
从上面的交易可以看出,Nervos DAO存款时,增加了2个Cell,且Nervos DAO的lock换成了特殊的lock
DAO Info:用户的存单信息,用于铸造/销毁dCKB、处理存取款流程。它的拥有者是用户。所以只有用户能够取款。
特殊lock:要求解锁时,存在DAO Info的智能合约
dCKB:智能合约铸造出来的代币,用户可以任意处置它,如转账、买卖等。
智能合约的校验逻辑:
1、“DAO Info”要求output1的lock为“特殊的lock”
2、“DAO Info”要求output1的type为"Nervos DAO"
3、“DAO Info”要求data中保存的是要铸造的dCKB数量
4、“DAO Info”要求dCKB增加的数量等于CKB锁定数量
5、“DAO Info”要求"Nervos DAO"处于存款流程
6、"dCKB"为xUDT,它的args为DAO Info
7、“Nervos DAO”:验证对应的存款流程
取款
用户可以随时发送交易从 Nervos DAO 中取出已存储的 CKByte(但这里会涉及到一个锁定期来确定什么时候可以取出代币)。一个 Nervos DAO Cell 获得的利息只会在取出阶段发放,这意味着对于一个包含 Nervos DAO 提取交易来说,所有 Output Cell 的Capacity 总和可能超过所有 Input Cell 的 Capacity 总和。与存款过程不同,从 Nervos DAO 取出需要两个步骤:
在第一阶段,第一个交易是将 Nervos DAO 存款单转换为 Nervos DAO 取款单。
在第二阶段,第二个交易是从 Nervos DAO 取款单中提取代币。
取款阶段1
默认的Nervos DAO流程:
Input1: Cell: {
capacity: 10000
lock: User
type: Nervos DAO
data: 0x0000000000000000
}
Output1: Cell: {
capacity: 10000
lock: User
type: Nervos DAO
data: 0x0012300000000000
}
dCKB的取款流程:
Input1: Cell: {
capacity: 10000
lock: //特殊的lock
type: Nervos DAO
data: 0x0000000000000000
}
Input2: Cell: {
capacity: 150
lock: User
type: DAO Info
data: 10000
}
Input3: Cell: {
capacity: 150
lock: User
type: dCKB(UDT)
data: 10000
}
Output1: Cell: {
capacity: 10000
lock: User
type: Nervos DAO
data: 0x0012300000000000
}
Output2: Cell: {
capacity: 300
lock: User
type: null
data: null
}
通过上面的交易对比,可以发现,dCKB的取款流程要求用户同时提供“DAO Info”的存单和dCKB
通过销毁存单和dCKB,实现Nervos DAO的阶段1的取款,对应的cell就交给用户了,后续的正式取款就跟默认的流程一样了。
智能合约的校验逻辑:
1、“特殊的lock”:判断input中存在“DAO Info”
2、“DAO Info”:判断input1为Nervos DAO
3、“DAO Info”:判断input1、input2的tx_hash一致
4、“DAO Info”:判断Nervos DAO流程处于“取款阶段1”
5、“DAO Info”:判断dCKB销毁的数量等于CKB存款数量
6、“Nervos DAO”:验证对应的取款流程
取款阶段2
阶段 2 的交易是从 Nervos DAO 中取出已存的代币和利息。注意,与第一阶段交易不同的是,用户可以在任何时候发送第一阶段的交易,但在第二阶段的交易中,Nervos DAO要求存款周期到了才能够真正取出CKB。当前的周期大约是1个月,如果你在半个月的时候执行了“取款阶段1”,则需要等待半个月,才能够执行“取款阶段2”。
该流程完全按照 Nervos DAO 合约的逻辑,dCKB这边没有任何修改。