以太坊暫緩 Hoodi 測試網分叉,Glamsterdam 燃氣費重新定價打破合約假設
重點速覽
- •在 ChainSecurity 標記的問題解決之前,核心開發者已延後 Glamsterdam 升級的 Hoodi 測試網分叉,且未公布新日期。
- •EIP-8037 和 EIP-8038 大幅調高與狀態相關的燃氣成本,包括全新儲存槽寫入從 22,100 升至 110,020 燃氣,程式碼部署從每位元組 200 升至 1,530 燃氣。
- •失敗的 EIP-7702 委派交易可能公開仍然有效的授權;若委派合約允許任何人呼叫其 setup 函數,攻擊者可能奪取該帳戶的擁有權。
- •分叉前固定的燃氣數量可能變得不足,如今 65,000 燃氣內可完成的轉帳可能需要超過 150,000,最常見於向首次收款地址發送資產時。
- •基金會將這次重新定價定位為在支援基礎吞吐量約三倍提升的效能目標下進一步調升燃氣上限的前提,而即將舉行的開發者會議仍可能調整任一 EIP。

以太坊基金會開發者 Marius van der Wijden 在 11 月 6 日的更新中表示,在資安公司 ChainSecurity 指出的問題解決之前,核心開發者不會對 Hoodi 測試網進行分叉。Hoodi 是以太坊在協議變更進入主網之前進行演練的公開測試網路。他呼籲合約開發者和審計人員對照即將到來的 Glamsterdam 升級所打破的八項燃氣不變式檢查自己的專案。燃氣是以太坊為交易執行的每項操作定價的單位,因此當這些價格變動時,依舊數值編寫的程式碼即使本身未經修改,行為也可能不同。
在此語境下,不變式是指程式碼視為永遠成立的規則——例如「固定燃氣預算足以完成此次呼叫」或「已上鏈的委派已生效」。基金會的不變式儲存庫列出了在 Glamsterdam 下將發生變化的八項假設,並表示目前多數研究結果涉及其中兩項。
兩項提案重塑燃氣成本
兩項提案推動了這次變革。EIP-8037 調高建立新狀態的價格——包括新帳戶、儲存槽和已部署的程式碼——並將其與一般執行分開計量。EIP-8038 則調高讀取和更新既有狀態的價格。根據該儲存庫測試所依據的規範,寫入一個全新的儲存槽從 22,100 燃氣升至 110,020,更新一個已處於熱狀態的既有儲存槽從 2,900 升至 10,100,部署程式碼則從每位元組 200 燃氣升至 1,530。若規範調整,這些數字也會隨之變動。
Glamsterdam 測試暫停之前,ChainSecurity 曾於 10 月 13 日發布審查報告,此前已有報導。該儲存庫在這些研究結果的基礎上,加入了基金會對 Sourcify(合約原始碼的公開登記庫)上已驗證合約的自有掃描,以及讀取交易回執的鏈下軟體等鏈下案例。
交易上鏈不再證明委派已生效
EIP-7702 允許普通以太坊帳戶透過簽署指向委派合約的授權來執行智慧合約程式碼。該機制隨 2025 年的 Pectra 升級上線,是各家錢包陸續推出的智慧帳戶功能的基礎。授權設計上只能使用一次。在 Glamsterdam 之前,其全部成本是預先收取的,因此無法支付的交易無效且永遠不會進入區塊。若交易已上鏈,即代表委派已生效。
儲存庫的 INV-8 條目解釋了 EIP-8037 帶來的變化。現在部分成本取決於帳戶的狀態,且僅在處理授權時收取。從空帳戶進行委派需要 235,606 燃氣,此前為 25,000。按舊數字編列預算的交易可能被接受,在套用授權時耗盡燃氣,並以失敗狀態寫入區塊。委派被回滾,帳戶 nonce(標記授權已使用的計數器)的增加也一併回滾。然而,已簽署的授權如今已公開且仍然有效。
單憑這一點,只會使錢包處於未配置狀態,而非被入侵。危險之處在於委派合約允許任何人呼叫其 setup 函數。攻擊者隨後可以在自己的交易中重新提交該暴露的授權,先呼叫 setup 並將自己指定為帳戶的擁有者。在公開記憶體池中搶先提交授權本來就有可能。儲存庫的重點是,失敗的交易如今本身就會發布有效的授權,因此以私密方式路由不再提供任何保護。該模式已附範例程式碼記錄,且未點名任何受影響的錢包。
實際影響落在錢包、中繼器和索引器身上。儲存庫建議在委派交易之後檢查帳戶的程式碼和 nonce,而不是信任回執。任何失敗的授權都應視為已暴露並予以取消,方式包括推進帳戶的 nonce,或重新委派到安全的合約。一項會預先收取最壞情況成本的規範修改已被提出但尚未採納,開發者被告知應以現行行為維持不變為前提進行開發。
燃氣預算往往位於合約之外
範圍最廣的條目 INV-4 涵蓋所有在分叉前固定的燃氣數量。無論寫在何處,它如今都可能太小:合約程式碼、設定值、簽署訊息或鏈下軟體。最後一類包括代表用戶提交交易的中繼器,以及 keeper 和交易所提款系統。
首次收款地址是最常見的觸發情境。向餘額為零的地址發送代幣會建立新的餘額槽,向空地址發送 ETH 會建立新帳戶,兩者在 EIP-8037 下的定價都高出許多。根據儲存庫,如今 65,000 燃氣內可完成的轉帳,屆時可能需要超過 150,000。
固定數字所在的位置決定了資金缺口的嚴重程度。在鏈下軟體中,整筆交易回滾,可以用更多燃氣重新發送。在合約、其設定或簽署訊息中,則只有內部呼叫失敗。若外部合約捕捉到該失敗,結果往往是無法挽回的:訊息被記錄為失敗、回呼被跳過,或獎勵記帳錯誤。其中有些數字完全無法修改,包括在分叉前簽署的多簽交易、已簽署的中繼交易,以及已在傳輸途中的跨鏈訊息。
INV-7 將同樣的問題延伸到預留的燃氣。Solidity 的 transfer 和 send 函數傳遞固定的 2,300 燃氣,但寫入新儲存槽的接收合約如今需要超過 110,000。在其 receive 函數中包含邏輯的智慧錢包、支付分帳合約和金庫是最明顯的受影響對象。
過去會回滾的失敗路徑如今可能執行完成
ChainSecurity 10 月 13 日的分析解釋了為何某些通過早期審計的保護機制可能停止發揮作用。合約常常捕捉失敗的外部呼叫,以便記錄失敗、跳過某個項目或嘗試備援方案。當有人故意提供過少燃氣時——這種攻擊稱為燃氣不足擾亂攻擊(insufficient gas griefing)——這就變得危險,因為本應可重試的操作會被標記為永久失敗。
合約通常以兩種方式防禦。有些檢查呼叫後剩餘多少燃氣。有些則依賴失敗處理器的成本過高而無法執行完成。Glamsterdam 同時削弱了這兩種防禦。EIP-8037 為燃氣上限超過 16,777,216 的交易提供一個專門的儲備池用於儲存成本,而常規的 gasleft() 檢查看不到這個池。回滾呼叫或清除剛寫入的儲存槽也可能返還已消耗的燃氣。用 ChainSecurity 的話說:「即使合約程式碼未變,過去會回滾的失敗路徑如今也可能執行完成。」
該公司現在建議不要根據呼叫後剩餘的燃氣來推斷失敗原因。其偏好的做法是在可能的情況下讓整個操作回滾,或保留恢復路徑,而不是基於剩餘燃氣做出不可逆轉的決定。
較早的審計無法單獨彌補這一缺口,因為它是依據當時生效的燃氣規則來評判程式碼的。基金會在內部審計之外也聘請了 ChainSecurity 和 Dedaub,但其在 11 月 6 日的文章承認無法審查每個專案,尤其是鏈下程式碼。設計選擇也影響修復方式:儲存為可調整設定的燃氣上限可以直接調高,而寫死為固定常數的燃氣上限可能只剩下重新部署和遷移這一條路。
以太坊為何堅持推進重新定價
基金會支持這項變革的理由在於定價的準確性。其八月指引針對合約開發者指出,狀態操作的燃氣價格上次調整是在 2021 年的 Berlin 分叉,正是該分叉確立了目前讀取狀態時冷熱有別的定價。此後,以太坊的狀態——節點追蹤的帳戶、餘額和合約儲存的持續記錄——已顯著成長,而近期的燃氣上限調升又加速了這一成長。該文章稱,重新定價是進一步調升燃氣上限的前提,並表示新的收費表源自一項效能目標,該目標支援基礎吞吐量約三倍的提升。
同一篇文章報告,以新價格重放歷史主網交易後,絕大多數交易結果不變,且多數被標記的問題可以透過調高燃氣上限解決。文章告知普通用戶無需採取任何行動,因為更新後的錢包和基礎設施會處理這項變化。11 月的研究結果使最後一句話承受更大壓力。應對這項變化如今包括在委派失敗後檢查帳戶狀態,以及為首次收款地址規劃中繼器預算——這些都是舊燃氣規則從未要求的工作。
下一次核心開發者會議將決定什麼
根據儲存庫,基金會正在下一次全核心開發者會議——即以太坊協議變更達成共識的常設論壇——之前收集意見。視反應而定,可能會略微修改 EIP-8037 和 EIP-8038,或維持原樣。在問題解決之前,Hoodi 不會分叉,且 11 月 6 日的文章未給出新日期。同一篇文章指出,Glamsterdam 之後計劃的 Hegota 升級工作仍在並行推進。
Hoodi 分叉之前:誰該檢查什麼
- 合約團隊: 將地址貼入基金會的受影響合約查詢工具,然後審查任何硬編碼燃氣數值或依剩餘燃氣進行分支判斷的程式碼,無論是否被列入清單。
- 錢包和 RPC 供應商: 針對新收費表更新燃氣估算。基金會警告,快取的燃氣常數會低估成本並導致交易失敗。
- 中繼器、keeper 和 bundler: 讓上限可調整,並依新規則加留餘裕重新估算,在儲備池閾值兩側都進行交易測試。
- 審計人員: 儲存庫包含使用 AI 編碼代理執行其檢查的說明,程式碼和結果均保存在本地。
值得關注的訊號包括基金會部落格上公布的 Hoodi 分叉日期、任一 EIP 規範的任何修訂,以及受影響專案確認完成修復。基金會已要求團隊以私密方式將問題回報至 glamsterdam@ethereum.org,而不是在公開議題中提出,以便在細節擴散之前完成修復。
本文最初發表於 Coindoo。