化險為夷:以太坊的狀態問題
來源| Ethereum Blog
來源| Ethereum Blog
本篇博文的目的在於正式揭露以太坊平台在柏林硬分叉之前的一個嚴重且顯而易見的問題。
本篇博文的目的在於正式揭露以太坊平台在柏林硬分叉之前的一個嚴重且顯而易見的問題。
二級標題
來源| Ethereum Blog
來源| Ethereum Blog
本篇博文的目的在於正式揭露以太坊平台在柏林硬分叉之前的一個嚴重且顯而易見的問題。
本篇博文的目的在於正式揭露以太坊平台在柏林硬分叉之前的一個嚴重且顯而易見的問題。
二級標題
二級標題
State 狀態
我們先從以太坊和及其“狀態”的背景開始梳理。
以太坊的狀態由patricia-merkle trie 組成,一種前綴樹。本文不會深入技術細節,簡單來說隨著狀態增長,樹的分支會越來越密集。每個加入的賬戶都是一片新葉子。在樹根之間和葉子之間,存在大量的“中間”節點。
隨著以太坊的發展,一直以來都有必要提高樹訪問操作的gas 費用。 2016 年10 月,在經歷了“上海攻擊”時間之後,以太坊網絡在區塊高度2,463,000 進行了Tangerine Whistle 硬分叉,其中包含EIP 150,大舉提升了某些操作的gas 成本,並引入了大量更改以防禦DoS 攻擊。
二級標題
另一次對gas 費用的提升是在2019 年12 月的Istanbul 升級中,激活了EIP 1884。
EIP-1884 針對gas 費用引入了以下改動:
➤SLOAD 從200 提升至800 gas
➤EXTCODEHASH 從400 提升至700 gas
二級標題
二級標題
出現的問題
Parity: ~90s
Geth: ~70s
2019 年3 月,Martin Swende 當時在進行一些EVM 操作碼性能的測定。之後的EIP-1884 就是基於該調查而成的。在EIP-1884 被激活的前幾個月,Broken Metre 發布了這篇論文(2019/9)。
Parity : ~50s
Geth : ~38s
兩位以太坊安全研究員,Hubert Ritzdorf 和Matthias Egli,與論文的作者之一Daniel Perez 將一個漏洞“武器化”,提交給了以太坊的漏洞賞金(bug bounty) 項目。這是在2019 年10 月4 日。
建議大家閱讀這份他們提交的完整文檔,寫得很詳盡。
同日,在一個專門用於討論跨客戶端安全性的頻道中,來自Geth、Parity 和Aleth 的開發者都得知了這份文檔。
顯而易見,EIP-1884 的更改確實在降低該攻擊的影響上起到了幫助,但還遠遠不夠。
二級標題
解決方案
解決方案
二級標題
二級標題
二級標題
解決方案
解決方案
第二種方式是通過軟件工程來解決,修改客戶端中的數據模型和結構。
二級標題
二級標題
協議層的工作
關於如何處理這些類型的攻擊的第一個版本在這裡。 2020 年2 月,正式發佈為EIP 2583。其理念是,每當一次Trie 查找導致未命中時,施加一次罰款。
但是,Peter 找到了應對方法,即“shielded relay”攻擊,可以有效地限制這種懲罰的上限(約為800)。
對未命中查詢進行懲罰的問題在於,首先需要進行查找,以確定是否施加懲罰。但是如果剩餘的gas 不足以支付罰款,已執行了未付費的消耗。即使確實會導致拋出異常,也可以將這些狀態讀取包裝到嵌套調用中,允許外部呼叫者繼續重複攻擊而無需支付(全部) 罰款。
因為這個原因,這個EIP 被放棄了,我們也在尋找更好的替代方案。
在對這些不同機制進行迭代的同時,Vitalik Buterin 提議直接提高gas 成本,並且保留訪問列表。 2020 年8 月,Martin 和Vitalik 開始完善EIP-2929 及配套的EIP-2930。
二級標題
EIP-2929 有效地解決了許多之前的問題。
➤ 與無條件提升gas 成本的EIP-1884 相比,EIP-2929 只提升了未訪問部分的gas 成本。這導致淨成本提升了不足一個百分點。
➤ 加上EIP-2930,不會對任何合約流程造成破壞
2021 年4 月15 日,這兩個EIP 都在Berlin 升級中被激活了。
二級標題
二級標題
開發工作
Peter 在2019 年10 月提出的解決方案是“動態狀態快照” (dynamic state snapshots)。
快照是用於以平面格式存儲以太坊狀態的輔助數據結構,在Geth 節點的實時操作期間,可以完全在線構建。快照的好處在於充當狀態訪問的加速結構:
➤ 無需通過O(log N) 次磁盤讀取(x LevelDB 開銷) 來訪問一個賬戶或存儲插槽,快照可以提供直接的O(1)訪問時間(x LevelDB 開銷)。
➤ 離線狀態修剪
二級標題
總結
總結
➤ 動態快照+快照同步
➤ 通過分片化狀態實現LES (Light Ethereum Subprotocol) 狀態分發
二級標題
二級標題
總結
總結
2021 年的三月到四月,snap/1 協議在geth 客戶端中實現了,使得通過新的基於快照的算法進行同步成為可能。雖然仍不是默認的同步模式,但這是很重要的一個步驟,使快照不僅可用作攻擊防護措施,並且對於用戶來說也是一項重要優化。
在協議方面,柏林昇級於2021 年4 月完成。
以下是在我們的AWS 監控環境中製定的一些基準:
➤ 柏林昇級之後,無快照,25M gas: ~3.1s
二級標題
➤ 柏林昇級之後,有快照,25M gas: ~0.3s
大致的數據顯示柏林昇級能夠將攻擊的效率降低5 倍,快照能夠將其降低10 倍,總計將影響降低了50 倍。
我們估計目前在主網(15M gas),對於未使用快照的geth 節點來說,有可能創建執行時間在2.5-3 秒的區塊。對於非快照節點來說,隨著狀態增長這個數字會持續惡化。
二級標題
原文鏈接:https://blog.ethereum.org/2021/05/18/eth_state_problems/


