即使硬體沒有改進,乙太坊也可以維持當前的狀態增長水準數年。
原文:How to Raise the Gas Limit, Part 1: State Growth(Paradigm)
作者:Storm Slivkoff,Georgios Konstantopoulos
編譯:Luffy,Foresight News
封面:Photo by Nenad Novaković on Unsplash
乙太坊狀態增長及其與 Gas 限制的關係被廣泛誤解。 人們普遍認為狀態增長是以太坊的主要擴展瓶頸。 然而,關於狀態增長的討論常常因術語不精確和缺乏詳細的定量證據而受阻。
採用數據驅動的方法可以使狀態增長問題變得更加清晰。 在本文中,我們利用高解析度數據集來了解狀態增長的大小和形狀。 在這個過程中,我們得出了令人驚訝的結論:現代消費硬體可以維持當前的狀態增長率至少十年。 此外,考慮到軟體和硬體的不斷改進,這條跑道可能會無限期地延長。
我們相信,乙太坊有一個明確的路線圖:1)完全消除狀態增長作為擴容瓶頸; 2)將 Gas 限制提高到支援全球規模去中心化金融體系的水準。 本文系列的目標是開發一種科學方法來理解和制定這一擴展路線圖。
本文是有關乙太坊擴容系列文章的第 1 部分,主要介紹狀態增長,第 2 部分是關於歷史增長,第 3 部分是關於狀態訪問,第 4 部分是關於 Gas 限制。
什麼是狀態增長?
「狀態增長」一詞通常用來概括任何乙太坊擴展瓶頸,即數據大小超過乙太坊節點硬體的容量。 然而,狀態增長不應該以這種單一的方式來思考。 乙太坊數據有多種類型,每種類型都與節點的底層硬體元件有獨特的關系。 因此,使用精確的術語來解釋每個不同的擴展瓶頸至關重要。
狀態是構建和驗證新乙太坊區塊所需的一組數據。 狀態由合約位元組碼、合約存儲、帳戶餘額和帳戶隨機數組成。 歷史是節點從創世區塊同步到最新區塊所需的數據集。 歷史由區塊和交易組成。 狀態和歷史是不重疊的數據集。 從這些定義來看,至少有 3 種不同的現象給節點的硬體帶來了巨大的壓力:
- 狀態增長:新帳戶、新合約位元組碼、新合約存儲的積累。
- 歷史增長:新區塊和新交易的積累。
- 狀態訪問:用於構建和驗證區塊的一組讀寫操作。
每個瓶頸都與節點的硬體限制有獨特的關系。 四個相關性最高的硬體限制是:
- 網路 IO 是節點為了與對等節點達成穩定共識而必須維持的上傳和下載速度量。
- 存儲大小是節點為了構建、驗證和分發區塊而必須在永久存儲中保存的數據量。
- 記憶體大小是節點必須在記憶體中緩存的數據量,以便與區塊鏈的末端保持同步。
- 存儲 IO 是節點為了與區塊鏈末端保持同步而必須執行的每秒讀寫操作量。
這些瓶頸和硬體限制之間的關係如圖 1 所示。
從圖的頂部開始,每次乙太坊執行交易時,該交易使用的所有資源都以 Gas 定價。 因此,乙太坊的 Gas 限制是一個單維量,它對所有形式的鏈上活動進行速率限制。 Gas 限制的下游是區塊大小和每個區塊的操作。 每個區塊的位元組越多,歷史記錄增長得越快。 每個區塊的 IO 操作越多,狀態訪問率越大,並且(通常)狀態增長率也越大。
因此,擴展瓶頸與節點的硬體約束有關,如下所示:
- 為了支援大量的狀態增長,節點必須有足夠的存儲和記憶體空間。 如果狀態變得太大,則要麼無法容納在存儲中,要麼狀態的頻繁訪問部分將無法包含在記憶體中,從而使得性能降低。
- 為了支援大量的歷史增長,節點必須有足夠的網路頻寬來共用大量的區塊數據和足夠的存儲容量來存儲該數據。
- 為了支援大量的狀態訪問,節點必須有大量的記憶體來緩存熱狀態,並有大量的存儲 IO 來支援足夠的讀寫操作。
特別是對於狀態增長而言,主要挑戰是確保狀態規模的增長速度不會超過消費者硬體的持續改進。 節點記憶體和存儲是有限的資源,因此它們最終將達到瓶頸,除非狀態停止增長或硬體定期升級。 幸運的是,記憶體和存儲硬體多年來一直在改進。 即便如此,對這些改進的準確預測仍不確定,並且不應認為它們的快速增長將無限期地持續下去。
請注意,即將推出的 EIP-4844 引入的數據 blob 將為這些擴展關係帶來一些變化。 在 EIP-4844 之後,預計磁碟上累積的歷史記錄會少得多,傳輸大量 Blob 數據時網路 IO 可能會顯著增加。
在本文中,我們將主要關注狀態大小和狀態增長率,而不是記憶體大小和狀態訪問模式。 我們將在未來的工作中研究其他主題。
乙太坊狀態的組成
理解狀態增長的下一步是檢查狀態的總規模以及每個狀態貢獻的大小。 目前,乙太坊狀態數據量約 245.5 GB。 這個數位是使用 reth 節點測量的,但每個節點用戶端的數位大致可以比較,如表格所示。 帳戶、合約位元組碼和合約存儲分別佔據狀態的 14.1%、4.3% 和 81.7%。
圖 2 顯示了各類智慧合約協定佔用了多少狀態規模。 下圖中,每個合約類別的大小表示其存儲槽和位元組碼佔用的位元元組數。
圖 2 中的數位表示節點客戶端必須在磁碟上存儲的總位元組數。 這包括索引使用的數據和其他類型的存儲開銷。 每個帳戶和每個存儲槽的平均存儲大小分別為 133.6 位元組和 191.3 位元組。
以下是圖 2 中一些最重要的資訊:
- 代幣是狀態的最大貢獻者。 乙太坊狀態的最大貢獻者是 ERC-20 和 ERC-721 代幣,分別佔據狀態的 27.2% 和 21.6%。 代幣之所以佔用如此多的狀態,是因為每個代幣的每個用戶餘額必須單獨存儲在自己的 32 位元組存儲槽中。 因此,乙太坊狀態規模的一半與乙太坊用戶總數和每個使用者持有的代幣總數成比例。
- 乙太坊至少 7.4% 的狀態處於休眠中。 乙太坊狀態中的一些最大的合約不再活躍。 這些協議發佈於區塊空間和狀態空間比現在便宜得多的時候,包括遊戲、賭博和詐騙類別中的大多數協議,還有許多不再活躍的 DEX,包括 IDEX、Etherdelta 和 Oasis。 這些協議總共構成了乙太坊狀態的至少 7.4%。 休眠狀態的真實水準更高,因為它還包括 ERC-20、ERC-721 和其他類別中的長尾專案。
- L2 跨鏈橋佔據乙太坊狀態的不到 2%。 通過利用壓縮、ZK 證明和改進的編碼等技術,L2 交易比主網更有效地利用狀態。 儘管 L2 僅占主網狀態的 2%,但 L2 每秒的總交易數量比主網多 5 倍。
乙太坊狀態增長有多快?
狀態增長最重要的方面是狀態增長率隨時間的變化。 這個比率揭示了狀態問題的嚴重性及其變化趨勢。
圖 3 顯示了自 2015 年乙太坊成立以來的狀態增長率。 這些增長率是通過對每個合約類別中的合約位元組碼和合約存儲求和來計算的。
以下是圖 3 一些最重要的資訊:
- 目前,狀態每月增長約 2.62 GB,低於每月 5.99 GB 的峰值。 通過這些數字預測 5 年內狀態總規模將在 396 GB 到 606 GB 之間。 儘管人們可能將當前的增長率描述為每年 12.8%,但在狀態持續增長的同時,絕對增長率一直在下降,因此簡單的指數增長可能不是一個合適的模型。
- 最近狀態增長的下降主要是因為 NFT 活動的減少。 儘管人們可能期望不同類型的網路活動之間存在一定程度的相關性,但各個狀態貢獻者之間存在令人驚訝的獨立性。 例如,儘管過去幾年總狀態增長率有所下降,但自 2020 年以來,ERC-20 狀態增長率實際上每年都在增加。
- 狀態增長達到 2021 年以來的最低水準。 這種下降相當令人驚訝,但考慮到狀態主要與新代幣餘額的成正比,這是有道理的。 如果狀態增長率一直在下降,人們可能會認為乙太坊有能力支援更高的 Gas 限制。 這可能是事實,但重要的是要記住:1)在當前的 Gas 定價模型下,沒有什麼可以阻止增長率的新一輪飆升,2)狀態並不是 Gas 限制下游的唯一瓶頸。
可接受的狀態增長值是多少?
我們現在知道乙太坊狀態的 1)規模、2)組成和 3)增長率。 我們如何確定可接受的狀態增長值的範圍? 這個問題很複雜,因為它既取決於不可預測的市場力量,也取決於乙太坊應該做出哪些權衡的哲學選擇。
讓我們從最簡單的模型開始,假設未來硬體沒有改進,當前的狀態增長水準在普通消費硬體上可持續多久。 如圖 3 所示,近年來狀態的年增長一直在 31GB/ 年到 72GB/ 年之間。 目前,常見的消費類硬體最高存儲容量約為 4TB ,記憶體容量約為 64GB。 由此我們可以創建一個簡單的存儲和記憶體需求預測模型:
- 存儲:節點當前總共需要存儲大約 1TB 的狀態數據。 實際上,這意味著許多節點正在使用大小至少為 2TB 的磁碟。 為簡單起見,讓我們忽略未來的歷史增長,就好像我們處於后 EIP-4444 的世界中一樣。 我們可以計算出未來運行時間為:(剩餘存儲容量)/(狀態增長率),如表格所示。 因此,節點存儲硬體可以支援當前的狀態增長速度十多年,而不會耗盡 2TB 的空間。 按照目前的狀態增長水準,4TB 足以支援運行近半個世紀。
- 記憶體:Ethereum-on-arm 用戶報告稱,運行乙太坊節點的最小可行記憶體約為 16GB。 如果我們假設記憶體需求與狀態大小成比例增長,那麼每年 30GB 到 72GB 的狀態增長將轉化為每年需要 2GB – 4.7GB 的額外記憶體。 因此,按照當前的 Gas 率,32GB RAM 應該足夠使用 3 年到 8 年。 64GB 的 RAM 應該足夠使用 10 年到 23 年。
這是一個帶有許多假設條件的簡化模型。 該模型可能的擴展條件包括 1)歷史增長,2)記憶體需求的非線性擴展,3)降低硬體成本,4)增加 Gas 限制,5)操作碼 Gas 重新定價,以及 6)未來乙太坊架構改進。 這些因素中的每一個都可以非線性相互作用並隨著時間的推移而演變。 我們將在未來的工作中探索這些模型擴展。
必須強調的是,長期可持續性是一件好事。 即使現代硬體可以支援多年的運行,也不應該掉以輕心地縮短可運行時間。 任何加速狀態增長的計劃都應該包括一個重要的緩衝區,以應對硬體或軟體環境不可預測的變化。
如何解決狀態增長問題?
為了解決狀態增長問題,人們提出了許多不同的方案。 乙太坊架構的三項改進非常突出:Rollup、Verkle 嘗試和狀態過期。 總而言之,這些構成了解決短期、中期和長期狀態增長問題的綜合路線圖。
短期:Rollup 不能解決狀態增長問題,但它們確實減輕了網路負擔。 如圖 2 和圖 3 所示,Rollup 能夠比主網更有效地使用狀態。 將活動轉移到 L2 確實需要在主網上存儲一定量的狀態,以支援使用者退出。 然而,L2 交易的狀態足跡遠低於主網上交易的足跡。 因此,Rollup 可以更可持續地增加生態系統中的總活動。 隨著即將推出的 EIP-4844,Rollup 的採用預計將會增長,blob 將使 Rollup 變得更加便宜。
中期:Verkle 嘗試解決驗證器節點的狀態增長問題,但不解決需要構建新交易的節點的問題。 Verkle 嘗試是以太坊狀態的新數據結構。 它們支援更高效的輕用戶端和「無狀態」節點。 這些節點將能夠在不瞭解現有狀態值的情況下驗證新區塊。 這消除了驗證器節點的狀態增長問題。 新交易的構建仍然需要存儲和訪問狀態,但這仍然比我們今天的情況更可持續,因為交易構建是一項可以輕鬆分佈在許多機器上的任務。 就範圍而言,Verkle 嘗試代表了一項可能需要數年時間才能實施的重大工程。
長期:狀態過期解決了所有節點的狀態增長問題,但需要額外的基礎設施。 狀態到期允許節點丟棄狀態的不活動部分,如圖 2。 請注意,術語「狀態休眠」可能是一個更合適的名稱,因為大多數現有提案允許通過證明恢復「過期」狀態。 關於過期狀態隨著時間的推移而丟失的擔憂,只要歷史記錄(區塊和交易數據)可用,就可以重建狀態。 因此,無論為 EIP-4444 的歷史保存問題開發什麼解決方案,也都將解決狀態保存問題。 但如果 Verkle 嘗試成功實現其目標,狀態到期可能就不必要了。
狀態增長問題的解決方案還有更多,其他包括狀態租金和分片,但從歷史上看,這些可能對用戶體驗或健全性產生影響。 為了在更遙遠的將來實現最終解決方案,可能需要將這些解決方案與其他解決方案結合起來。
總結
儘管狀態增長是擴展乙太坊的一個關鍵挑戰,但我們相信這是一個可以解決的問題。 通過我們對數據的解讀,乙太坊可以維持當前的狀態增長水準多年,併為架構升級提供了舒適的緩衝。
我們相信,經驗方法對於設計乙太坊的 Gas 限制和引導乙太坊走向最終的擴展解決方案至關重要。 本文只是實現這一目標的一步。 還有其他類型的超越狀態的數據,每種數據都對乙太坊節點和乙太坊 Gas 限制施加了負擔。 我們希望在未來的工作中探索這些其他瓶頸。
免責聲明:作為區塊鏈資訊平臺,本站所發佈文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。 文章內的資訊僅供參考,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。