本文檔為 Nervos 核心項目 CKB 提供一個概覽性的描述。Nervos 是一個分層架構的分布式應用網絡,CKB 是可以為 Nervos 網絡中所有分布式應用提供數據、資產與身份服務的共同知識庫(Common Knowledge Base)。
Background
比特幣是世界上第一個區塊鏈網絡,專門為記錄現金賬本設計。比特幣賬本是比特幣區塊鏈網絡維護的系統狀態,賬本中的最小存儲單位是UTXO(未花費的交易輸出)。用戶可以使用錢包花費現有的 UTXO,生成新的 UTXO,并將其打包成交易,發送到比特幣網絡中接受驗證和共識。UTXO 中記錄了金額以及表達所有權的鎖腳本,用戶必須提供相應的解鎖數據才能夠花費UTXO。由于 UTXO 數據結構以及比特幣腳本能力的限制,我們很難使用比特幣賬本來記錄其他類型的資產和數據,只能通過 Color-coin、Meta-coin 甚至硬分叉這樣的方案來滿足不同的場景,實現應用的代價很高。
(思考 1:Color-coin、Meta-coin 怎么實現的呢?)
以太坊通過智能合約引入通用性計算,創造出了一個基于智能合約實現的生態。以太坊賬本是以太坊區塊鏈網絡維護的系統狀態,賬本由賬戶構成,賬戶內部可以存放代碼,并提供一個 256bitsKV 數據庫存放數據,這樣存放了代碼的賬戶就是以太坊智能合約。用戶在以太坊上可以發出兩種類型的交易:一種交易可以創建合約,將用戶編寫的應用邏輯部署到區塊鏈上,存放到合約賬戶中;另一種交易可以將用戶提供的輸入數據發給指定的合約賬戶,觸發賬戶所保存的代碼的執行,由代碼產生更新賬戶內的 KV 數據庫,產生新的內部狀態。以太坊智能合約提供了更強大的計算能力以及靈活性,在一定程度上解決了比特幣的問題,但依然有其局限性:
- 性能難擴展:以太坊以狀態機事件作為設計中心(圖 1),交易中包含的是狀態機事件輸入而不是狀態本身,再加上 EVM 的圖靈完備性,節點在處理交易之前難以判斷交易相關性,難以對交易進行并行處理。同時,由于交易中沒有包含賬本狀態,分片時還需要額外解決數據可用性難題。
(思考 2:狀態機事件輸入該怎么理解?交易中包含哪些內容呢?)
- 狀態不確定性:合約狀態由合約代碼更新,而合約代碼執行又受執行環境影響(例如被調用合約的當前狀態)。因此用戶在發起交易時無法完全確定交易執行后的結果。
- 單體合約 (Mono-Contract):以太坊智能合約將計算和存儲緊緊綁定,形成一個不可更改的整體。用戶必須使用賬戶模型、EVM 字節碼以及256bits KV 數據庫范式來實現所有場景,缺乏效率和靈活性。
(思考 3:建議計算和存儲分開羅?)
現有區塊鏈的經濟模型也面臨著越來越多的挑戰。隨著用戶和應用的增多,區塊鏈上存儲的數據也越來越多。現有的經濟模型只考慮計算成本,使得用戶產生的數據可以無成本的占用所有節點的存儲空間。網絡中使用的代幣價格波動性極大,在代幣價格上漲時為應用使用者制造了難以承受的手續費負擔。
(思考 4:經濟模型中考慮計算成本,也還需要考慮存儲成本?現在已經有哪些區塊鏈考慮了存儲模型?代幣上漲,應用使用者成本提高了··怎么解決呢?)
現有區塊鏈的追求完全的去中心化,要求網絡中的節點完全對等,極大的限制了自身設計空間,難以應對越來越廣泛的應用需求。隨著區塊鏈狀態膨脹,運行全節點對硬件的要求越來越高,運行全節點的用戶也越來越少。同時,用戶使用互聯網服務的模式已經完成了從桌面瀏覽器到移動應用的遷移,更加劇了完全對等設計的弊端。區塊鏈節點類型分化已成為必然趨勢。
(思考 5:區塊狀態膨脹,意思是指區塊鏈上全節點需同步的數據越來越大,相對應的存儲硬件成本也越來越高,在加上互聯網用戶已經從PC轉向移動端,那么區塊鏈節點類型分化,向移動端擴展成為必然趨勢,我覺得論證的結論還比較靠譜。但維護區塊鏈系統是否真的需要轉向移動端?互聯網也僅僅有應用而不是服務端遷移到了移動端,那么是不是可以理解為區塊鏈節點是一個非常輕量級的客戶端,同時也是服務端,那么區塊鏈輕節點到底應該具備怎樣的功能呢?)
綜合以上,我們重新思考并設計了 Nervos CKB,提出徹底解耦的分布式應用新范式,以支持更普遍的計算和存儲需求,獲得更好的性能,使經濟激勵更平衡,對移動設備更友好。我們希望Nervos CKB 可以成為全球 76 億人的共同知識庫,承載各種分布式應用。
(思考 6:Nervos CKB更普遍的支持計算和存儲需求,具體怎么支持的呢,為什么說經濟激勵更加平衡呢,移動設備更友好體現在哪些方面?共同知識庫是一個什么樣的概念呢?)
Overview
Nervos CKB(以下簡稱 CKB)是一個以通用共同知識庫(Appendix: Common KnowledgeBase)為設計目標的區塊鏈。CKB 網絡由存檔節點、共識節點和輕節點組成:
- 存檔節點:CKB 全節點,對新的區塊和交易進行驗證,中繼傳播區塊和交易,保存 CKB上所有的交易歷史。存檔節點能提高整個網絡的健壯性,為 CKB 上的應用提供歷史查詢。(全節點:區塊交易驗證、廣播、存儲歷史交易)
- 共識節點:參與共識協議的 CKB 節點。共識節點接收新的交易,將交易打包成塊,并對新生成的區塊產生共識。共識節點不需要保存所有的交易歷史。(共識節點:交易打包,產生區塊)
- 輕節點:用戶通過輕節點使用 CKB 網絡,輕節點只保存非常少量的數據,可以運行在桌面電腦或者是移動設備上。(輕節點:保存哪些數據呢?)
CKB 節點通過點對點網絡協議組成一個分布式網絡,對區塊和交易數據進行轉發和廣播。共識節點運行混合共識協議,以一定的時間間隔產生新的區塊并形成共識,新區塊會被所有節點承認并追加到區塊鏈尾部,新區塊中的交易會更新 CKB 的狀態。
(思考 7:混合共識協議具體是怎么樣的一種協議?新區塊中的交易更新CKB的狀態,CKB有哪幾種狀態,各狀態是怎樣流轉的呢)
A New DApp Paradigm
CKB 提出一種全新的分布式應用范式,該范式由以下五種元素組成:
- Cell
- Type
- Validator
- Generator
- Identity
通過這五種元素,我們將分布式應用徹底解耦成計算、存儲和身份三個方面。在此基礎上,計算進一步分化為生成(Generator)和驗(Validator)兩個步驟,存儲(Cell)也進一步通用化,可以支持任意結構化(Type)的數據。CKB 中的分布式應用,可以使用 Type 定義合適的數據結構,將應用數據存放在多個 Cells 中;應用的執行邏輯由 Generator 實現,狀態驗證邏輯由 Validator 實現;Generator 在客戶端運行,用戶進行操作時生成新的應用狀態,新狀態被打包在交易中發送到全網;網絡中的節點先驗證交易發送者的身份,然后使用 Validator 對交易中新狀態的有效性進行驗證,驗證通過后將新狀態保存到 CKB 中。
(思考 8: 抽象出5種元素,將分布式應用中的存儲、計算-生成、計算-校驗,驗證、身份融合在一個完整的交易事務中 ,其他的區塊鏈是怎么樣來實現這樣一個區塊鏈的完整交易過程呢,比特幣,以太坊,比原鏈怎么實現?)
CKB 以狀態為核心設計數據流及經濟激勵,交易中包含的是新的狀態,而不是觸發狀態機的事件。因此,CKB 區塊鏈中直接保存了狀態數據,狀態隨著區塊一起同步,無需額外的狀態同步協議,降低了系統復雜度,提高了系統可用性。分布式應用的狀態被剝離到 Cells 中保存,Validator 和 Generator 內部沒有任何狀態,計算結果完全依賴輸入,因此都是確定性的純函數(Pure function),容易組合形成更復雜的邏輯。CKB 分布式應用使用的是一種近似Lambda Calculus 的計算范式,能夠實現與圖靈機相同的計算能力。
(思考 9 :CKB以狀態為核心設計數據流和經濟激勵,交易中包含的是最新的狀態,我該怎么理解以太坊交易中包含的是基于觸發狀態機的事件呢?一個是交易中包含狀態, 另一個是交易包含事件....)
表 1 將 Bitcoin、Ethereum 和 Nervos CKB 進行了比較。
State Generation and Validation
在 CKB 中狀態生成和驗證分離,兩個階段可以既可以使用不同的算法,也可以使用相同的算法。
對于一般的場景,目前還沒有通用且高效的簡化驗證算法的方法。在這種情況下,我們使用相同的算法進行狀態生成和驗證:客戶端使用該算法生成新的狀態,節點利用交易中記錄的依賴狀態作為輸入,執行同樣的算法,對比輸出的狀態是否與交易中記錄的新狀態相同,相同則驗證通過。在使用相同算法的情況下,狀態生成和驗證只有執行環境的差別,沒有計算復雜度的差別。將生成和驗證分離,生成轉移到客戶端執行的好處是:
確定性:交易的確定性是分布式應用的核心訴求之一。交易時延的確定性(HybridConsensus)已經得到了廣泛的重視,但交易結果(即由交易產生的新狀態)的確定性卻往往被忽視。如果狀態在節點生成,用戶在發起狀態生成請求時無法完全確定請求被執行時的環境,由此可能產生用戶不希望的執行結果。在 CKB 中,由于新的狀態由用戶生成,由用戶完全確定新狀態之后再廣播,交易所能觸發的狀態變更用戶可以完全確定。要么交易通過驗證,由用戶生成并確認的新狀態被接受,要么交易沒有通過驗證,不造成任何狀態改變(圖 2)。
可并行性:如果狀態在節點生成,節點在處理交易前無法判斷該交易依賴哪些狀態,也就無法判斷交易的相關性。在 CKB 中,由于交易顯式地包含了交易依賴的舊狀態以及生成的新狀態,節點可以直接判斷交易之間的相關性(Transaction)。無相關性的交易可以通過各種方式并行處理,包括多核并行及分片。并行處理交易是解決區塊鏈性能擴展問題的關
鍵。
(思考 10 :交易的相關性是指什么?判斷交易的相關性的意義在哪里?哦,無相關的交易可以考慮并行處理,多核并行或者分片..)
- 計算分布式程度高:充分利用客戶端計算資源,減輕節點計算負擔,整體效率更高。
(思考11:節點計算和客戶端計算的分工是怎么樣的?)
- 客戶端更靈活,容易與客戶端所在平臺集成:雖然使用相同的算法,但是生成和驗證可以使用不同的方法實現。客戶端可以靈活選擇合適的編程語言來實現生成算法,計算效率可以更高,生成程序可以無縫集成到運行平臺中,提供最好的用戶體驗。
(思考 12: 意思是指客戶端可以多樣化選擇不同的編程語言來實現生成算法,并且生成程序還可以很好的集成到運行平臺中來,這個運行平臺是指節點運行平臺嗎?)
對于許多特定類型的場景,我們可以找到計算復雜度遠低于生成算法的驗證算法,最典型的例子是UTXO 賬本和非對稱簽名。一個很有趣的例子是涉及排序和搜索的算法:平均復雜度最好的排序算法 QuickSort(快速排序) 的計算復雜度是 O(NlogN),而驗算排序的復雜度總是只有 O(N);如果要搜索一個元素在數組中的位置,在數組已經排好序的情況下計算復雜度為O(logN),而驗算的復雜度是 O(1)。對于越復雜的場景,出現生成與驗算復雜度不對稱情況的概率更高。
(思考 13:驗算的復雜度是O(1) 怎么理解,是指在已經排序好的數組里面進行驗算嗎?驗算是驗證交易的合法性嗎?該段落主要想要說明:不同的計算場景,生成和驗算復雜度不對稱情況的概率高?所以客戶端用來生成,節點用來驗算?兩功能分別隔離?)
在可以利用這種不對稱性的情況下,節點處理效率會有極大的提升,更多的計算細節只存在于客戶端,也更有利于算法保護和隱私保護。隨著密碼學技術的發展,我們可能會發現為通用問題設計非對稱生成和驗證算法的方法,例如通用的非交互式零知識證明。CKB 的狀態生成與驗證分離架構
也能夠為其提供恰到好處的支持。
(思考 14: 什么是通用是的非交互式零知識證明?此處重點突出:CKB的狀態生成和驗證分離框架的優越性羅?)
下文將對 CKB 的 Cell 數據模型及交易數據結構作示意性的描述,目的是更好的解釋 CKB 的功能。在 CKB 的具體實現中,需要考慮包括激勵一致、執行效率在內的其它因素,數據結構會更為復雜,相關細節將在專門的技術文檔中描述。
Cell
CKB 中數據的可信度來源有兩種,一種是數據可以客觀驗證,一種是數據經過特定身份用戶的背書。因此,CKB 中數據的最小單元必須包含以下要素:
- 數據本身
- 數據的驗證方法
- 數據提交者的身份
Cell 是 CKB 中的最小數據單元,可以存放任意的數據。Cell 包含以下基本內容:
- type: Cell 的數據類型。
- capacity: Cell 容量,可存放數據的最大字節數。
- data: Cell 實際存儲的二進制數據,可以為空。包含 data 在內,cell 占用的字節數總
是小于等于 capacity。 - owner_lock: 通過腳本表示的 Cell 所有者。Cell 所有者可以轉讓 Cell。
- data_lock: 通過腳本表示的 Cell 使用者。Cell 使用者可以更新 data。
Cell 一旦創建無法更改,是一種不可更改(immutable)的數據單元。對 Cell 的更新,實質上是通過創建所有權相同的新 Cell 來實現。用戶通過交易提交包含新數據的新 Cell,同時使老的 Cell 失效(見Life Cycle)。因此,CKB 也可以看作是一個支持版本的數據倉庫,最新的Cells 代表了數據倉庫的當前版本,已經失效的 Cells 代表了數據倉庫的歷史。
對 Cell 的操作權分為兩種,所有權和使用權。Cell 的 owner_lock 規定了所有權,即轉讓Cell capacity 的權利;Cell 的 data_lock 規定了使用權,即創建新的 Cell 來更新 Cell 內容的權利。Cell capacity 可以一次全部轉讓,也可以部分轉讓,部分轉讓會創建新的 Cell(比如一個 capacity 為 10 的 cell 變成兩個 capacity 各為 5 的 cell)。Cell capacity 的增長
速度由共識參與度及流動投票決定。
(思考 15:cell一旦創建即不可更改,類似于擁有版本的數據倉庫,更新cell實際上是創建了具有相同權限的cell,老cell失效,cell的操作權限有轉讓和使用權利,轉讓屬于owner_lock,且支持部分轉讓,使用權利即更新cell內容的權利,Cell capacity的增長速度是指單個的cell嘛?共識參與度和流動投票怎么決定著cell capacity呢?Cell跟UTXO有什么樣的區別呢?)
Cell 的 lock 腳本由 CKB 支持的虛擬機執行,用戶在更新 Cell 數據或是轉讓 Cell 時需要提供相應的證明作為 lock 腳本輸入,如果 lock 腳本執行結果為 True 則證明用戶具有相應的權限,可以進行操作。
lock 腳本表達了 Cell 的操作權限,可以代表單用戶,也可以是門限簽名或者更復雜的權限。Cell 具有很好的隱私性,用戶通過使用不同的 lock 腳本,可以很輕松地使用不同的假名(Pseudonomy)來管理自己的 Cells。Cell 的所有者和使用者可以是相同的用戶,也可以是不同的用戶,這也意味著 CKB 使用者不需要擁有 Cell 就可以使用 CKB,使用門檻低。
(思考 16:使用者不想要擁有cell局可以使用ckb,這個有具體的場景嗎,代表別人進行投票嗎?lock腳本代表著單用戶,cell 和lock腳本時候一對多的關系,那么lock腳本具體是什么呢?)
Life Cycle
Cell 生命周期有兩個階段,新創建的 Cell 處于第一個階段 P1。Cell 是不可變數據對象,一旦被創建其內容不能被修改,Cell 的更新通過Transaction 實現:Transaction 以需要被更新的 P1 Cell 作為輸入,以 Generator 產生的包含新狀態的 P1 Cell 作為輸出。
(思考 17 : 包含新狀態的P1 Cell 就是 P2 Cell吧?Generator產生 P1 Cell對不?)
一個 P1 Cell 只能被使用一次,不能被用作兩個不同 Transaction 的輸入。P1 Cell 被使用后進入第二個階段 P2,P2 Cell 不能再用作Transaction 輸入。我們把所有的 P1 Cells 形成的集合稱為 P1 Cell Set(P1CS),P1CS 中存儲了 CKB 當前所有的共同知識;所有的P2 Cells 形成的集合稱為 P2 Cell Set(P2CS),P2CS 中存儲了 CKB 所有的歷史狀態。
(思考 18 : P1CS存儲了CKB中當前所有的共同知識,P2CS存儲了CBK所有的歷史狀態,兩者有什么真實的價值呢?將數據分別存儲歸檔,類似于數據倉庫中的分層概念?)
CKB 網絡上的全節點只需要 P1CS 就可以驗證 Transaction,P2CS 可以按照一定的策略清理。P2CS 可以保存在存檔節點(Archive Node)或者是分布式存儲網絡上。CKB 輕節點只需要保存區塊頭和特定的 Cells,不需要保存完整的 P1CS 和 P2CS。
Type
CKB 為 Cell 提供了類型系統,用戶可以創建自定義的 Cell 類型。通過類型系統,我們可以在CKB 中定義不同結構的共同知識以及相應的生成驗證規則。
創建新的 Cell 類型需要定義 Data Schema 和 Validator 兩個要素:
- Data Schema: 定義新類型的數據結構。
- Validator: 定義新類型的驗證程序。
Data Schema 和 Validator 的定義也是一種共同知識,存放在 Cell 中。每一個 Cell 都有一個且僅僅一個類型,多個 Cell 可以屬于同一個類型,也可以屬于不同的類型。
Data Schema 提供該類型的數據結構定義,使 Validator 可以理解和使用 Cell 中保存的數據。Validator 為驗證程序,由每一個節點使用 CKB 支持的虛擬機執行,以交易的 Deps,Inputs 和 Outputs 作為程序輸入(Transaction),能夠通過驗證就返回 True,不能則返回False。Cell 的創建、更新和銷毀可以使用不同的驗證規則。
(思考 19: 支持自定義類型的cell的好處是什么呢?默認的類型是什么?Deps是什么?Data Schema 具體該怎么定義呢?Data Schema跟什么東西類似呢?)
Index
用戶在定義 Data Schema 時可以設置索引,添加了索引的數據字段能夠獲得額外的支持,包括能夠在 Validator 或是 owner_lock/data_lock 中使用的條件查詢指令以及聚合函數。例如,眾籌發起方可以生成一個 Identity Cell(Identity),在其 data_lock 中利用條件查詢和聚合函數判斷屬于這個 identity 的代幣總數是否已經達到眾籌目標,實現有上限的眾籌。
(思考 20 : 很想知道Data Schema要怎么玩?)
Identity
Identity 是一種系統類型,用戶可以任意創建屬于自己的 Identity Cell。Identity Cell 可以作為 Cell data_lock/owner_lock 使用,Cell 更新或者轉讓時,需要提供對應 Identity Cell data_lock 的解鎖腳本(圖 3)。
Identity 是廣義的身份,Identity 可以對應個人或者機器實體的任何身份側面。Identity 是Nervos 網絡中分布式身份協議 NIP(詳見 Nervos Identity Protocol Paper)的基礎。通過 NIP,Nervos 網絡引入 CA 證書,可以兼容現有的 PKI 體系,用戶可以表達自己的社會身份,分布式應用可以基于身份構建。Identity Cell 中可以存放公開身份信息,或者是身份信息摘要,由用戶在必要時與分布式應用交互,提供所需的詳細信息。
相對于 UTXO 或是賬戶,Cell 是一種更加通用的存儲模型。UTXO 模型和賬戶模型都可以表達資產和所有者之間的關系:UTXO 以資產為基礎定義所有權(鎖腳本),賬戶則以所有者為基礎記錄資產(賬戶余額)。UTXO 模型中的帳目變動更清晰,但顯式賬戶概念的缺乏使表達能力本就欠缺的腳本更加難以使用,也無法記錄權限等賬戶元信息。賬戶模型容易理解,可以很好的支持身份和權限系統,卻有交易難并發的問題。支持類型和 Identity 的 Cell 設計集成了這兩種模型的優點,創造了一種更加通用的數據模型。
Transaction
Transaction 表達了 Cells 的轉讓和更新。在一個 Transaction 里面用戶可以轉讓 Cell,或是更新一個或者多個 Cell 的內容。Transaction 包括以下基本內容:
- deps: 依賴集合,對交易進行驗證所依賴的只讀數據,只能是 P1 Cells 的引用或者用戶輸入。
- inputs: 輸入集合,包含需要被轉讓/更新的 Cells,只能是 P1 Cells 的引用及相應的解鎖腳本。
- outputs: 輸出集合,包含新產生的 P1 Cells。
由于 Cell 的不可變更性,更新 Cell 時不會直接修改舊的 Cell,而是會產生一個新版本的 Cell,這些 Cell 版本可以前后銜接在一起,形成 Cell 的 “版本鏈”:某一次 Cell capacity 轉讓時創建了這個 Cell 的第一個版本,對 Cell 的后續更新形成了這個 Cell 的一系列歷史版本,在版本鏈的最后 (Head) 是 Cell 的最新版本。CKB 是所有 Cell 版本鏈的集合,所有 Cell Heads的集合是 CKB 的當前版本。
CKB Transaction 中包含的 deps 和 inputs 使節點可以方便地判斷交易間的依賴關系,對交易進行并行驗證(圖 4)。Transaction 中可以混合多種類型的 Cell,可以方便的實現跨類型的原子性操作。
CKB Cell 模型和 Transaction 的設計使 CKB 對輕節點更友好。由于所有的狀態都在區塊中,區塊同步協議也支持了狀態同步。輕節點只需要同步區塊,不需要計算(生成狀態),就可以獲得新的狀態。如果區塊中只保存事件,則需要全節點支持額外的狀態同步機制。在缺乏激勵的情況下,區塊鏈協議之外的額外機制很難大范圍的部署。在區塊鏈協議內同步狀態,使輕節點與全節點之間的地位更平等,系統更加健壯和去中心化。
(思考 21:所有的狀態都在區塊中,是包含哪些狀態呢?輕節點只需要同步狀態,不需要計算生成狀態,即可獲得新的狀態,難道以太坊或者比特幣不是這樣的嗎?那以太坊和比特幣同步區塊的時候需要做些什么事情呢?他們區塊中只保存事件嗎,是不是意味著這樣至保存事件的區塊鏈中需要更多的全節點來支持?所以若沒有強有力的支持,很難有大范圍的節點部署羅?CKB保證了輕節點和全節點的地位平等?)
Generator
Generator 是生成程序,用來生成符合類型定義的新的 Cells。Generator 在發起交易的客戶端本地執行,以用戶的輸入以及現有的 Cells 作為輸入,生成包含新狀態的 Cells 作為輸出。Generator 用到的輸入以及產生的輸出共同構成一個 Transaction(圖 5)。
Validator 和 Generator 可以使用相同的算法,也可以使用不同的算法(Overview)。Generator 可以接受一個或者多個相同或者不同類型的 Cell 引用作為輸入,可以產生一個或者多個相同或者不同類型的新 Cells 作為輸出。
通過定義 Data Schema, Validator 和 Generator,我們可以在 CKB 中實現任意共同知識的驗證和存儲。例如,我們可以定義一個 AlpacaCoin 的新類型:
Data Schema = {amount: “uint”}
// pseudo code of checker check():
// 1. 檢查 inputs 列表中的項都有正確的解鎖數據
// 2. 計算 inputs 列表中 AlpacaCoin 的 amount 之和 IN
// 3. 計算 outputs 列表中的 AlpacaCoin 的 amount 之和 OUT
// 4. 比較 IN 和 OUT 是否相等,并返回結果
Validator = validate(context ctx, inputs, outputs)
// pseudo code of generator gen():
// 1. 查找用戶能夠花費的,屬于 AlpacaCoin 類型的 Cells
// 2. 根據用戶輸入的轉賬地址和金額,生成類型為 AlpacaCoin 的屬于收款人的 Cell 和找零 Cell
// 3. 返回被使用的 Cells 列表,以及新生成的 Cells 列表,這些 Cells 將用于構造交易
Generator = gen(context ctx, address to, uint amount, ...)
Layered Network
在 Nervos 網絡中,CKB 和 Generator 構成上下層的關系,CKB 是共同知識層,而Generator 是生成層。CKB 只關心 Generator 產生的新狀態,不關心狀態產生的具體方式,因此 Generator 的具體實現形式是非常多樣化的(圖 6)。
分層架構將數據與計算分離,使每層都可以獲得各自的靈活性與可擴展性,使用不同的共識協議。 CKB 作為最底層,擁有最廣泛的共識,是整個 Nervos 網絡的基礎。不同的應用所需要的共識范圍不同,強制所有應用都在最廣泛的共識下進行會導致效率低下。在 Nervos 網絡中,業務參與方可以根據自己所需的共識范圍選擇合適的 Generator,只在需要與局部共識范圍外的其他服務交互時,將局部狀態提交到 CKB 上,使其獲得更廣泛的認同。
(思考 22:OK,CKB是Nervos網絡的基礎,擁有最廣泛的共識,業務方根據自己所需要的共識范圍選擇合適的Generator,那么局部共識,局部狀態有場景說明就更好理解了。。)
Generator 可以包括(但不限于)以下幾種形式:
客戶端
在用戶設備上直接運行 Generator 生成新狀態。通過輕客戶端提供的接口或是客戶端程序庫,生成算法可以用任何編程語言實現。狀態服務
用戶使用中心化服務,由服務器執行生成算法,生成新狀態。目前所有的互聯網服務都可以通過狀態服務的方式使用 CKB,使服務狀態數據獲得更大的信任和流動性。 例如,游戲公司可以使用狀態服務架構,在中心化服務中執行游戲邏輯,生成道具信息;在 CKB 中定義道具類型和總量等規則,將生成的道具登記并確權。
結合 Nervos Identity Protocol,信息發布機構提供基于身份的可信 Oracle,為Nervos 網絡中的其他服務提供必要的信息。
(思考 23 : 由中心化服務生產新狀態,然后通過CKB定義的服務信息,最終將新狀態上鏈進行確權登記?)
狀態通道
兩名或多名用戶使用點對點網絡連接通信,共同生成新的狀態。狀態通道的參與者可以通過CKB 登記和獲取參與者信息,建立通道連接。參與者可以在 CKB 上提供保證金,使其它參與者相信通道能夠順利運行。狀態通道參與者之間可以使用共識協議或是多方安全計算技術來生成新狀態。生成鏈
一個用于生成 CKB 新狀態的區塊鏈。生成鏈可以是公有鏈(例如任何使用 EVM 的區塊鏈),也可以是許可鏈(例如 CITA 以及 Hyperledger Fabric)。使用許可鏈可以將狀態計算限定在一定參與范圍內,保護計算隱私,同時獲得很好的性能。在應用鏈中,參與者共同執行狀態生成并相互驗證計算過程,在狀態需要更廣泛共識時,將其提交到 CKB中,使之成為接受度更高的共同知識。
(思考 24 :AppChain 就是一個用于生成CKB新狀態的區塊鏈,公有許可鏈 )
Hybrid Consensus
共識算法追求在網絡延遲和各類節點故障存在的情況下實現兩個目標:正確性和性能。 正確性又包括一致性,指分布式系統中每一個節點的數據副本完全相同,以及可用性,指分布式系統能夠在有限的時間內響應用戶的請求。性能也包括兩個方面,一是交易延遲,即從客戶端提交 Transaction到客戶端獲得確定性結果所需要的時間,越短越好;二是吞吐量,即系統每秒中可以處理多少筆交易。
公有鏈運行在開放的分布式網絡中,節點可以自由的加入和退出,在線節點不固定且變更頻繁,這些都是傳統 BFT 共識算法很難處理的問題。Satoshi Nakamoto 巧妙的引入經濟激勵以及概率性共識應對這些難點[2],因此要保證正確性需要額外的開放性與公平性。開放性使共識節點的加入退出無阻礙,無論是有 100000 個節點還是 1 個節點,公有鏈都能正常工作;公平性使共識節點可以獲得與所付出的努力成比例的回報。公有鏈共識算法的性能指標除延遲和吞吐量外,還需要考慮運行開銷。
(思考25:傳統BFT共識算法有哪些弊端,不能解決哪些問題?又主要應用在哪些場景?)
以比特幣工作量證明(Proof of Work)為代表的 Nakamoto 共識擁有極佳的開放性和可用性,比特幣網絡中的節點可以任意的加入和退出,網絡性能隨著共識節點數量的增加能夠保持不變。但 Nakamoto 共識吞吐量低,以比特幣 7 筆交易每秒的處理速度,難以消化商業場景的日常需求。即使通過次級通道技術(例如閃電網絡)將大部分交易轉移到鏈下,通道的建立與關閉依然受到鏈上處理速度的制約,在網絡擁堵時甚至會影響到次級通道的安全性。Nakamoto 共識以區塊投票,交易確認速度慢,通常需要 10 分鐘到一個小時,用戶體驗不佳。在分區的情況下,比特幣網絡能夠繼續提供服務,但交易是否被完全確認無法保證,無法滿足對交易確定性要求較高的商業場景。
(思考26:閃電網絡,次級通道技術的基本原理是什么?分區基本原理是怎樣的?)
經歷了 30 年發展的傳統拜占庭容錯(Byzantine Fault Tolerance)共識可以實現媲美中心化系統的吞吐量和交易確認速度,但其開放性不佳,節點動態增減難度大,網絡性能隨參與共識的節點數量增加而迅速下降。傳統 BFT 共識對故障的容忍能力較低,在網絡分區時節點無法達成一致,網絡無法正常提供服務,難以滿足公有鏈對可用性的要求。
(思考27:拜占庭容錯共識,節點范圍比較小,對故障容忍能力較低,查找相關的資料進行進一步閱讀)
在研究和實踐中我們認識到,傳統 BFT 算法在正常路徑下邏輯簡單,但需要以復雜的邏輯應對故障情況;Nakamoto 共識則以不變應萬變,無論是正常還是故障情況都是同樣的邏輯,但也因此影響了正常路徑下的系統性能。如果將 Nakamoto 和傳統拜占庭容錯兩類共識協議有機的結合在一起,新的混合共識在一致性、可用性、公平性及運行開銷等方面可以形成最佳組合 [3][4]。CKB 將按照混合共識的思路,設計并實現自己的混合共識算法,為交易提供見證。通過將Nakamoto 共識和傳統 BFT 共識結合,我們既可以保留開放性和可用性,又可以在正常路徑下獲得傳統 BFT 共識的優秀性能,將交易時延降到最低,最大程度的提升系統吞吐量。
CKB 以 Cell Capacity 作為參與共識的條件。想要參與共識的節點需要抵押一定數量的 CellCapacity 作為保證金,用于確定共識節點的投票和獎勵分配權重。如果某個共識節點作惡,觀察到作惡行為的其它共識節點可以將證據提交到鏈上,導致作惡節點的保證金被系統罰沒。保證金機制能增加共識節點作惡的成本,提高共識的安全性。
CKB 混合共識的詳細設計請參考 CKB Consensus Paper。
Economics
經濟模型是公有鏈的靈魂。 通過引入經濟激勵,比特幣第一次解決了開放網絡上的共識難題。每一個區塊鏈網絡都是一個通過經濟激勵結合在一起的自治共同體。一個優秀的經濟激勵制度應該引導區塊鏈的參與者為這個自治共同體作出貢獻,最大化區塊鏈的效用。
CKB 經濟模型應該能夠激勵用戶、開發者和節點運行者合力為共同知識的形成與保存貢獻力量。CKB 的經濟模型同樣以狀態為核心進行設計,通過 Cell Capacity 增發和手續費兩部分獎勵產生激勵。
CKB 狀態的形成與存儲都需要一定的成本。狀態的形成需要節點驗證,消耗計算資源,狀態的存儲則需要節點持續提供存儲空間。現有的公有鏈經濟模型只在處理交易時收取一次性手續費,一旦數據上鏈成為共同知識,則可以無需再付出任何成本,永久占用所有節點的本地空間。
(思考28:CKB中計算和存儲均需要一定的成本,具體是怎么設計的呢?尤其是存儲這方面)
在 CKB 中,Cell 是狀態的存儲單元。未被占用的 Cell Capacity 可以轉讓,具有流動性,但是被占用的 Capacity 不能被轉讓,失去流動性。因此,Cell 的使用者需要為狀態的存儲支付流動性作為成本。Cell 的使用時間越長,需要付出的流動性成本越高。通過使用流動性成本而不是預付費的方式,避免了預付費用完導致 Cell 被強制回收的問題。
Cell Capacity 的價格是對 CKB 中共同知識價值的直接度量。 需要注意的是,Cell 的使用者和所有者可能是不同的,所有者可以幫使用者支付流動性成本。更新 Cell 中的數據或是轉讓Cell Capacity 則需要支付手續費。共識節點可以設置自己愿意接受手續費水平,交易手續費高低是由市場決定的。手續費也可以由 Cell 所有者代替使用者支付。
當前主流用戶難以使用區塊鏈的一個重要原因是,交易手續費必須以原生代幣進行支付,由此要求用戶在使用服務之前自行尋找方法先獲取原生代幣,提高了使用門檻。 另一方面,用戶已經習慣了基本服務免費,增值服務收費的商業模式,無論做什么都要收費也不符合主流用戶習慣。CKB 通過允許 Cell 所有者代替用戶付費的設計解決了這兩個問題,為應用開發者提供了更多的商業模式選項。
系統手續費收入的大部分由出塊節點獲得,剩余的部分將用于支持 Nervos 網絡的開發、研究、運營等工作,以保證網絡的持續良性發展。手續費分配比例由流動投票(流動投票)決定。
除了用于支付共同知識的形成和存儲成本,Cell Capacity 還可以被用在共識抵押、流動投票等多個場景中。CKB 的安全程度與共識節點抵押的代幣數量息息相關。共識抵押代幣越多,節點作惡成本越高,整個系統也更加安全。CKB 的 Cell Capacity 增發調節的目標之一是保證一定的共識保證金抵押水平,以此保證系統安全。通過調節增發比例,調節共識參與者可以獲得的無風險收益比例,進而調節共識的參與度。
CKB 經濟模型的細節請參考 Nervos CKB Economic Paper.
治理機制
作為 Nervos 網絡的基礎設施,CKB 必須能夠與其所承載的生態同步進化,在不間斷運行的同時進行調整運行參數,或是進行更深程度的網絡升級。從區塊鏈發展歷史中我們能夠看到,社區達成共識或是網絡升級的成本過高將會阻礙創新,使網絡難以進化,無法生態發展的需求。
因此,CKB 內置了流動投票和熱部署機制,使 CKB 成為一個能夠自我進化的分布式網絡。
流動投票
CKB 的運行依賴一組系統參數,其中有一些能夠自動調節,有一些需要進行投票達成共識;CKB的代碼中可能會有 bug,修復方案有可能需要投票共識;隨著 Nervos 生態的發展,CKB 的功能需要持續升級,實現和部署新的功能也需要投票共識。因此,投票工具是 CKB 長期穩定運行必不可少的組件之一。
CKB 支持流動投票 [5](圖 7)。每一位 Cell 所有者都可以參與到與 CKB 發展有關的決策中來,投票權重由用戶所持有的 Cell Capacity 決定。在流動投票中,用戶可以設置自己的投票代表,由其進行代理投票。投票代表也可以設置自己的投票代表。考慮到提案專業度和參與激勵的問題,不同的提案可以設置不同的接受條件,例如參與率和支持率。值得注意的是,CKB 流動投票是 Nervos 社區共識的表達工具,不是共識形成工具。在票之前,社區應該利用各種溝通工具對提案進行細致的考察,事先形成粗略共識。
CKB 流動投票細節請參考 Nervos Governance Paper。
Neuron
得益于 Cell 數據模型的抽象性,CKB 的功能模塊可以利用 Cell 來實現和存放。我們把承擔CKB 系統功能的 Cell 稱為 Neuron,Neuron 實質上是一種特殊的 Cell 類型,其使用者是CKB 自身。
在功能變更/升級提案被實現為 Neuron 之后,社區使用流動投票對是否部署進行表決。在獲得社區共識后,新的 Neuron 將被部署到鏈上,修復系統 bug 或是提供新的系統功能。細粒度的Neuron 升級能夠大大降低 CKB 的進化難度。
輕客戶端
節點完全對等的區塊鏈架構已經受到了嚴重的挑戰。公有鏈網絡上節點性能參差不齊,對等節點架構不僅對用戶硬件要求越來越高,也無法充分發揮高性能節點的潛力。越來越多的用戶放棄運行全節點,轉而使用輕客戶端以及中心化客戶端。全節點需要對所有區塊和交易數據進行驗證,對信任依賴最小,但開銷最大,使用非常不便。中心化客戶端則完全信任中心服務器提供的數據,放棄了驗證。輕客戶端則通過稍微增加對全節點的信任,大大降低了驗證開銷,對用戶體驗有很大的提升。
同時,移動設備已經成為人們日常使用互聯網服務的主要設備,原生應用也越來越流行。因此,對移動設備友好是 CKB 的設計原則之一,Nervos 應用應該能夠流暢的運行在移動設備上,與移動平臺無縫的銜接。
CKB 支持輕客戶端。CKB 使用可證數據結構組織區塊頭,可以極大地加快輕客戶端的同步速度。得益于 CKB 以狀態為中心的設計,輕客戶端無需重復計算就能夠方便地直接同步到最新的狀態(P1CS)。使用本地保存用戶關心的少量 P1 Cells 及網絡帶寬,輕客戶端可以提供更好的
分布式應用體驗。
Summary
Nervos CKB 為一個全新的分布式應用網絡提供了共同知識層。Nervos CKB 以狀態為中心設計,采用更為通用的存儲模型,更好的平衡了激勵機制,得到了一個更具可擴展性的分布式應用范式。
References
- Alonzo Church, Lambda calculus, 1930s
- Satoshi Nakamoto, “Bitcoin: A Peer-to-Peer Electronic Cash System”,
2008 - Vitalik Buterin, Virgil Griffith, “Casper the Friendly Finality Gadget”,
2017 - Rafael Pass, Elaine Shi, “Thunderella: Blockchains with Optimistic Instant
Confirmation”, 2017 - Bryan Ford, “Delegative Democracy”, 2002
Appendix. Common Knowledge Base
我們所掌握的共同知識是社會協作形成的基礎。我們在漫長的發展歷程中逐漸形成并認同的一系列概念,包括民族、宗教、國家、貨幣、企業、身份、信用等等,共同搭建了今天的社會結構。共同知識的形成和傳遞是人類社會的關鍵問題。如果我們能夠改進共同知識的形成和傳遞效率,哪怕僅僅是百分之一,也會對社會發展產生巨大的推進作用。
區塊鏈或許是一個新的答案。在區塊鏈網絡中機器接手了人的任務,實現了自動化的共識過程和可靠的知識傳遞,將共同知識的生產工業化。我們認為區塊鏈是一種可稱之為共同知識庫(Common Knowledge Base)的新技術。促進共同知識的形成和傳遞是區塊鏈的核心價值,也是區塊鏈上能產生代幣模式(Token)和密碼經濟學(Cryptoeconomics)的原因。
Common Knowledge
共同知識(Common Knowledge)是被一個群體共同接受的數據,群體的參與者不僅自己接受該知識,還知道群體中的其他人同樣接受該知識。一般的,我們可以根據形成方式將共同知識分為三種:
一種是依賴其 “可獨立驗證性” 來被參與者接受的。例如,“11897 是一個質數” 這個論斷的提出者如果可以同時提交一份如何驗證一個數字是質數的算法,就可以在不需要信任的前提下取得他人對這個論斷的共識,進而促成交易(比如用來確認對于某數字是否為質數的對賭)。在抽象的數學
范疇內這樣的例子很多。
在更需要觀察實驗和經驗性依據的科學領域里,共同知識的產生依賴發現者在提交新發現的同時提交獨立驗證的方法,在經過科學社區獨立驗證后,承認并把該發現作為領域共同知識的一部分。大眾則是通過對科學方法和科學社區的信任而建立對這條共同知識的信任。
在商業場景中,共同知識是以信任和聲譽為基點的,因而存在共同知識提交方信任和聲譽能輻射到的范圍。也就是說,商業場景中的一則數據如果能夠成為交易參與者都能接受的共同知識從而促成交易,交易的參與者必須對該數據產生者有足夠的信任。共同知識是促成交易發生的必要條件。
比如說在中心化交易所的場景里,交易是基于對交易所本身的信任,以及由此推及的報價數據的準確性和交易的公平性而產生的。在信用卡境外消費的場景里,消費者和商家完成交易的前提是雙方對包括雙方銀行和信用卡公司等中間機構的信任。
共同知識有各種類型和存在形式,我們把能夠自動化共同知識的形成,存儲共同知識及相關證明的技術稱為共同知識庫。
Blockchains are Common Knowledge Bases
過去,共同知識需要群體內的個體之間進行各種繁雜的交流和相互確認才能形成,之后分散記錄在個體的大腦中。今天,基于密碼學和分布式技術的區塊鏈使得共同知識的產生和保存發生了質的變化。人們不再需要反復溝通以確保新知識在人群中達成一致,也不再需要將知識記錄在空間有限的大腦中。區塊鏈世界中的每一條數據,包括數字資產和智能合約都是共同知識,他們經過了全體節點的一致共識,以極低的成本在區塊鏈中不斷的形成和沉淀,卻比一般的數據蘊含了更大的價值。
(思考 27: 共同知識在群體之間進行各種交流和確認才能形成,并且分散記錄在個體的大腦中,但也有很多知識形成之后,變通過文字或者書籍等形式傳播,分享,人們通過互聯網世界可以輕松的得到。是否意味著存儲在區塊鏈上的共同知識,通過全體節點達成一致之后,就可以完全得到信任呢?數字資產和智能合約,為什么是共同知識,有共同驗證即是?)
區塊鏈是共同知識庫。加入一個區塊鏈網絡意味著共同驗證并認可網絡中的知識。交易經過節點驗證之后,與相關的證明一起被保存在區塊鏈中。區塊鏈的每一位使用者都能夠確信區塊鏈中的交易有效,也能夠確信其他使用者認可區塊鏈中的交易有效。
比特幣賬本是一種共同知識,比特幣網絡是第一個基于區塊鏈技術的共同知識庫。比特幣賬本記錄了從創世塊之后的所有被包括開發者、礦工和使用者在內的比特幣社區認可的用戶轉賬交易。
以太坊上的智能合約是另外一個共同知識的例子:以太坊支持圖靈完備并且擁有狀態的智能合約,能夠實現各種業務規則。智能合約的使用者知道智能合約的執行邏輯,并且知道合約的其他參與者也知道這一點。
General Purpose Common Knowledge Base
讓我們考慮一個適用于形成和存放任何類型共同知識的通用共同知識庫(General PurposeCommon Knowledge Base)。它應該具有以下特征:
- 以狀態為核心,而非以事件為核心(圖 1)。
- 數據模型足夠抽象和通用,允許用戶自定義業務數據模型。
- 共同知識的驗證引擎足夠抽象和通用,允許用戶自定義數據驗證規則。
如果說分布式賬本是數字資產的 “結算層”,通用共同知識庫則可認為是各種類型共同知識的 “結算層”。Nervos CKB 的目標是成為一個通用共同知識庫,作為整個 Nervos 網絡的公共狀態層,為上層應用提供狀態與信任基礎。
“The various ways in which the knowledge on which people base their plan is communicated to them is the crucial problem for any theory explaining the economic process, and the problem of what is the best way to utilizing knowledge initially dispersed among all the people is at least one of the main problems of economic policy - or of designing an efficient economic system.” - “The Use of Knowledge in Society”, Friedrich A. Hayek, 1945