來源|EthereumBlog
作者|?MartinHolstSwende&PeterSzilagyi
MartinHolstSwende及PeterSzilagyi于2021年5月18日發布
本篇博文的目的在于正式揭露以太坊平臺在柏林硬分叉之前的一個嚴重且顯而易見的問題。
State狀態
我們先從以太坊和及其“狀態”的背景開始梳理。
以太坊的狀態由patricia-merkletrie組成,一種前綴樹。本文不會深入技術細節,簡單來說隨著狀態增長,樹的分支會越來越密集。每個加入的賬戶都是一片新葉子。在樹根之間和葉子之間,存在大量的“中間”節點。
為了查找某個特定賬戶,或是說這顆巨樹中的一片“葉子”,從樹根再通過中間節點,需要按序解決6-9個哈希才能最終對我們所尋找的數據進行哈希計算。
簡而言之,每執行一次查找賬戶的trie查詢,都要執行8-9個解析操作。每次解析操作都是一次數據庫查詢,而每次數據庫查詢都可能是任意數量的實際磁盤操作。磁盤操作的數量難以預估,但是由于trie密鑰是加密哈希(抗沖突),因此密鑰是“隨機的”,這對任何數據庫來說都是最糟糕的情況。
隨著以太坊的發展,一直以來都有必要提高樹訪問操作的gas費用。2016年10月,在經歷了“上海攻擊”時間之后,以太坊網絡在區塊高度?2,463,000?進行了TangerineWhistle?硬分叉,其中包含EIP150,大舉提升了某些操作的gas成本,并引入了大量更改以防御DoS攻擊。
Gemini添加XRP Ledger作為其第13個支持的區塊鏈:金色財經報道,Tyler 和 Cameron Wiklevoss 的加密貨幣交易所 Gemini 增加了對區塊鏈 XRP Ledger 的支持,該區塊鏈成為交易所支持的第13個網絡。在開放英鎊、歐元、加元、澳元、港元和新加坡元交易對之前,用戶很快就可以使用美元進行 Ripple (XRP) 交易。
Gemini 上支持的其他區塊鏈包括比特幣、以太坊、Solana、萊特幣、比特幣現金、Polkadot、Avalanche、Cosmos、Zcash、Filecoin、Dogecoin 和 Tezos。[2023/8/11 16:19:10]
另一次對gas費用的提升是在2019年12月的Istanbul?升級中,激活了EIP1884。
EIP-1884針對gas費用引入了以下改動:
?SLOAD?從?200?提升至?800?gas
?BALANCE?從?400?提升至?700?gas(并添加了一個更便宜的?SELFBALANCE)
?EXTCODEHASH?從?400?提升至?700?gas
出現的問題
2019年3月,MartinSwende當時在進行一些EVM操作碼性能的測定。之后的EIP-1884就是基于該調查而成的。在EIP-1884被激活的前幾個月,BrokenMetre發布了這篇論文(2019/9)。
數據:5月美元穩定幣USDT市場份額繼續上漲至68.2%:金色財經報道,據The Block Pro數據顯示美元穩定幣USDT市場份額則繼續上漲并升至68.2%,供應量達到835億美元并創下新高,而USDC的市場份額進一步下跌至22.2%。五月調整后的穩定幣鏈上交易額下降至4646億美元,跌幅約為4.2%;已發行穩定幣供應量繼續收縮至1224億美元,降幅約為1.4%。此外比特幣和以太坊調整后鏈上總交易額繼續下降,下降幅度為5.3%,跌至1960億美元,其中比特幣鏈上交易額下降13.3%,但以太坊鏈上交易額小幅上漲3.2%。[2023/6/5 21:16:16]
兩位以太坊安全研究員,HubertRitzdorf和MatthiasEgli,與論文的作者之一DanielPerez將一個漏洞“武器化”,提交給了以太坊的漏洞賞金(bugbounty)項目。這是在2019年10月4日。
建議大家閱讀這份他們提交的完整文檔,寫得很詳盡。
同日,在一個專門用于討論跨客戶端安全性的頻道中,來自Geth、Parity和Aleth的開發者都得知了這份文檔。
這個漏洞的本質在于觸發隨機的trie查詢。以下是一個簡單的示例:
在其報告中,研究員們通過?eth_call?對同步了主網的節點執行了這個payload,以下是他們執行過程中的數據,耗費了一千萬gas:
ETHStorage創始人Qi Zhou:一旦L2等技術相對成熟,相信比特幣也會采用這些技術:金色財經報道,在由比特大陸聯合金色財經舉辦的《比特幣誕生14周年》主題活動上,ETHStorage創始人Qi Zhou表示,據我的觀察,往往一個鏈時間越長,市值越高,這個鏈對新的技術、對新的一些應用的支持的話會非常謹慎,比如以太坊早期加入一些功能是相對容易很多的,后面的話隨著以太坊的市值增長和應用不斷成熟,再加入新的功能和應用比如L2等會花很多時間。
在去中心化方面比特幣還是有著比較大的統治地位,在應用上像以太坊的分叉是非常頻繁的,以太坊歷史上秘密修理了很多bug,曾經遭到比特幣社區的批評不夠去中心化,中本聰的離開等信號標志著比特幣是完全去中心化驅動,不僅是節點運營,包括整個開發流程沒有人去能夠中心化控制,這樣導致比特幣采用新技術,會有一些困難性,一旦L2等技術相對成熟,相信比特幣也會采用這些技術,解決更復雜的問題,比特幣還會有非常大的升值空間。[2023/1/3 9:50:03]
??消耗一千萬gas的?EXTCODEHASH?(400gas)
Parity:?~90s
Geth:?~70s
??消耗一千萬gas的?EXTCODEHASH?(700gas)
Parity:?~50s
Geth:?~38s
SBF致股東信:將盡其所能保護客戶資產和股東投資:11月9日消息,SBF向投資者發送了一封信,對投資者表示抱歉。他表示,已經與幣安達成了購買FTX的非約束性協議。公司的首要任務是保護客戶和行業,股東則為第二優先事項。未來將會提供更多細節和事件回顧。SBF還表示將盡其所能保護客戶資產和股東投資。[2022/11/9 12:35:49]
顯而易見,EIP-1884的更改確實在降低該攻擊的影響上起到了幫助,但還遠遠不夠。
當時已經臨近在大阪的開發者大會。在開發者大會上,這個問題的信息分享給了主網的客戶端開發者。我們也和Hubert、Mathias以及GregMarkou(來自Chainsafe,當時也在進行一些ETC的工作)見面了。ETC的開發者也收到了這份報告。
隨著2019年臨近尾聲,我們知道這個問題比之前預期的要嚴重,惡意交易可能將區塊時間提升到分鐘范圍。更糟的是,開發者社區對EIP-1884感到不滿,因為EIP-1884破壞了一些合約流程,而且用戶和礦工都非常希望提高區塊的gaslimit。
此外,僅兩個月后的2019年12月,ParityEthereum宣布停止運維,而OpenEthereum接管了代碼庫的維護工作。
隨后搭建了一個新的客戶端協調頻道,Geth、Nethermind、OpenEthereum和Besu的開發者在此繼續進行協作。
CoinShares推出Twitter機器人來評估NFT的價值:金色財經報道,區加密資產管理公司CoinShares推出了一個Twitter機器人來評估NFT的價值。該機器人將跟蹤NFT的炒作和稀有性,以判斷其公允價值。Twitter 用戶現在可以使用 NFT 的 OpenSea 鏈接和主題標簽 CoinShares 的鏈接向該機器人發送推文。然后,機器人會在一分鐘內回復公平價格。?
該公司指出,為 NFT 定價可能很困難,因為某些屬性很容易量化,而另一些屬性可能更抽象。盡管如此,它還是確定了諸如炒作、稀有性、對獨家社區、 內容和產品的訪問權限以及交易量和歷史等因素。?[2022/10/14 14:27:13]
解決方案
我們意識到要解決這個問題,必須要雙管齊下。一種方法是通過以太坊協議以某種方式在協議層解決該問題。最好不要破壞合約,并且避免波及“良好”行為,但仍要設法防止攻擊。
第二種方式是通過軟件工程來解決,修改客戶端中的數據模型和結構。
協議層的工作
關于如何處理這些類型的攻擊的第一個版本在這里。2020年2月,正式發布為EIP2583。其理念是,每當一次Trie查找導致未命中時,施加一次罰款。
但是,Peter找到了應對方法,即“shieldedrelay”攻擊,可以有效地限制這種懲罰的上限(約為800)。
對未命中查詢進行懲罰的問題在于,首先需要進行查找,以確定是否施加懲罰。但是如果剩余的gas不足以支付罰款,已執行了未付費的消耗。即使確實會導致拋出異常,也可以將這些狀態讀取包裝到嵌套調用中,允許外部呼叫者繼續重復攻擊而無需支付(全部)罰款。
因為這個原因,這個EIP被放棄了,我們也在尋找更好的替代方案。
??AlexeyAkhunov提出了?Oil?的概念,gas的第二來源,但和?gas?在本質上不一樣,因為它對執行層不可見,并可能導致事務全局回滾。
??Martin在2020年5月也撰寫了一個類似的提案(GasAndKarma)
在對這些不同機制進行迭代的同時,VitalikButerin提議直接提高gas成本,并且保留訪問列表。2020年8月,Martin和Vitalik開始完善EIP-2929及配套的EIP-2930。
EIP-2929有效地解決了許多之前的問題。
??與無條件提升gas成本的EIP-1884相比,EIP-2929只提升了未訪問部分的gas成本。這導致凈成本提升了不足一個百分點。
??加上EIP-2930,不會對任何合約流程造成破壞
??并且能夠在不造成破壞的前提下進一步調整gas成本
2021年4月15日,這兩個EIP都在?Berlin?升級中被激活了。
開發工作
Peter在2019年10月提出的解決方案是“動態狀態快照”(dynamicstatesnapshots)。
快照是用于以平面格式存儲以太坊狀態的輔助數據結構,在Geth節點的實時操作期間,可以完全在線構建。快照的好處在于充當狀態訪問的加速結構:
??無需通過?O(logN)?次磁盤讀取(x?LevelDB開銷)來訪問一個賬戶或存儲插槽,快照可以提供直接的?O(1)訪問時間(x?LevelDB開銷)。
??快照支持每項條目以?O(1)?復雜度迭代賬戶和存儲,這使遠程節點能夠以比以前便宜得多的方式檢索順序狀態數據。
??快照還啟用了更多奇特的用例,例如離線修剪狀態Trie或遷移到其他數據格式。
快照的缺點在于原始帳戶和存儲數據實際上是重復的。對于主網來說這意味著將占用額外的?25GB?SSD空間。
動態快照的概念從2019年中就已經發軔,起初的目的主要是推動快照同步的實現。當時Geth團隊在忙于許多“大項目”。
??離線狀態修剪
??動態快照快照同步
??通過分片化狀態實現LES(LightEthereumSubprotocol)狀態分發
然而,最終決定將快照的優先級排到最前,將其他項目暫時擱置。這為后來的?snap/1?同步算法奠定了基礎,并于2020年3月合并。
隨著“動態快照”功能的發布,我們有了一些喘息的空間。如果以太坊網絡受到攻擊,那將是痛苦的,是的,但是至少有可能通知用戶啟用快照。完整生成快照將花費大量時間,并且當時尚無法同步快照,但是網絡至少可以繼續運行。
總結
2021年的三月到四月,snap/1?協議在geth客戶端中實現了,使得通過新的基于快照的算法進行同步成為可能。雖然仍不是默認的同步模式,但這是很重要的一個步驟,使快照不僅可用作攻擊防護措施,并且對于用戶來說也是一項重要優化。
在協議方面,柏林升級于2021年4月完成。
以下是在我們的AWS監控環境中制定的一些基準:
??柏林升級之前,無快照,25M?gas:?14.3s
??柏林升級之前,有快照,25M?gas:?1.5s
??柏林升級之后,無快照,25M?gas:?~3.1s
??柏林升級之后,有快照,25M?gas:?~0.3s
大致的數據顯示柏林升級能夠將攻擊的效率降低?5?倍,快照能夠將其降低?10?倍,總計將影響降低了?50?倍。
我們估計目前在主網(15Mgas),對于未使用快照的?geth?節點來說,有可能創建執行時間在?2.5-3?秒的區塊。對于非快照節點來說,隨著狀態增長這個數字會持續惡化。
如果通過gas退還來增加區塊內的有效gas使用量,則可能會進一步加劇為(最大)2倍。隨著EIP1559的實施,區塊的gaslimit的彈性會更大,并且在臨時爆發中會再增加2倍。
至于實施這種攻擊的可行性,攻擊者購買一整個區塊的成本約為幾個ETH(100Gwei?時?15M?gas為1.5?ETH)。
為什么現在公布?
這個風險其實一直以來都是一個“公開的秘密”,已經不止一次被意外公開披露,并且在核心開發者會議中多次被提及,但并未涉及細節。
現在既然已經實施了柏林升級,geth的節點也在默認情況下使用快照同步,因此我們估計現在的威脅性已經非常低了,現在是時候對幕后工作進行全面公開了。
重要的是,讓社區有機會了解一些變更背后的原因,而這些變更會對用戶體驗造成負面影響,例如gas成本增加和限制gas返還。
本文由MartinHolstSwende和PeterSzilagyi在2021-04-23寫就。并于2021-04-26與基于以太坊的項目進行分享,2021-05-18公開發布。
原文鏈接:https://blog.ethereum.org/2021/05/18/eth_state_problems/
尊敬的用戶: 幣虎將上線DoveSwapToken,并在DeFi專區開通DOVE/USDT交易市場.
1900/1/1 0:00:00尊敬的用戶: WBF即將在DEFI板塊上線WTML/USDT交易對,具體上線時間為:充值時間:2021年6月3日18:00交易時間:2021年6月3日18:00提幣時間:2021年6月3日18:.
1900/1/1 0:00:00BTC行情分析: 比特幣昨日多次沖高受阻于38800一線附近,上方壓力強勢,多次承壓,下方35000支撐也比較強勢.
1900/1/1 0:00:00親愛的用戶: DigiFinex將于2021年5月24日16:00(GMT8)開啟“CRS交易大賽,參與交易贏取10個NFT唱片50萬CRS大獎”的活動.
1900/1/1 0:00:00上幣申請條件: 為了保護投資者的利益,HKEx.one會對資產進行評估,所有上線交易的品種需要滿足如下條件.
1900/1/1 0:00:00為了慶祝MahaDAO(MAHA)在庫幣重磅上線,庫幣將和MahaDAO團隊將提供總計$20,000美金等值MAHA和價值45,000美金的寶馬330i作為上線福利.
1900/1/1 0:00:00