Nervos DAO 是 CKB 經(jīng)濟(jì)模型的重要亮點(diǎn)之一,它可以有效的消除二級(jí)發(fā)行所帶來的增發(fā)影響,是對(duì)抗稀釋的一劑良藥。一周前,Nervos 團(tuán)隊(duì)發(fā)布了其
Nervos DAO 是 CKB 經(jīng)濟(jì)模型的重要亮點(diǎn)之一,它可以有效的消除二級(jí)發(fā)行所帶來的增發(fā)影響,是對(duì)抗稀釋的一劑良藥。一周前,Nervos 團(tuán)隊(duì)發(fā)布了其 RFC,詳細(xì)說明了 Nervos DAO 中的存入和取出機(jī)制。以下是來自 Nervos 中文社區(qū)的部分翻譯。我們也期待更多的社區(qū)伙伴對(duì) Nervos DAO 進(jìn)行解讀。
摘要
本文描述了 Nervos DAO 中的存入和取出機(jī)制。
動(dòng)機(jī)
Nervos DAO 是一個(gè)智能合約,就像 CKB 上其他的智能合約一樣,用戶可以與之交互。Nervos DAO 的功能之一就是為 CKByte 持幣者提供一種抗稀釋的功能。通過將 CKByte 存入 Nervos DAO 中,持有者可以獲得一定比例的二級(jí)發(fā)行,在存款和取款之間的這段時(shí)間內(nèi),他們的持有比例只會(huì)受到創(chuàng)世塊和基礎(chǔ)發(fā)行的影響,就像和有硬頂?shù)谋忍貛乓粯印?/p>
持有者可以隨時(shí)將他們的 CKByte 存入 Nervos DAO 中。Nervos DAO 是一種定期存款,存在一個(gè)最短存款期限(會(huì)按照區(qū)塊計(jì)算),持有者只能在一個(gè)完整的存款期之后進(jìn)行取款。如果持有者在存款期結(jié)束時(shí)沒有取款,這些 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ā)行而沒有二級(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è)鎖定期來確定什么時(shí)候可以取出代幣)。一個(gè) Nervos DAO Cell 獲得的利息只會(huì)在取出階段發(fā)放,這意味著對(duì)于一個(gè)包含 Nervos DAO 提取交易來說,所有 Onput Cell 的Capacity 總和可能超過所有 Input Cell 的 Capacity 總和。與存款過程不同,從 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í)間。一旦第一階段的交易完成上鏈,那么就可以通過 Nervos DAO 存款單和 Nervos DAO 取款單之間的持續(xù)時(shí)間來計(jì)算利息,以及計(jì)算所存代幣的剩余鎖定期。
第一階段的交易應(yīng)符合下列條件:
· 交易中應(yīng)包含一個(gè)或多個(gè) Nervos DAO 存款單作為輸入。
· 對(duì)于每個(gè) Nervos DAO 存款單來說,交易需要在 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」字段來實(shí)現(xiàn)鎖定期的要求,因此,可能會(huì)事先只生成一個(gè)交易,但是必須等待一段時(shí)間后,他/她才可以發(fā)送交易到 CKB。
第二階段的交易應(yīng)符合以下條件:
· 一個(gè)交易應(yīng)該包含一個(gè)或多個(gè) Nervos DAO 取款單作為 Input。
· 對(duì)于每個(gè) Nervos DAO 取款單來說,交易需要在 header_deps 中包含對(duì)其相關(guān)(取款)區(qū)塊的引用,Nervos DAO 類型腳本將以此作為存款的終點(diǎn)。
· 對(duì)于在 Input 索引 i 中的 Nervos DAO 取款單來說,用戶應(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 中闡述。下面我們還將通過一個(gè)詳細(xì)的例子來介紹這個(gè)過程。
· 對(duì)于一個(gè) Nervos DAO 取款單來說,Cell 交易輸入中的 since 字段應(yīng)該反映 Nervos DAO Cell 的鎖定周期要求,即 180 個(gè)Epoch。例如,如果一個(gè)人在第五個(gè) Epoch 存入 Nervos DAO,則他/她只能在第 185、365 或 545 等 Epoch 從 Nervos DAO 中取出。注意,鎖定期的計(jì)算與利息的計(jì)算無關(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) 來了解如何表示有效的 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 并沒有限制提取代幣的目的,在同一交易中,將剛提取的代幣重新存入 Nervos DAO 中也是有效的。實(shí)際上,一個(gè)交易可以用來自由地混合以下所有操作:
將代幣存入 Nervos DAO 中。
將一些 Nervos DAO 存款單轉(zhuǎn)化為 Nervos DAO 提款單。
從其它 Nervos DAO 中提取 Cell。(Nervos)