Alex Stokes@ralexstokes:
你可能已經聽說了,@OpenEthereum 客戶端的一個錯誤導致了一些支撐以太坊網絡的重要服務宕機。
我們來琢磨一下那筆造成事故的交易。
首先,我想感謝所有快速反應到事故并解決了問題的工程師:
https://twitter.com/OpenEthereumOrg/status/1382719444833726470?s=20…
另外,我沒有自己跟蹤所有的細節,下文中的重要事實都由用戶 eb 在 Eth R&D discord 服務器里提出。
先從那筆觸發了錯誤的交易開始:
https://etherscan.io/tx/0x7006f38fa2e6654fae1a781aefc5885fe0cb8f778b1add10636eaf7e34279247
0xScope:某地址在Base上部署了29個Meme并全部Rug Pull:7月31日消息,據0xScope監測,某地址在Base上部署了29個Meme并全部Rug Pull,該地址最初向Base轉入了55.5枚ETH,價值10.3萬美元,現錢包資產共計107萬美元。[2023/7/31 16:09:26]
這是一筆合約調用交易,從 KuCoin 交易所發出,向許多地址分發 ETH。對該筆交易的 call data 的 ABI 編碼錯誤,最終導致了鏈分裂。你可以在 Etherscan 上看看這筆交易的 “Input Data”。
在合約中調用 sendEths 時,需要提供兩個參數:一個是關于目標地址的不定長數組(dynamically sized array);一個是關于轉賬數額(以 wei 為單位)的不定長數組;兩者相搭配才知道要轉移多少錢給哪個地址。
加密基礎設施初創公司Openfort完成300萬美元種子輪融資:金色財經報道,加密基礎設施初創公司Openfort完成 300 萬美元的種子輪融資,用于為游戲開發商和發行商開發其“錢包即服務”軟件產品,該輪融資由 Gumi Cryptos Capital 和 Maven 11 共同領投。Game7、NGC Ventures、紐曼資本也參與了此輪融資。?
Openfort 希望為視頻游戲工作室提供該公司所稱的“無摩擦”錢包技術,該技術由多個 API 組成,這些 API 與瀏覽器游戲以及在 Unity 和虛幻引擎 5 中構建的 PC 游戲兼容。該公司還在構建一個選項,也支持手機游戲。?[2023/5/23 15:19:28]
我們可以解析 call data 來看看到底哪里出了錯:第一行(在 Etherscan 上標記為 ?“”)表示地址列表從字節 64(行 “”)開始。第二行表示轉移數額的列表從字節 416(行 “”)開始。
交易聚合協議OpenOcean已拓展到Fantom網絡:10月11日消息,據官方消息,交易聚合協議OpenOcean已拓展到Fantom網絡。據悉,OpenOcean已將Fantom添加至其網絡列表中,同時還將與基于Fantom的DeFi項目連接,包括SushiSwap、SpiritSwap、SpookySwap和Curve等。[2021/10/11 20:19:49]
?因此,大體上,我們是希望成對成對地、從上往下、向某個地址發送一定數量的 ETH —— 看起來很直接嘛。
然而,當我們開始遍歷這個列表,我們先跳轉到 call data 的正確字節,而 Solidity ABI 聲明了數據的第一個字是整個不定長數組的長度。
這就是最終 bug 的根源:因為 call dada 中的值是 “0x10”(注意,這可是 16 進制!),但是 call data 只給出了 10 個 ?地址-數值對。對這個 call data 的正確 ABI 編碼(填在行 和行 的)應該是 “0xA” —— 不是 “0x10”!
交易聚合協議OpenOcean已連接到Polygon:加密貨幣交易聚合協議OpenOcean 在與用戶討論后已連接到Polygon區塊鏈。OpenOcean將在未來幾周內提供多達10萬枚OOE代幣,以鼓勵在Polygon上進行交易。(Coindesk)[2021/7/9 0:39:51]
你可能已經猜到了那時候會發生什么事,我們可以通過執行情況跟蹤器(execution trace)來看看:
https://etherscan.io/vmtrace?txhash=0x7006f38fa2e6654fae1a781aefc5885fe0cb8f778b1add10636eaf7e34279247&type=parity
合約成功地遍歷了前 10 個地址。本來合約應該在此時停止執行,但根據 call data 的聲明,還有很多個地址!那就繼續執行吧。
動態 | 日本區塊鏈創企Chaintope推出基于區塊鏈的電力交易系統:據Prtimes消息,日本區塊鏈研發初創企業Chaintope推出了一款面向電力行業的區塊鏈電力交易系統,該系統名為Electrowise。[2019/2/3]
但是,根據 call data 的結構,“第 11 個地址” 是用于編碼列表長度的 0x10,所以合約就嘗試發送 0 ETH 到地址 0x10。
此外,似乎,當合約嘗試讀取并不存在的 call data 時,會返回 0 ETH —— 你可以想象成合約在這里跑出了一個錯誤,但它卻繼續發送 0 ETH 到它從 call data 中讀取的另外 6 個 “地址”。
此時,你可能會注意到,0x10 有可能是我們所謂的 “特殊地址” 之一,它完全在 EVM 預編譯合約的范圍內(所謂 “預編譯合約”,就是一類特殊合約,在 EVM 之外有最優的實現,但是編譯起來與大多數合約一樣)。
而我們也并不期望預編譯合約 0x10 能夠返回 ETH 。如此,它就成了一個 ETH 黑洞。但是,這也并不必然造成任何問題。到底是什么導致了整個客戶端崩潰?
原因在于,0x10 實際上是一個由 EIP-2537 斷言的預編譯合約,是為 BLS 配對密碼學程序而設的,但這個 EIP 還未部署到主網上。所以雖然你能夠跟這個地址互動,但主網上的這個地址里沒有任何合約,不會有任何進一步的動作。
此外,我們還需要一個事實來解釋這次分裂,你可能也猜到了,就是 “柏林” 硬分叉(也正是這次硬分叉使這個問題浮出水面):它改變了 EVM 中 Gas 消耗量的計量方法。
在 EIP-2929 實施后,如果你在一筆交易中對同一個存儲槽多次執行狀態存儲操作,第一次執行會消耗更多 Gas,后續執行的消耗會更少。這種重定價理論上能更準確地反映當前的客戶端訪問存儲項的成本 ……
而且,要知道,在所有客戶端的執行中,這些數據通常都換存在更便宜的硬件層中。
現在我們終于找到了 OpenEthereum 在區塊 #12244294 處發生的 Bug:該客戶端包含了 所有 已實現的預編譯,作為 EIP-2929 訪問清單的一部分。(譯者注:此處應為 “EIP-2930”)
因為 EIP-2537 在大部分客戶端中都已經實現就緒了(而且一度有人提議要把它包含在 “柏林” 升級里面!),OpenEthereum 對所有訪問了 0x10 的交易都給了 gas 折扣。
但網絡的絕大部分活躍客戶端都不是這樣實現 EIP-2929 的,它們只會給訪問了已激活預編譯合約的交易提供 gas 折扣 —— 而 EIP-2537 屬于還未激活的預編譯合約!所以,OpenEthereum 客戶端對該交易消耗了多少 Gas 的計算與網絡中其他客戶端發生了分歧。
所幸,@mhswende 很快找出了該 bug,而 @sorpaas 出力修復了該 bug:https://github.com/openethereum/openethereum/pull/364
還有很多東西可說,我也預期會有比我更能觀察到全貌人來撰寫更好的時候報告。
我能說的只是,這個 bug 彰顯了硬分叉的內在風險,以及持續致力于建設更有彈性的基礎設施的重要性。
依賴于 OpenEthereum 客戶端的單客戶端系統在今天停機了一段時間,因為客戶端無法在問題區塊出現后與網絡保持同步。Etherscan 自身也因此停機。
慶幸的是,這個 bug 沒有嚴重到導致重大的鏈分叉,但這樣的可能性并不是不存在。我們可以利用多客戶端實現來提升抗性 —— 多客戶端本身就是我們以太坊生態的一大長處 —— 并推動您的基礎設施提供商也這樣做。
我們已經看到,2021 年的普及速度已經前所未有地快,而且前景非常光明。我們要從這個事故中吸取教訓,一起打造更好的以太坊。
DeFi流動性挖礦火爆一時,為了方便投資者及時了解DeFi挖礦項目的相關信息和挖礦流程,金色財經推出了“金色說明書”系列挖礦教程.
1900/1/1 0:00:00文章系金色財經專欄作者幣圈北冥供稿,發表言論僅代表其個人觀點,僅供學習交流!金色盤面不會主動提供任何交易指導,亦不會收取任何費用指導交易,請讀者仔細甄別防上當.
1900/1/1 0:00:00央行數字貨幣的新起點 2020年10月,國際清算銀行與美聯儲、歐央行等七家中央銀行聯合成立的央行數字貨幣(Central Bank Digital Currencies.
1900/1/1 0:00:00什么是 Web 3.0 呢?用一句話來說,Web 3.0 是更加以用戶為中心、專注于使事情更加人性化的、透明的、安全的互聯網.
1900/1/1 0:00:00原標題:《Meme打敗基本面?》市場不再由基本面推動,而是由Meme驅動。什么是Meme?Meme指的是一個不斷變得流行起來的想法、行為或風格,通過人與人之間的相互模仿進行傳播.
1900/1/1 0:00:00原標題:《價格發現的藝術,嵌套的策展市場,當聯合曲線遇到NFT》 前言: 在傳統的框架中,有三種力量主導著資源分配,市場,政府和第三部門(道德、宗教、非營利組織).
1900/1/1 0:00:00