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