Nervos 項目核心設計簡釋

在 Bitcoin 和 Ethereum 取得巨大成功之後,人們開始對公鏈的設計進行大量的探索,新的架構和設計層出不窮,比如 DAG、DPOS、Algorand、Ouroboros 、Conflux、2-hop Blockchain、Thunderella 等等。

對於 DAG、Conflux,之前的文章已經給出過相關的分析和論述。

近期閱讀分析了 Nervos 項目的技術白皮書,感覺這個項目對於公鏈設計給出了一些有趣的創新點、有啓發性的新思路,其白皮書下載地址爲:

https://github.com/NervosFoundation/binary/blob/master/whitepaper/nervos-ckb.pdf

https://github.com/NervosFoundation/binary/blob/master/whitepaper/nervos-ckb-zh.pdf

由於其技術白皮書對設計細節的論述不夠詳盡,因此本文嘗試着對其核心設計做簡要解讀,如有誤解,以 Nervos 的具體代碼實現爲準。

Nervos 的核心設計思想


1)區塊鏈的技術體系應該分層

比如 Bitcoin 和 Ethereum 屬於 Layer1,而閃電網絡和 Plasma 則屬於 Layer2。除了閃電網絡、Truebit、Plasma 等典型的 Layer2 技術之外,Layer2 可以有多種多樣的表現形式,Nervos 需儘可能實現一些通用的、不可或缺的 Layer1 核心功能,致力於爲應用鏈(APP-Chain)的設計和運行提供底層支撐。

因此 Nervos 設計了一個 Layer1 的核心繫統 Nervos-CKB (Common Knowledge Base),其綜合了 Bitcoin 和 Ethereum 的一些優點,並試圖避免 Bitcoin 和 Ethereum 做得不夠好的某些地方。

2) Layer2 系統的參與者(包括節點、用戶等等)在進行交互之前,必然要具備一些共同知識或共識,這些共識最終會以數據的形式表達出來,並存儲在 Nervos-CKB 的各個參與節點上,這也是共同知識庫(Common Knowledge Base)的命名由來。

這就類似於兩個人能夠流暢的溝通交流區塊鏈技術,那麼兩人必然要儲備同一門自然語言(比如漢語、英語)的語法及語義知識,同時兩人還必須儲備一些共同的非對稱密碼學、P2P 通信等知識。

Nervos 對「Bitcoin-UTXO」的改進

從 Nervos 的設計觀點來看 Bitcoin 的 UTXO,其實是對某一賬戶地址所擁有的價值總額的分批存儲,UTXO 是共同知識的一個特例,正是因爲其存儲的餘額是一種共同知識,其代表的價值才能被整個 Bitcoin 網絡所認可,賬戶擁有者才能執行轉賬交易花掉這筆錢。

如果把 UTXO 的功能推廣,不僅僅用於存儲餘額及鎖定腳本,而可用於存儲任何數據和代碼,這樣就更加通用化了。Nervos 稱一個通用化的 UTXO 爲 Cell,其爲共同知識的基礎存儲單元。

一個 Cell 包含了 5 個基本面:

1) Type: Cell 中存儲的數據是有類型和結構的,有些類似於用 DTD 來定義 XML 文檔的結構;

2) Capacity: Cell 的存儲容量,可以存儲的最大字節個數;

3) Data: Cell 中實際存儲的數據;

4) Owner_Lock: 定義 Cell 的擁有者,和 UTXO 類似,通過一段腳本程序對擁有者進行描述和驗證;

5) Data_Lock: 定義 Data 的擁有者,同樣是通過一段腳本程序對擁有者進行描述和驗證。

Nervos 通過 Owner_Lock 和 Data_Lock 分離了 Cell 的擁有權和使用權。Cell 的擁有者可以轉讓 Cell,而 Data 的擁有者纔可以更改 Cell 裏存儲的數據。

Bitcoin 解決了雙花問題,UTXO 被花掉以後,就不能再被第二次花費了。類似的,Cell 被更新之後,就不能被更新了,除非對更新後的 Cell 做更新。所有可以被更新的 Cell 中存儲的數據及其關聯的驗證程序,就是最新版本的共同知識,類似於 Bitcoin 的 UTXO 集。

對於 Bitcoin,利用 UTXO 和多重簽名等機制,可以實現跨鏈原子交易和鏈外的支付通道,對於 Nervos,利用 Cell 中存儲的共同知識數據,可以爲 Layer2 系統、跨鏈交互、以及 App-Chain 的實現提供一定的便利。

Nervos 對「Ethereum-狀態變更」的改進

