時(shí)間:2021-12-25|瀏覽:444
DeFi、GameFi等去中心化應(yīng)用的蓬勃發(fā)展,極大地增加了對低交易費(fèi)用的高性能區(qū)塊鏈的需求。然而,構(gòu)建高性能區(qū)塊鏈的一個(gè)關(guān)鍵挑戰(zhàn)是存儲爆炸。下圖是取自 Etherscan 的圖表,它說明了一個(gè)以太坊全節(jié)點(diǎn)(存檔)的區(qū)塊鏈數(shù)據(jù)大小。
分解存儲開銷
如果我們進(jìn)一步分析存儲使用情況,我們可以發(fā)現(xiàn)區(qū)塊數(shù)據(jù)只占了約300GB的數(shù)據(jù)(從區(qū)塊高度0到13.6M),這一數(shù)字遠(yuǎn)小于9TB。那么剩下的8.7TB數(shù)據(jù)從何而來呢?
實(shí)際上,存檔節(jié)點(diǎn)執(zhí)行所有塊并保留所有歷史數(shù)據(jù),包括:
區(qū)塊
狀態(tài)
交易收據(jù)
這其中,狀態(tài)是這 8.7TB 的主要組成部分。所以有時(shí),我們將存儲爆炸稱為“狀態(tài)爆炸”。但是為什狀態(tài)會如此之大?
什么是以太坊狀態(tài)?
以太坊狀態(tài)是一個(gè)Merkle Patrica樹(MPT),其中
葉子節(jié)點(diǎn)是地址 (0x...) => 帳戶的映射,其中帳戶存儲與地址關(guān)聯(lián)的余額、nonce等
內(nèi)部節(jié)點(diǎn)維護(hù)樹結(jié)構(gòu),以便可以快速計(jì)算整個(gè)樹的哈希根
由于存檔節(jié)點(diǎn)將保留所有區(qū)塊的所有歷史狀態(tài),這意味著 MPT 中的任何更新都將創(chuàng)建 O(log(N)) 個(gè)內(nèi)部節(jié)點(diǎn),并且不會刪除舊的內(nèi)部節(jié)點(diǎn)。
Geth 的全節(jié)點(diǎn)
為了解決存檔節(jié)點(diǎn)狀態(tài)爆炸的問題,Geth 的天才工程師們創(chuàng)建了一種稱為“修剪”模式的新模式,該模式僅定期存儲 MPT。這里我們舉一個(gè)簡化的例子,其中節(jié)點(diǎn)只保存每 3 個(gè)區(qū)塊的MPT。(注意,為了獲得一個(gè)不包含任何狀態(tài)區(qū)塊的狀態(tài),節(jié)點(diǎn)必須獲得該區(qū)塊之前最近的狀態(tài),并重放接下來的交易)。
通過定期存儲 MPT,狀態(tài)的存儲大小顯著減少。據(jù) Etherscan 數(shù)據(jù),目前 Geth 全節(jié)點(diǎn)的區(qū)塊鏈數(shù)據(jù)大小約為 1TB。
Geth 的可快速同步的全節(jié)點(diǎn)
通過從創(chuàng)世區(qū)塊開始重放所有交易來運(yùn)行節(jié)點(diǎn)的一個(gè)問題是,重放所有交易會占用很長時(shí)間。一般來說,建立這樣一個(gè)節(jié)點(diǎn)需要數(shù)周時(shí)間才能從創(chuàng)世區(qū)塊趕上網(wǎng)絡(luò)的最新狀態(tài)。為了加速節(jié)點(diǎn)的啟動(dòng)過程,Geth 進(jìn)一步提供了一種快速同步模式,可以下載最新的穩(wěn)定區(qū)塊的 MPT,而無需重放和維護(hù)區(qū)塊之前的歷史 MPT。下載完 MPT 后,它會像全節(jié)點(diǎn)一樣重放新區(qū)塊(帶有定期狀態(tài)存儲)。
在不存儲歷史 MPT(有時(shí)甚至是歷史區(qū)塊主體)的情況下,一個(gè) Geth 節(jié)點(diǎn)的存儲大小可以進(jìn)一步減少到 447G(截至 2021/12/06)。通過減去 300GB 的區(qū)塊數(shù)據(jù),我們推斷狀態(tài)大小約為 150GB。
問題
以目前以太坊 447GB 的存儲大小和 15 TPS,我們預(yù)計(jì)具有 1TB SSD 的普通配置計(jì)算機(jī)應(yīng)該能夠運(yùn)行以太坊節(jié)點(diǎn)相當(dāng)長的一段時(shí)間(比如數(shù)年)。那么存儲爆炸或狀態(tài)爆炸真的存在嗎?或許未來幾年以太坊并不會,但假如我們可以將以太坊的虛擬機(jī) (EVM) 擴(kuò)展到數(shù)百或數(shù)千 TPS 呢?
讓我們將目光轉(zhuǎn)向另一個(gè)基于 EVM 的鏈,幣安智能鏈(BSC)。截至 2021 年 12 月 8 日,BSC 已有:
約 984 GB 鏈上數(shù)據(jù),其中區(qū)塊約占 550 GB,狀態(tài)約占 400 GB。
20.6623 億筆交易,100 TPS
如果我們進(jìn)一步用交易數(shù)量來預(yù)測數(shù)據(jù)大小,我們可以得到:
如果 TPS 為 100,即 ~3,153 M TPY
1 年后,總 TX ~5,219M,區(qū)塊 ~ 1.375 TB,狀態(tài) ~ 1.085TB
3 年后,總 TX ~11,525M,區(qū)塊 ~3.025TB,狀態(tài) ~2.387 TB
如果 TPS 為 150(觀察到的峰值 TPS),即 ~4,730 M TPY
1 年后,總 TX ~6,796M,區(qū)塊 ~1.809 TB,狀態(tài) ~1.427 TB
3 年后,總 TX ~16,256M,區(qū)塊 ~4.327 TB,狀態(tài) ~3.414TB
綜上所述,對于BSC來說,如果保持目前的速度甚至更高,則很快就會達(dá)到以太坊存檔節(jié)點(diǎn)相同的存儲大小,這是普通計(jì)算機(jī)幾乎無法運(yùn)行的。
具有極高 TPS 區(qū)塊鏈的存儲爆炸問題
如果我們對一個(gè)極高 TPS 的區(qū)塊鏈(比如像 QuarkChain 能夠做到的那樣)做一個(gè)更大膽的假設(shè),這個(gè)數(shù)字會變成多少?我們來考慮一個(gè)具有 1000 TPS 的區(qū)塊鏈并分析其區(qū)塊和狀態(tài)大小,將是:
假設(shè) tx 大小約為 100 字節(jié),每年區(qū)塊所需的存儲量為 1000 (TPS) * 100(每 tx 字節(jié)數(shù))* 365 * 24 * 3600 = 2.86 TB
假設(shè) MPT 有 100 億賬戶(超過世界人口?。覀冾A(yù)計(jì)狀態(tài)大小將為 150G(以太坊狀態(tài)大?。?0.18B(以太坊唯一地址)* 10B = 8.3 TB
將這些數(shù)字放在一起,我們很容易得出一個(gè)結(jié)論,這是大多數(shù)普通配置計(jì)算機(jī)將 無法承受的要求!
優(yōu)化
為了優(yōu)化存儲成本,我們必須將限制放寬為兼容 EVM 而不是兼容以太坊。即,我們必須構(gòu)建/運(yùn)行另一個(gè)支持 EVM 的鏈,而不是高度優(yōu)化的以太坊客戶端。
狀態(tài)存儲優(yōu)化
熱點(diǎn):以太坊 幣安智能鏈 什么是以太坊 區(qū)塊鏈 幣安 數(shù)據(jù) 計(jì)算機(jī) 以太