摘要:使用模型的代表是比特幣。每一個比特幣全節點都會維護當前所有的集合,這個集合我們就稱為比特幣賬本的當前狀態即當前的賬本。
本文是對前幾期秘猿區塊鏈課堂中關于 Cell 模型的總結。底層公鏈 CKB 的 Cell 模型是一個高度抽象的模型,事實上,你不僅可以在 Cell 上實現 First-class Asset,也可以在 Cell 上模擬 Account。通過本文的介紹我們可以看出,Cell 模型是一個不同于 UTXO 模型和 Account 模型的新設計。除了狀態模型的不同,CKB 還將計算(也就是狀態生成)轉移到了鏈外,在鏈上只需要對狀態進行驗證的邏輯。獨特的狀態模型和計算驗證分離這兩點決定了 CKB 的編程模型上必然會出現新的 DApp 范式和設計模式。
秘猿科技區塊鏈小課堂第 19 期
喜歡函數式編程的工程師應該很熟悉一個名詞:First-class Function,翻譯成中文應該叫「頭等函數」或者「一等函數」。First-class Function 指的是一類編程語言,在這些語言中函數是一個完全獨立的概念:函數可以被當作值賦給一個變量,可以被當作參數傳遞給其他函數,也可以被當作返回值從其它函數傳出來。在這樣的語言中我們可以像操縱數據一樣操縱函數,所以在這些語言中函數和數據一樣是「一等公民」(First-class Citizen)。First-class Function 是函數式語言的一個關鍵特性,很多函數式編程的強大能力來源于此。
Nervos CKB 使用 Cell 模型來構建整個共同知識庫的狀態。Cell 模型是一個非常簡單但是與現有區塊鏈設計非常不同的狀態模型,我們在設計 Cell 模型的時候已經意識到,基于 Cell 模型的 DApp 將擁有一些非常不同的性質,就像函數式編程和面向對象編程會產生風格迥異的設計模式和程序特性一樣。在這篇文章中,我想闡述 Cell 模型可以支持的一種非常有趣的 DApp 設計模式,我們把它叫做 First-class Asset,因為通過它我們可以將用戶自定義的加密資產變成區塊鏈中的「一等公民」。
狀態模型的快速入門在 Cell 模型之前,各種區塊鏈使用的狀態模型基本上就是兩種:UTXO 模型和 Account 模型。
使用 UTXO 模型的代表是比特幣。UTXO 是未被花費的交易輸出(Unspent Transaction Output)的縮寫,一個 UTXO 可以簡單的理解為是一個比特幣,然而和一般的硬幣不同,每一個 UTXO 的面值都是不一樣的。每個 UTXO 中都通過一段鎖腳本(Lock Script)記錄了這枚硬幣的所有者是誰,同時保證只有所有者能夠花費這枚硬幣。每一個比特幣全節點都會維護當前所有 UTXO 的集合,這個集合我們就稱為比特幣賬本的當前狀態(即當前的賬本)。每一次比特幣轉賬都是一個從 UTXO 集合中刪除幾個硬幣(屬于付款方)然后又增加幾個新硬幣(屬于收款方和 / 或付款方)的過程。由于整個賬本狀態是基于 UTXO 這個最小單元構建的,我們把它叫做 UTXO 模型。
使用 Account 模型的代表是以太坊。Account 就是賬戶,和銀行賬戶類似,代表了資產的所有者,賬戶里面最重要的數據是余額(Balance),記錄這個賬戶持有的以太幣的數量。賬戶是資產所有者的代表,所有者可以是人(對應外部賬戶)或者智能合約(對應合約賬戶),外部賬戶通過私鑰簽名來驗證資產所有權,合約賬戶的所有權通過合約代碼來確定,合約代碼和狀態都保存合約賬戶內部。外部賬戶要轉賬的時候,用戶在交易中指明轉賬數量,賬本中的付款方賬戶余額和收款方賬戶余額就會做相應的減少和增加。由于整個賬本狀態是基于賬戶(Account)這個最小單元構建的,我們把它叫做 Account 模型。
First-class CoinUTXO 模型和 Account 模型代表了構建賬本狀態的兩種思路。賬本是所有者與資產之間關系的集合。UTXO 模型以資產為基礎建模,先構建出「硬幣」的概念,再給硬幣賦予所有者的屬性;Account 模型以所有者為基礎建模,先構建出「賬戶」的概念,再給賬戶賦予余額的屬性。以哪種方式作為基礎模型決定了系統中的操作的基本對象是資產還是賬戶(所有者)。
所以我們說,硬幣(Coin)是 UTXO 模型中的 First-class Citizen,每一個 UTXO 都是一個具有獨立標識符的對象(Transaction ID + Output Index),Coin 是用戶直接操作的對象(用戶在構造的交易中包含 UTXO),賬戶是基于 Coin 建立的上層概念(只存在于錢包中)。因此 UTXO 是 First-class Coin。
在 Account 模型中,賬戶是 First-class Citizen,聚合在賬戶余額中的硬幣沒有獨立的標識符。賬戶是用戶直接操作的對象,資產的轉移是由賬戶作為用戶的代理實現的,這一點在接受方是合約賬戶時體現的最為明顯。在這樣的模型下,用戶定義加密資產(例如 ERC 20)更像是通過第三方記賬的方式,而非點對點的方式轉移,這個差異會將第三方(這里的第三方指的是托管加密資產的智能合約)引入資產轉移流程,增加智能合約的設計復雜度(我們可以把智能合約看作在資產轉移時會自動執行的邏輯)。為了降低這種復雜度,Account 模型中的交易需要加入特殊的邏輯(Value 字段),但是這樣的特殊邏輯只有助于原生資產,同時造成對原生資產和用戶自定義資產的不同代碼路徑。
對于這些問題,Kelvin Fitcher 寫過一篇 Looking at ownership in the EVM 進行了很好的分析,在此不再贅述。
有了這些背景,我們應該更容易理解 CKB 的這一設計理念了:
有了 Cell 模型,我們能夠簡化設計,并在 Nervos CKB 上實現作為「一等公民」的用戶定義資產(User Defined Assets),簡稱 First-class Assets.
First-class Assets 與 UTXO 一樣,具有獨立標識符,可以被用戶及腳本直接引用和操作。
First-class State如何實現 First-class Assets 呢?
無論用何種方式,我們都需要記錄所有者和資產之間的關系。這些關系記錄,本質上是經過共識的狀態。要有 First-class Assets, 必須先有First-class State,而這正是 Cell 模型的出發點。
Nervos CKB 的名字來自于 Common Knowledge Base(共同知識庫)的縮寫。我們之所以把 Nervos 網絡中的區塊鏈稱為「共同知識庫」,是因為它的責任是持續不斷的對網絡的共同狀態形成全球共識,換句話說,CKB 是一個由全球共識維護的狀態庫。一個狀態庫的基本模型,很自然的是將整個狀態劃分為更小的狀態單元組織起來。這些更小的狀態單元,就是 Cell。
由于 Cell 是一種狀態單元,有獨立的標識符(Transaction ID + Cell Output Index),可以被直接引用,作為參數傳遞給腳本,它是 CKB 中的「一等公民」,也就是說狀態是 CKB 中的「一等公民」。Cell 不僅僅是一種 First-class State,而且是最簡單的一種 First-class State:一個 Cell 中只有 Capacity,Data,Lock 以及 Contract(可選,Contract 可以是一段代碼或者指向一個 Code Cell 的 Reference)四個字段。
如下圖所示,Cell 的所有者可以直接更新 Cell 中保存的狀態,不需要經過任何中間方,而在 Account 模型中用戶只能通過合約代碼(賬戶中的 Code)來操作賬戶內的狀態,狀態實際上是托管在合約手中的。
值得指出的是,有了 Cell,CKB 實際上就獲得了一種有狀態的編程模型。一種普遍的觀點是,以太坊編程模型的表達能力來自圖靈完備的虛擬機,實際上通過賬戶使得智能合約能夠保存計算狀態是一個大過 EVM的優點(圖靈不完備的語言也有很強大的表達能力)。
CKB 通過 Cell 和 CKB-VM(Simple Yet Powerful! 這得另外寫一篇文章了)的組合實現了一種新的有狀態的智能合約編程模型。這個編程模型更加適合 Layer 2,因為通過分析 Layer 2 協議的共同模式我們可以看到,協議層之間的交互對象應該是狀態對象(State Transaction)而不是事件對象(Event Transaction),Layer 1 應該是一個狀態層而不是計算層。
CKB 編程模型的另一個特點是,不區分數據(狀態)和代碼。這句話的意思是,與 Account 模型不同,合約的狀態和代碼都可以儲存在 Cell 的 Data 字段中,保存代碼的 Cell 可以被其它 Cell 引用(因為它們是First-class State!),合約的狀態和代碼不需要綁定在一起,存放在一個地方。開發者可以通過一條簡單的指令把代碼 Cell 或者數據 Cell 的內容載入運行時內存,然后根據需要自行將其解釋為代碼執行或者數據來讀寫。
有了這些底層支持,我們就可以將一個合約的代碼和狀態分開保存在不同的地方:Code Cell 的 Code(Data)字段存放代碼,而 State Cell 的 State(Data)的字段則保存狀態;在 State Cell 中通過 Contract ref 引用 Code Cell 來建立對自身保存的 State 的業務邏輯約束,通過 Lock ref 引用另外一個 Code Cell 來表達 State Cell 的所有權。每一個 State Cell 可以屬于不同的用戶,因此在 Cell 模型下獨立的用戶狀態是非常容易實現的模式(在 Account 模型下,合約狀態往往由多個用戶狀態混合構成,例如在一個 ERC 20 合約中,Alice 和 Bob 的 Token 余額都記錄在同一個合約的內部狀態里面)。
如果想對 CKB-VM 上的合約編寫有更多了解,請看這兩篇文章「An Introduction to Nervos CKB-VM」「Hello:CKB」:有了這樣一種編程模型,我們就能構造 First-class Asset 了。
First-class AssetCKB 中的用戶定義資產(User Defined Asset)可以這樣來構造:
設計資產定義合約(Asset Definition),規定資產的主要約束(例如總數量,發行者,交易前后數量不變等);
保存合約代碼到 Asset Definition Cell 中;
在滿足發行權限的情況下,發行者發行資產,并將資產狀態保存在另外的 State Cell中。State Cell 的 Contract
字段引用保存了資產定義的 Code Cell,保證 State Cell 的變化受到資產定義的約束;
Asset Cell 的持有者可以通過更新 Lock 來改變 Asset Cell 的所有者。
可以看到,在這樣的設計中,用戶定義的資產是作為獨立對象存在于系統中的,每一份資產都是一個 Cell,每一份資產都擁有自己的標識符。我們完全可以認為 Asset Cell 是 UTXO 的通用化版本。這樣的 First-class Asset 有如下優點:
Asset Cell 可以被引用,可以直接作為其它合約的參數傳入。只要引用 Asset Cell 的 Input
有正確的用戶授權,合約就可以正常的使用用戶的 Asset Cell;
資產定義與資產狀態分離。Asset Definition Cell 的所有者是資產的發行者,而 Asset Cell 是屬于每個用戶的。Asset Cell 的授權邏輯和業務邏輯分離,所有權完全由自己的 Lock 決定,與 Asset Definition 的邏輯無關,這意味著 First-class Asset 不是托管在資產發行者、開發者或是資產定義合約的手中,而是真正完全屬于用戶的;
用戶的資產相互隔離,用戶資產狀態獨立。CKB 的經濟模型關注狀態存儲激勵問題:用戶在區塊鏈上保存狀態不僅需要支付寫入費用,而且應該承擔與存儲時間成正比的存儲成本。如果用戶的資產狀態混合在一個地方保存(例如 ERC 20),這些狀態的存儲成本有誰來支付將是一個問題。
只要 Asset Definition Cell 的 Lock 邏輯允許,資產定義可以獨立更新。
上面的示意圖只是在 CKB 上實現 First-class Asset 的一種方式。除了上面討論的方面,還有一些有趣的細節,例如,Asset Definition Cell 是不是可以有屬于自己的狀態?Asset Definition Cell 以及 Asset Cell 的 Capacity 應該由誰來提供?對于這些問題,我們已經有了一些非常漂亮的想法。這些細節的設計、討論和實現是我們現在正在進行的工作。
SummaryCell 模型是一個高度抽象的模型,事實上,你不僅可以在 Cell 上實現First-class Asset,也可以在 Cell 上模擬 Account。通過這篇文章的介紹我們可以看出,Cell 模型是一個不同于 UTXO 模型和 Account 模型的新設計。除了狀態模型的不同,CKB 還將計算(也就是狀態生成)轉移到了鏈外,在鏈上只需要對狀態進行驗證的邏輯。獨特的狀態模型和計算驗證分離這兩點決定了 CKB 的編程模型上必然會出現新的 DApp 范式和設計模式。
了解更多從CKB白皮書完成到現在將近一年的時間中,我們看到越來越多的人開始關注和討論First-class State和First-class Asset這兩種新的思路(雖然大家用的名詞各自都不一樣),這些進展讓我們非常興奮。如果你有興趣對First-class State和First-class Asset進行更多的探討,或是在CKB的編程模型上有什么有趣的想法,歡迎聯系我們討論~
CKB的代碼已經完全開源,這篇文章介紹的內容在代碼中都已經實現。歡迎給我們的代碼提出各種意見:
https://github.com/nervosnetw... 9 (ckb上用ruby腳本編程的示例,理解ckb上編程模型的最佳入口)
https://github.com/nervosnetw... 1
https://github.com/nervosnetw... 2
感謝Ian Yang, Xuejie Xiao,Kevin Wang在CKB和Cell模型設計中提供的幫助~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24724.html
摘要:比特幣和以太坊像兩座最早出現的虛擬城市。下面我們先來分析比特幣和以太坊這兩個最大加密經濟體的經濟模型,我們經過研究發現它們在可持續性上都存在各自的問題。狀態爆炸比特幣與智能合約平臺,都 公鏈的競爭是慘烈的,這個戰場里的玩家要想生存下來,既要有絕活,還得沒短板。在構建加密經濟網絡上,在技術實現和共識協議部分,我們為大家分享了CKB 的絕活,即: 與時俱進的 Cell 模型 用 RIS...
摘要:在之前的文章中,我們已經介紹了使用與三大框架結合搭建您的應用程序。使用創建應用程序。擴展閱讀用玩轉您的應用用玩轉您的應用用玩轉您的應用近期活動問卷調查揚帆萬里,因您前行使用反饋意見征集 前言: 在本文中,我們將著重介紹如何將WijmoJS與Ionic一起使用,來創建一款移動端支持優先、快捷高效的應用程序。在之前的文章中,我們已經介紹了使用WijmoJS與Angular、React、Vu...
摘要:自我保障協議與加密經濟加密經濟是區塊鏈發展多年以后形成的全新經濟體。根證書頒發機構為互聯網創造信任,它們是整個互聯網信任體系的引擎。的信任引擎區塊鏈是創造信任的機器,是一個不依賴任何第三方的由算法和經濟激勵維護的的網絡。 在上一篇中,我們暢想了區塊鏈的未來。秘猿科技在行業內有著豐富的工程實踐經驗,在多年的實踐中,我們不禁思考:區塊鏈技術到底能用來干什么?區塊鏈是要像以太坊一樣成為世界計...
摘要:長期以來,困擾人工神經網絡的難題就是如何設計出一套系統,不僅能夠自行學習,而且在嘗試新事物時,仍然記得曾經學過的東西。 DeepMind的研究人員指出,讓系統學會「記憶」是一塊全新的研究領域,他們正在試圖解決這個難題。這篇文章正好談到這個問題并介紹了當前的研究進展。雖然諸多科技大佬(譬如Musk、霍金)都悲觀的認為,人類終究會被自己制造出來的數字「生物」奴役。但現在,即便是最復雜的計算機,也...
摘要:為此,浪潮云打造了新一代大型企業云服務平臺,并在此次大會上亮相,為支撐大型企業數字化轉型注入新的動力。每隔一段時間,管理軟件領域都會把ERP是否過時這個問題拉出來討論一番,尤其在云計算加速落地的今天更是如此。別說ERP,就連云ERP這樣與時俱進的提法也被不少人視為不合時宜。但有趣的是,在服務企業數字化轉型這件事上,卻少有管理軟件企業拿出殺手級的產品出來,大多都是以某某云的名稱籠統地加以描述。...
閱讀 2528·2021-07-26 23:38
閱讀 3430·2019-08-30 13:10
閱讀 2315·2019-08-29 18:33
閱讀 2320·2019-08-29 16:12
閱讀 987·2019-08-29 10:59
閱讀 1797·2019-08-26 17:40
閱讀 765·2019-08-26 11:59
閱讀 811·2019-08-26 11:41