摘要:在本次秘猿科技區(qū)塊鏈小課堂中,我們帶大家來了解一個(gè)全新的狀態(tài)爆炸問題。目前整個(gè)歷史的大小所有區(qū)塊加起來的大小大約是,而狀態(tài)的大小只有大約由約萬個(gè)組成。通過每個(gè)區(qū)塊的,間接限制了歷史和狀態(tài)的增長(zhǎng)速度。常見的一個(gè)誤解是的區(qū)塊鏈大小已經(jīng)超過了。
在設(shè)計(jì)全新的區(qū)塊鏈經(jīng)濟(jì)模型之前,我們以 SoV(價(jià)值存儲(chǔ)) 和 MoE(交易媒介) 兩個(gè)框架分析了比特幣和以太坊經(jīng)濟(jì)模型,得出了上一篇中的問題。在本次秘猿科技區(qū)塊鏈小課堂中,我們帶大家來了解一個(gè)全新的狀態(tài)爆炸問題。這類問題將會(huì)在未來解決擴(kuò)展性問題后,顯著爆發(fā)出來,我們稱之為 post-scalability problem!
秘猿科技區(qū)塊鏈小課堂第 32 期
如果 Layer 1 的關(guān)注點(diǎn)應(yīng)該是狀態(tài)而不是計(jì)算,在設(shè)計(jì) Layer 1 區(qū)塊鏈時(shí),我們就需要先理解什么是區(qū)塊鏈的狀態(tài)。理解了狀態(tài)是什么,我們才能理解狀態(tài)爆炸是什么。
狀態(tài)區(qū)塊鏈網(wǎng)絡(luò)中的每一個(gè)全節(jié)點(diǎn),在網(wǎng)絡(luò)中運(yùn)行一段時(shí)間之后都會(huì)在本地存儲(chǔ)上留下一些數(shù)據(jù),我們可以按照歷史和現(xiàn)在把它們分為兩類:
歷史——區(qū)塊數(shù)據(jù)和交易數(shù)據(jù)都是歷史,歷史是從 Genesis 到達(dá)當(dāng)前狀態(tài)的路徑。
狀態(tài)(即現(xiàn)在)——節(jié)點(diǎn)在處理完從 Genesis 到當(dāng)前高度的所有區(qū)塊和交易后形成的最終結(jié)果。狀態(tài)隨著區(qū)塊的增加一直處于變化之中,交易是造成變化的原因。
共識(shí)協(xié)議的作用是通過一系列的消息交換,保證每一個(gè)節(jié)點(diǎn)看到的當(dāng)前狀態(tài)是相同的,而實(shí)現(xiàn)這個(gè)目標(biāo)的方式是保證每一個(gè)節(jié)點(diǎn)看到的歷史是相同的。只要?dú)v史相同(即所有交易的排序相同),處理交易的方式相同(把交易放在相同的確定性虛擬機(jī)里面執(zhí)行),最后看到的當(dāng)前狀態(tài)就是相同的。當(dāng)我們說「區(qū)塊鏈具有不可篡改性」時(shí),是指區(qū)塊鏈歷史不可篡改,相反,狀態(tài)是一直在變化的。
有趣的是,不同的區(qū)塊鏈保存歷史和狀態(tài)的方式不同,其中的差異使得不同的區(qū)塊鏈形成了各自的特點(diǎn)。由于這篇文章討論的話題是狀態(tài),而影響狀態(tài)的歷史數(shù)據(jù)主要是交易(而不是區(qū)塊頭),接下來的討論歷史的時(shí)候會(huì)側(cè)重交易,忽略區(qū)塊頭。
舉個(gè)例子:Bitcoin 的歷史和狀態(tài)Bitcoin 的狀態(tài),指的是 Bitcoin 賬本當(dāng)前的樣子。Bitcoin 的狀態(tài)是由一個(gè)個(gè) UTXO(尚未花費(fèi)的交易輸出)構(gòu)成的,每個(gè) UTXO 代表了一定數(shù)量的 Bitcoin,每個(gè) UTXO 上面寫了一個(gè)名字(scriptPubkey),記錄這個(gè) UTXO 的所有者是誰。如果要做一個(gè)比喻的話,Bitcoin 的當(dāng)前狀態(tài)是一個(gè)裝滿了金幣的袋子,每個(gè)金幣上刻著所有者的名字。
Bitcoin 的歷史由一連串的交易構(gòu)成,交易內(nèi)部的主要結(jié)構(gòu)是輸入和輸出。交易更改狀態(tài)的方法是,把當(dāng)前狀態(tài)中包含的一些UTXO(交易輸入引用的那些)標(biāo)記為已花費(fèi),從 UTXO 集合中移出,然后把一些新的 UTXO(這個(gè)交易的輸出)添加到 UTXO 集合里面去。
可以看出,Bitcoin 交易的輸出(TXO,Transaction Output)正是上面說的 UTXO,UTXO 只不過是一種處于特殊階段(尚未花費(fèi))的 TXO。因?yàn)闃?gòu)成 Bitcoin 狀態(tài)的組件(UTXO),同時(shí)也是構(gòu)成交易的組件(TXO)。由此 Bitcoin 有一個(gè)奇妙的性質(zhì):任意時(shí)刻的狀態(tài)都是歷史的一個(gè)子集,歷史和狀態(tài)包含的數(shù)據(jù)類型是同一維度的。交易的歷史(所有被打包的交易的集合,即所有產(chǎn)生過的 TXO 的集合)即狀態(tài)的歷史(每個(gè)區(qū)塊對(duì)應(yīng)的 UTXO 集合的集合,也是所有產(chǎn)生過的 TXO 的集合),Bitcoin 的歷史只包含交易。
在 Bitcoin 網(wǎng)絡(luò)中,每一個(gè)區(qū)塊,每一個(gè) UTXO 都要持續(xù)占用節(jié)點(diǎn)的存儲(chǔ)空間。目前 Bitcoin 整個(gè)歷史的大?。ㄋ袇^(qū)塊加起來的大小)大約是200G,而狀態(tài)的大小只有大約 3G(由約 5000萬個(gè)UTXO組成)。Bitcoin 通過對(duì)區(qū)塊大小的限制很好的管理了歷史的增長(zhǎng)速度,由于其歷史和狀態(tài)之間的子集關(guān)系,狀態(tài)數(shù)據(jù)大小必然遠(yuǎn)小于歷史數(shù)據(jù)大小,因此狀態(tài)增長(zhǎng)也間接的受到區(qū)塊大小的管理。
再舉個(gè)例子:Ethereum 的歷史和狀態(tài)Ethereum 的狀態(tài),也叫做「世界狀態(tài)」,指的是 Ethereum 賬本當(dāng)前的樣子。Ethereum 的狀態(tài)是由賬戶構(gòu)成的一棵 Merkle 樹(賬戶是葉子),賬戶里面不僅記錄了余額(代表一定數(shù)量的 ether),還記錄了合約的數(shù)據(jù)(例如每一只加密貓的數(shù)據(jù))。Ethereum 的狀態(tài)可以看作是一個(gè)大賬本,賬本的第一列是名字,第二列是余額,第三列是合約數(shù)據(jù)。
Ethereum 的歷史同樣由交易構(gòu)成,交易內(nèi)部的主要結(jié)構(gòu)是:
to - 另一個(gè)賬戶,代表交易的發(fā)送對(duì)象
value - 交易攜帶的 ether 數(shù)量
data - 交易攜帶的任意信息
交易更改狀態(tài)的方法是,EVM 找到交易發(fā)送的目標(biāo)賬戶:
根據(jù)交易的 value 計(jì)算目標(biāo)賬戶的新余額;
將交易攜帶的 data 作為參數(shù)傳遞給目標(biāo)賬戶的智能合約,運(yùn)行智能合約的邏輯,在運(yùn)行中可能會(huì)修改任意賬戶的內(nèi)部狀態(tài)生成新的狀態(tài);
構(gòu)造新的葉子存放新的狀態(tài),更新狀態(tài) Merkle 樹。
可以看出,Ethereum 的歷史和交易結(jié)構(gòu)與 Bitcoin 相比有非常大的不同。Ethereum 的狀態(tài)是由賬戶構(gòu)成的,而交易是由觸發(fā)賬戶變動(dòng)的信息構(gòu)成,狀態(tài)和交易中記錄的是完全不同類型的數(shù)據(jù),二者之間沒有超集和子集的關(guān)系,歷史和狀態(tài)所包含的數(shù)據(jù)類型是兩個(gè)維度的,交易歷史大小與狀態(tài)大小之間沒有必然的聯(lián)系。交易修改狀態(tài)后,不僅會(huì)產(chǎn)生新的狀態(tài)(圖中實(shí)線框的葉子),而且會(huì)留下舊的狀態(tài)(圖中虛線框的葉子)成為歷史狀態(tài),因此 Ethereum 的歷史不僅僅包含交易,還包含歷史狀態(tài)。因?yàn)闅v史和狀態(tài)屬于不同的維度,Ethereum 區(qū)塊頭中不僅僅包含交易的 merkle root,也需要顯式包含狀態(tài)的 merkle root。(思考題:EOS 使用了類似 Ethereum 的賬戶模型,卻沒有在區(qū)塊頭中包含狀態(tài)的 Merkle Tree Root,這是好還是不好?)
Ethereum 中每一個(gè)區(qū)塊,每一個(gè)賬戶都會(huì)持續(xù)占用節(jié)點(diǎn)的存儲(chǔ)空間。Ethereum 節(jié)點(diǎn)在同步的時(shí)候有多種模式,在 Archive 模式下所有的歷史和狀態(tài)都會(huì)保存下來,其中歷史包括歷史交易和歷史狀態(tài),所有數(shù)據(jù)加起來的大小超過了 2TB;在 Default 模式下,歷史狀態(tài)會(huì)被裁剪掉,本地只保留歷史交易和當(dāng)前狀態(tài),[所有數(shù)據(jù)加起來大約是 170G],其中交易歷史大小是 150G,當(dāng)前狀態(tài)大小是 10G。Ethereum 中所有的開銷管理都被統(tǒng)一到 gas 計(jì)費(fèi)模型之下,交易的大小需要消耗對(duì)應(yīng)的 gas,而每一條 EVM 指令消耗的 gas,不僅考慮了計(jì)算開銷,也將存儲(chǔ)開銷考慮在內(nèi)。通過每個(gè)區(qū)塊的 gaslimit,間接限制了歷史和狀態(tài)的增長(zhǎng)速度。
ps. 常見的一個(gè)誤解是:Ethereum 的「區(qū)塊鏈大小」已經(jīng)超過 1T 了。從上面的分析我們可以看到,「區(qū)塊鏈大小」是一個(gè)非常模糊的定義,如果把歷史狀態(tài)算進(jìn)去,它確實(shí)超過了,但是對(duì)于全節(jié)點(diǎn)來說,把歷史狀態(tài)刪掉沒有任何問題,因?yàn)橹灰?Genesis 和交易歷史,任意時(shí)刻的歷史狀態(tài)都可以重新被計(jì)算出來(不考慮計(jì)算需要的時(shí)間)。真正有意義的數(shù)據(jù),是全節(jié)點(diǎn)必須的數(shù)據(jù)的大小,Bitcoin 是 200G,Ethereum 是 170G,兩者是基本相同的,而且在平均配置的云主機(jī)上都能裝下,因此人們觀察到的 Ethereum 全節(jié)點(diǎn)減少 并不是由于存儲(chǔ)增加導(dǎo)致的(根本原因是同步時(shí)的計(jì)算開銷,這里不展開了)。考慮到 Ethereum 的歷史長(zhǎng)度(當(dāng)前區(qū)塊的 timestamp 減去 genesis 的 timestamp)不到 Bitcoin 的一半,可以看出 Ethereum 的歷史和狀態(tài)大小增長(zhǎng)更快。
The Tragedy of (Storage) Commons:區(qū)塊鏈版本的公地悲劇
公地悲劇所指的是這樣一種情況,有限的共享資源在不受任何使用限制的情況下會(huì)被人們過度消耗。區(qū)塊鏈節(jié)點(diǎn)為保存歷史和狀態(tài)付出的存儲(chǔ),正是這樣一種共享資源。
區(qū)塊鏈節(jié)點(diǎn)為處理交易所花費(fèi)的資源有三種,CPU、存儲(chǔ)和網(wǎng)絡(luò)帶寬。CPU 和帶寬都是每個(gè)區(qū)塊會(huì)刷新的資源,我們可以認(rèn)為每個(gè)區(qū)塊間隔內(nèi)都有同樣多的 CPU 和帶寬可供使用,上個(gè)區(qū)塊消耗掉的 CPU 和帶寬不會(huì)讓下個(gè)區(qū)塊可用的 CPU 和帶寬變少。對(duì)于可刷新的資源,我們可以通過一次性支付的交易手續(xù)費(fèi)來補(bǔ)償節(jié)點(diǎn)。
與 CPU 和帶寬不同,存儲(chǔ)是一種占用資源,在一個(gè)區(qū)塊中被占用了的存儲(chǔ),除非使用者主動(dòng)釋放,否則無法在后面的區(qū)塊中被其它使用者使用。節(jié)點(diǎn)需要為存儲(chǔ)持續(xù)的付出成本,而使用者卻不需要為存儲(chǔ)持續(xù)的支付手續(xù)費(fèi)(記住交易手續(xù)費(fèi)只需要支付一次)。使用者只需要在往區(qū)塊鏈寫數(shù)據(jù)的時(shí)候支付一點(diǎn)點(diǎn)手續(xù)費(fèi),就可以永久使用一個(gè)可用性超過 Amazon S3 的存儲(chǔ),其無限大的永久存儲(chǔ)成本需要區(qū)塊鏈網(wǎng)絡(luò)中的所有全節(jié)點(diǎn)來承擔(dān)。
Ethereum 上由于各種 DApp 的存在,The Tragedy of (Storage) Commons 相對(duì)更加嚴(yán)重。例如,在區(qū)塊 5700001(May 30, 2018)的時(shí)候,使用狀態(tài)最多的 5 個(gè)合約是:
EtherDelta, 5.09%
IDEX, 4.17%
CryptoKitties, 3.05%
ENS, 1.92%
EOS Sale, 1.73%
比較有趣的是最后一個(gè),EOS Sale。雖然 EOS 的眾籌已經(jīng)完成,EOS 代幣已經(jīng)在 EOS 鏈上流轉(zhuǎn),EOS 眾籌的記錄卻永遠(yuǎn)留在了Ethereum 的節(jié)點(diǎn)上,消耗 Ethereum 全節(jié)點(diǎn)的存儲(chǔ)資源。
可以看到,在缺乏管理的情況下,區(qū)塊鏈的存儲(chǔ)資源會(huì)被有意或者無意的濫用。在一個(gè)設(shè)計(jì)合理的經(jīng)濟(jì)模型中,使用者必須承擔(dān)存儲(chǔ)占用的成本,這個(gè)成本不僅僅與占用存儲(chǔ)空間的大小成正比,還與占用時(shí)間的長(zhǎng)度成正比。
狀態(tài)爆炸無論是歷史還是狀態(tài)數(shù)據(jù)都會(huì)占用存儲(chǔ)資源。通過上面對(duì) Bitcoin 和 Ethereum 的分析(其他區(qū)塊鏈的狀態(tài)模型基本都可以歸納為二者之一)可以看到,雖然它們對(duì)歷史和狀態(tài)的增長(zhǎng)進(jìn)行了管理,但是對(duì)歷史和狀態(tài)的總大小卻沒有任何控制,這些數(shù)據(jù)會(huì)持續(xù)無休止的累積下去,使得運(yùn)行全節(jié)點(diǎn)需要的存儲(chǔ)資源越來越大。提高全節(jié)點(diǎn)的運(yùn)行門檻,使網(wǎng)絡(luò)的去中心化程度越來越低,這是我們不愿意看到的。
你也許會(huì)說,有沒有可能硬件平均水平的提高會(huì)超過歷史和狀態(tài)的積累速度?我的回答是可能性很低:
從這張圖中我們可以看到,隨著 Ethereum 網(wǎng)絡(luò)的發(fā)展,狀態(tài)數(shù)據(jù)累積的數(shù)量呈指數(shù)式的增長(zhǎng)。Bitcoin 的狀態(tài)數(shù)據(jù)從 0 積累到 3G,用了 10 年;Ethereum 的狀態(tài)數(shù)據(jù)從 0 積累到 10G,用了 4 年;而這是在我們還沒有解決 Scalability 問題,區(qū)塊鏈仍然是小眾技術(shù)的情況下的增長(zhǎng)速度。當(dāng)我們解決了 Scalability 問題,區(qū)塊鏈真正獲得 mass adoption,DApp 和用戶數(shù)量都爆炸式增長(zhǎng)的時(shí)候,區(qū)塊鏈歷史和狀態(tài)數(shù)據(jù)會(huì)以什么速度累積呢?
這就是狀態(tài)爆炸問題,我們把它歸類為 post-scalability problem,因?yàn)樗诮鉀Q Scalability 問題之后會(huì)非常明顯。我們最早是在做許可鏈場(chǎng)景落地時(shí)注意到了這個(gè)問題,因?yàn)樵S可鏈的性能遠(yuǎn)高于公有鏈,剛好處于 post-scalability 的階段。(思考題:許可鏈怎么解決狀態(tài)爆炸問題?)
歷史數(shù)據(jù)的累積相對(duì)容易處理,未來可以通過去中心化的 Checkpoint 或是零知識(shí)證明等技術(shù)來壓縮,在那之前全節(jié)點(diǎn)甚至可以把歷史直接丟掉,依然可以正常運(yùn)行。狀態(tài)數(shù)據(jù)的累積則麻煩許多,因?yàn)樗侨?jié)點(diǎn)運(yùn)行必須的數(shù)據(jù)。
不少區(qū)塊鏈項(xiàng)目已經(jīng)看到了這個(gè)問題,并提出了一些解決方案。EOS RAM 是解決狀態(tài)爆炸問題的一個(gè)有益嘗試:RAM 代表了超級(jí)節(jié)點(diǎn)服務(wù)器可用的內(nèi)存資源,無論是賬戶、合約狀態(tài)還是代碼,都需要占用一定的 RAM 才能運(yùn)行。RAM 的設(shè)計(jì)也有很多問題,它需要通過內(nèi)置的交易市場(chǎng)購(gòu)買,不可轉(zhuǎn)讓,無法租用,將合約執(zhí)行過程中的短期內(nèi)存需求和合約狀態(tài)的長(zhǎng)期存儲(chǔ)需求混在了一起,而且 RAM 的總量設(shè)定沒有確定的規(guī)則,更多取決于超級(jí)節(jié)點(diǎn)可以承受的硬件配置,而非共識(shí)空間的成本。
Ethereum 社區(qū)也看到了這個(gè)問題并提出了 Storage Rent 的方案:要求使用者為存儲(chǔ)資源的使用預(yù)支付一筆租金,占用存儲(chǔ)資源會(huì)持續(xù)消耗這筆租金,占用時(shí)間越長(zhǎng),使用者需要支付的租金越多。Storage Rent 方案存在兩個(gè)問題:
預(yù)支付的租金終有一天會(huì)用完,這時(shí)候如何處理占用的狀態(tài)?正是為解決這個(gè)問題,Storage Rent 需要諸如 resurrection
的機(jī)制來補(bǔ)充,增加了設(shè)計(jì)的復(fù)雜度,使智能合約的 immutability 大打折扣,也為使用體驗(yàn)帶來了麻煩;
Ethereum 的狀態(tài)模型是一種共享狀態(tài)的模型,而不是 First-class State。以 ERC20 Token 為例,所有用戶的資產(chǎn)記錄都存放在單個(gè) ERC20 合約的存儲(chǔ)里面,在這種情況下,應(yīng)該由誰來支付租金?
解決狀態(tài)爆炸問題也是 Nervos CKB 的設(shè)計(jì)目標(biāo)之一,為此 CKB 走了一條完全不同的、更為徹底的變革之路。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24740.html
摘要:目前整個(gè)歷史的大小所有區(qū)塊加起來的大小大約是,而狀態(tài)的大小只有大約由約萬個(gè)組成。通過每個(gè)區(qū)塊的,間接限制了歷史和狀態(tài)的增長(zhǎng)速度。常見的一個(gè)誤解是的區(qū)塊鏈大小已經(jīng)超過了。區(qū)塊鏈節(jié)點(diǎn)為保存歷史和狀態(tài)付出的存儲(chǔ),正是這樣一種共享資源。 showImg(https://segmentfault.com/img/bVbsfg9?w=1920&h=815); 如果 Layer 1 的關(guān)注點(diǎn)應(yīng)該是狀...
摘要:雙管齊下的發(fā)行政策在基礎(chǔ)發(fā)行結(jié)束之前,礦工的收入是這樣基礎(chǔ)發(fā)行二級(jí)發(fā)行手續(xù)費(fèi),與比特幣有著類似的發(fā)行曲線。在前個(gè)減半周期中,網(wǎng)絡(luò)會(huì)發(fā)出絕大部分的區(qū)塊獎(jiǎng)勵(lì),與比特幣不同的是,當(dāng)基礎(chǔ)發(fā)行完全結(jié)束后,仍然有二級(jí)發(fā)行擔(dān)任出塊獎(jiǎng)勵(lì)的角色。 在 31/32 期秘猿科技小課堂中,我們從經(jīng)濟(jì)模型角度分析了現(xiàn)有區(qū)塊鏈的問題,以及狀態(tài)爆炸的問題。Nervos CKB 的經(jīng)濟(jì)模型為了解決現(xiàn)有問題,提出了創(chuàng)新...
摘要:因?yàn)榘踩珨U(kuò)展性去中心化這個(gè)不可能三角問題的存在,在不犧牲安全和去中心化的前提下,要在上解決擴(kuò)展性問題幾乎是不可能完成的任務(wù),因此我們只能繞道而行,選擇分層方案。 在上一篇《小白都能看懂的 Cell 模型》中,我們用大白話簡(jiǎn)單介紹了 Cell 模型。在這篇文章中,我們將會(huì)從「驗(yàn)證模型」和「狀態(tài)存儲(chǔ)」兩個(gè)方面來介紹 Cell 模型——一個(gè)適合分層架構(gòu)的區(qū)塊鏈設(shè)計(jì) 秘猿科技區(qū)塊鏈小課堂第 2...
摘要:比特幣和以太坊像兩座最早出現(xiàn)的虛擬城市。下面我們先來分析比特幣和以太坊這兩個(gè)最大加密經(jīng)濟(jì)體的經(jīng)濟(jì)模型,我們經(jīng)過研究發(fā)現(xiàn)它們?cè)诳沙掷m(xù)性上都存在各自的問題。狀態(tài)爆炸比特幣與智能合約平臺(tái),都 公鏈的競(jìng)爭(zhēng)是慘烈的,這個(gè)戰(zhàn)場(chǎng)里的玩家要想生存下來,既要有絕活,還得沒短板。在構(gòu)建加密經(jīng)濟(jì)網(wǎng)絡(luò)上,在技術(shù)實(shí)現(xiàn)和共識(shí)協(xié)議部分,我們?yōu)榇蠹曳窒砹薈KB 的絕活,即: 與時(shí)俱進(jìn)的 Cell 模型 用 RIS...
摘要:為了理解底層公鏈的模型,我們前置了幾篇概念性文章,講述了我們應(yīng)該以狀態(tài)為中心設(shè)計(jì)區(qū)塊鏈系統(tǒng)的,以及這么做帶來的好處。交易依然表示狀態(tài)的變化遷移。 為了理解底層公鏈 CKB 的 Cell 模型,我們前置了幾篇概念性文章,講述了我們應(yīng)該以狀態(tài)為中心設(shè)計(jì)區(qū)塊鏈系統(tǒng)的,以及這么做帶來的好處。并且在上一篇文章中,詳細(xì)分析了比特幣 UTXO 模型和以太坊的 Account 模型,以及進(jìn)行了對(duì)比分析...
閱讀 2743·2021-11-19 11:35
閱讀 2532·2021-11-02 14:40
閱讀 1385·2021-09-04 16:48
閱讀 2992·2019-08-30 15:55
閱讀 1698·2019-08-30 13:11
閱讀 1937·2019-08-29 11:12
閱讀 1068·2019-08-27 10:52
閱讀 3126·2019-08-26 18:36