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