在 Ethereum 平臺上,可以部署合約,在合約中可以分配數據存儲空間,並通過交易事件觸發運行合約函數對這些數據存儲狀態進行更新。

Nervos 認爲對數據狀態的更新,可以運行在用戶端(比如手機裏安裝的錢包 APP),用戶發送的交易會包含更新後的數據狀態值和 Cell 中的數據使用權證明,Nervos-CKB 鏈上只需要部署狀態更新的驗證程序就可以了,而無需運行狀態更新程序。對比交易事件驅動狀態改變的模型,Nervos 的設計方式可以帶來很多好處,比如:

1) Nervos 全節點可以非常自然地並行處理多個交易,而 Ethereum 全節點對於同一區塊中的目標地址爲同一個合約地址的多筆交易,只能做串行處理;

2)對於很多計算任務,計算過程和驗證過程是不一樣的,執行量也是有很大差異的。比如 Bitcoin 的工作量證明,給出一個合法的區塊頭部,是極其困難的,而驗證一個區塊頭是否合法,則非常簡單。


在輸入數據源相同的情況下,對於一個計算程序,一定存在比其計算複雜度小的驗證程序。否則就沒必要驗證了,重新運行一次計算程序,並覈對結果是否相同,就是最精確的驗證手段。

因此將計算程序分配給用戶端執行,而區塊鏈系統只執行驗證程序,可以很大程度上減輕區塊鏈系統全節點的運行負擔。


Nervos 稱驗證程序爲 Validator,計算程序爲 Generator, 類似於 Hadoop 的設計者並不知道用戶會用 Hadoop 平臺做什麼類型的計算,但是 Hadoop 只需設計出並實現通用的 Map-Reduce 計算框架,用戶自然會針對具體的計算問題給出具體的 Map 程序和 Reduce 程序。

例如:利用 Generator 和 Validator 互相分離的特性,可以設計一款象棋或圍棋程序,記錄 AI 系統(比如 Alpha-Go)和人類專業棋手進行的著名對戰(普通人之間的對戰就沒必要上鍊了,區塊鏈遊戲還是太貴,最好放在 Layer2 執行),Cell 負責存儲棋盤狀態及變更歷史,Validtor 負責驗證每一步棋子挪動是否符合規範(車走直、馬走日、炮打隔子等等),Generator 負責遊戲界面交互、移動棋子、判決遊戲輸贏等等。

3) Ethereum 用戶向某個合約地址發送一筆交易,用戶可能無法預測這筆交易會給合約裏的數據帶來怎樣的更改,因爲在同一時間段,可能還有其他用戶也向該合約地址發送了交易。除此之外,礦工還可能監控某些合約(比如 Fomo3D),通過立即打包、不打包、延後打包某些交易、調整交易在區塊中的排練順序等手段,爲自己謀求利益。而 Nervos 用戶在發交易之前,自己執行了 Generator 程序,並得出了 Cell 的結果狀態,只要其交易能通過 Validator 程序的驗證,用戶是能夠事先清楚地知道狀態變更結果的。

4) Ethereum 用戶必須擁有足夠的 ETH 才能讓交易上鍊並觸發合約執行,這會給普通用戶帶來一定的麻煩,比如某項目方創建了 ERC20-Token 合約,但是該 Token 的用戶必須同時擁有 ETH 才能正常執行 Token 的轉賬。Nervos 考慮到了這一點,可以讓 Cell 的擁有者給 Cell 的使用者付費,但 Nervos 白皮書並未詳細解釋具體是如何做到的這一點的。不過 Ethereum 也在不斷髮展,未來也可以通過升級實現這一點,比如在合約中實現某些特殊的指令,允許合約的擁有者預先存入一定量的 ETH 爲普通用戶付費,並註冊驗證程序,能夠通過驗證的交易,就能觸發運行合約,不能通過驗證的交易,就會被礦工丟棄,這樣可以防止惡意的交易並防止 DDOS 攻擊,對於普通轉賬交易,也可以引入賬戶屬性設置等更加人性化的功能,並實現收款方支付不超過收款額的手續費,這些在理論上都是可以做到的。

作者: Karl 嘉楠區塊鏈研究院高級研究員

嘉楠區塊鏈研究院: 嘉楠耘智(Canaan Inc.)旗下區塊鏈板塊。

備註:此文爲技術探討交流,不構成投資建議。

熱文搶讀:

1、Plasma:確保跨鏈資金安全迴流的設計模式

2,簡析跨鏈劃轉的工作原理

3、Conflux 項目技術核心簡析:基於 POW 的 DAG

4、從 DAG 視角看 Bitcoin 賬本

5、簡析跨鏈原子交易

Nervos 項目核心設計簡釋