智能合約Nervos DAO的存入和取出功能介紹
Nervos DAO 是 CKB 經(jīng)濟(jì)模型的重要亮點(diǎn)之一,它可以有效的消除二級(jí)發(fā)行所帶來(lái)的增發(fā)影響,是對(duì)抗稀釋的一劑良藥。一周前,Nervos 團(tuán)隊(duì)發(fā)布了其 RFC,詳細(xì)說(shuō)明了 Nervos DAO 中的存入和取出機(jī)制。以下是來(lái)自 Nervos 中文社區(qū)的部分翻譯。我們也期待更多的社區(qū)伙伴對(duì) Nervos DAO 進(jìn)行解讀。
動(dòng)機(jī)
Nervos DAO 是一個(gè)智能合約,就像 CKB 上其他的智能合約一樣,用戶可以與之交互。Nervos DAO 的功能之一就是為 CKByte 持幣者提供一種抗稀釋的功能。通過(guò)將 CKByte 存入 Nervos DAO 中,持有者可以獲得一定比例的二級(jí)發(fā)行,在存款和取款之間的這段時(shí)間內(nèi),他們的持有比例只會(huì)受到創(chuàng)世塊和基礎(chǔ)發(fā)行的影響,就像和有硬頂?shù)?u>比特幣一樣。
持有者可以隨時(shí)將他們的 CKByte 存入 Nervos DAO 中。Nervos DAO 是一種定期存款,存在一個(gè)最短存款期限(會(huì)按照區(qū)塊計(jì)算),持有者只能在一個(gè)完整的存款期之后進(jìn)行取款。如果持有者在存款期結(jié)束時(shí)沒(méi)有取款,這些 CKByte 將自動(dòng)進(jìn)入新的存款周期,這樣可以盡量減少持幣人的操作次數(shù)。
背景
CKB 的發(fā)行曲線由兩部分組成:
· 基礎(chǔ)發(fā)行:獎(jiǎng)勵(lì)給礦工的有硬頂?shù)拇鷰虐l(fā)行,使用與比特幣相同的發(fā)行曲線,約每 4 年減半。
· 二級(jí)發(fā)行:常量發(fā)行,每個(gè)難度調(diào)節(jié)周期(Epoch)都會(huì)發(fā)行相同數(shù)量的 CKByte,這意味著隨著時(shí)間的推移,二級(jí)發(fā)行比率將逐漸趨近于零。因?yàn)槊總€(gè) Epoch 內(nèi)的區(qū)塊數(shù)量是動(dòng)態(tài)調(diào)整的,所以每個(gè)區(qū)塊的二級(jí)發(fā)行會(huì)是一個(gè)變量。
如果在 CKB 中只有基礎(chǔ)發(fā)行而沒(méi)有二級(jí)發(fā)行,那么 CKByte 的總供應(yīng)量將會(huì)存在一個(gè)硬頂,其發(fā)行曲線將會(huì)和比特幣完全一樣。為了保障 CKB 的長(zhǎng)期持有者不被二級(jí)發(fā)行稀釋,在 Nervos DAO 中鎖定的 CKByte 將獲得部分比例的二級(jí)發(fā)行,該比例等于鎖定在 Nervos DAO 中的 CKByte 占整個(gè) CKByte 流通量的百分比。
更多關(guān)于 Nervos DAO 和 CKB 經(jīng)濟(jì)模型的細(xì)節(jié),請(qǐng)查看[Nervos RFC #0015]
https://github.com/nervosnetwork/rfcs/blob/master/rfcs/0015-ckb-cryptoeconomics/0015-ckb-cryptoeconomics.md
存款
用戶可以隨時(shí)發(fā)送交易將 CKBytes 存入 Nervos DAO。CKB 在創(chuàng)世塊中包含一種特殊的 Nervos DAO 類型腳本。想要存儲(chǔ)到Nervos DAO 中,只需隨時(shí)創(chuàng)建一個(gè)包含新 Output Cell 的交易,并滿足以下要求:
· 創(chuàng)建的 Output Cell 類型腳本必須設(shè)置為 Nervos DAO 腳本。
· 該 Output Cell 的 Cell Data 必須有 8 個(gè)字節(jié)長(zhǎng)度,并用 0 將其填充完整。
為方便起見,一個(gè)滿足上述條件的 Cell 被稱為「Nervos DAO 存款單」。為了遵循 CKB 的腳本驗(yàn)證邏輯,存款交易還需要將 Nervos DAO 類型腳本的引用包含在封閉交易的 cell_deps 部分中。注意,在一個(gè)交易中,我們不對(duì)完整的存款數(shù)量進(jìn)行限制,一個(gè)有效的交易中可以創(chuàng)建多個(gè)「Nervos DAO 存款單」。
取款
用戶可以隨時(shí)發(fā)送交易從 Nervos DAO 中取出已存儲(chǔ)的 CKByte(但這里會(huì)涉及到一個(gè)鎖定期來(lái)確定什么時(shí)候可以取出代幣)。一個(gè) Nervos DAO Cell 獲得的利息只會(huì)在取出階段發(fā)放,這意味著對(duì)于一個(gè)包含 Nervos DAO 提取交易來(lái)說(shuō),所有 Onput Cell 的Capacity 總和可能超過(guò)所有 Input Cell 的 Capacity 總和。與存款過(guò)程不同,從 Nervos DAO 取出需要兩個(gè)步驟:
· 在第一階段,第一個(gè)交易是將 Nervos DAO 存款單轉(zhuǎn)換為 Nervos DAO 取款單。
· 在第二階段,第二個(gè)交易是從 Nervos DAO 取款單中提取代幣。
取款階段 1
第一階段是將 Nervos DAO 存款單轉(zhuǎn)換為 Nervos DAO 取款單,這里的目的是確定一個(gè) Cell 存入 Nervos DAO 的時(shí)間。一旦第一階段的交易完成上鏈,那么就可以通過(guò) Nervos DAO 存款單和 Nervos DAO 取款單之間的持續(xù)時(shí)間來(lái)計(jì)算利息,以及計(jì)算所存代幣的剩余鎖定期。
第一階段的交易應(yīng)符合下列條件:
· 交易中應(yīng)包含一個(gè)或多個(gè) Nervos DAO 存款單作為輸入。
· 對(duì)于每個(gè) Nervos DAO 存款單來(lái)說(shuō),交易需要在 header_deps 中包含對(duì)其相關(guān)(存款)區(qū)塊的引用,Nervos DAO 類型腳本將以此作為存款的起點(diǎn)。
· 在 Input 索引 i 中的 Nervos DAO 存款單,應(yīng)該在 Onput 索引 i 中創(chuàng)建 Nervos DAO 取款單,并滿足以下要求:
取款單應(yīng)該與存款單具有相同的鎖定腳本
取款單應(yīng)該與存款單具有相同的 Nervos DAO 類型腳本
取款單應(yīng)該與存款單具有相同的 Capacity
取款單也應(yīng)該有 8 個(gè)字節(jié)長(zhǎng)度的 Cell Data,但不是 8 個(gè)零,Cell Data 部分應(yīng)該存儲(chǔ)存款單所在區(qū)塊的區(qū)塊數(shù)。該數(shù)字應(yīng)該以 64 位未簽名小端序整數(shù)格式打包。
· Nervos DAO 類型腳本應(yīng)該包含在取出交易的 cell_deps 中。
一旦該交易完成上鏈,用戶就可以開始準(zhǔn)備階段二的交易了。
取款階段 2
階段 2 的交易是從 Nervos DAO 中取出已存的代幣和利息。注意,與第一階段交易不同的是,用戶可以在任何時(shí)候發(fā)送第一階段的交易,但在第二階段的交易中,我們將會(huì)設(shè)置一個(gè)「since」字段來(lái)實(shí)現(xiàn)鎖定期的要求,因此,可能會(huì)事先只生成一個(gè)交易,但是必須等待一段時(shí)間后,他/她才可以發(fā)送交易到 CKB。
第二階段的交易應(yīng)符合以下條件:
· 一個(gè)交易應(yīng)該包含一個(gè)或多個(gè) Nervos DAO 取款單作為 Input。
· 對(duì)于每個(gè) Nervos DAO 取款單來(lái)說(shuō),交易需要在 header_deps 中包含對(duì)其相關(guān)(取款)區(qū)塊的引用,Nervos DAO 類型腳本將以此作為存款的終點(diǎn)。
· 對(duì)于在 Input 索引 i 中的 Nervos DAO 取款單來(lái)說(shuō),用戶應(yīng)該定位到包含原始 Nervos DAO 存款單的區(qū)塊頭。有了這個(gè)存入?yún)^(qū)塊頭之后,我們還需要做 2 個(gè)操作:
當(dāng)前交易的 header_deps 中應(yīng)該包含存入?yún)^(qū)塊頭的哈希
header_deps 中存入?yún)^(qū)塊頭哈希的索引應(yīng)該使用 64 位未簽名小端序整數(shù)格式,并保存在屬于相應(yīng) Witness 輸入 Cell 類型腳本部分的索引 i 中。Witness 當(dāng)前的論證組織將會(huì)在另外一個(gè)單獨(dú)的 RFC 中闡述。下面我們還將通過(guò)一個(gè)詳細(xì)的例子來(lái)介紹這個(gè)過(guò)程。
· 對(duì)于一個(gè) Nervos DAO 取款單來(lái)說(shuō),Cell 交易輸入中的 since 字段應(yīng)該反映 Nervos DAO Cell 的鎖定周期要求,即 180 個(gè)Epoch。例如,如果一個(gè)人在第五個(gè) Epoch 存入 Nervos DAO,則他/她只能在第 185、365 或 545 等 Epoch 從 Nervos DAO 中取出。注意,鎖定期的計(jì)算與利息的計(jì)算無(wú)關(guān)。在第五個(gè) Epoch 存入,在第一百個(gè) Epoch 使用 withdraw block,在第 185 個(gè) Epoch 使用 since 字段是完全有效的。請(qǐng)參考 since RFC (https://github.com/nervosnetwork/rfcs/blob/master/rfcs/0017-tx-valid-since/0017-tx-valid-since.md) 來(lái)了解如何表示有效的 Epoch 數(shù),Nervos DAO 類型腳本目前只接受絕對(duì)的 Epoch 數(shù)作為 since 值。
· 利息計(jì)算邏輯完全獨(dú)立于鎖定期限的計(jì)算邏輯,我們將在下一節(jié)中解釋利息計(jì)算邏輯。
· Nervos DAO 類型腳本中,所有 Input Cell 的 Capacity 加上利息的總和應(yīng)該大于或等于所有 Onput Cell 的 Capacity 的總和。
· Nervos DAO 類型腳本應(yīng)該被包含在 cell_deps 中。
正如上面的步驟所示的那樣,在一個(gè)交易中執(zhí)行多個(gè)取款是完全有可能的。更重要的是,Nervos DAO 并沒(méi)有限制提取代幣的目的,在同一交易中,將剛提取的代幣重新存入 Nervos DAO 中也是有效的。實(shí)際上,一個(gè)交易可以用來(lái)自由地混合以下所有操作:
將代幣存入 Nervos DAO 中。
將一些 Nervos DAO 存款單轉(zhuǎn)化為 Nervos DAO 提款單。
從其它 Nervos DAO 中提取 Cell。