Bible Network Crypto DeFi Onchain RWA AI Agent Stablecoin Chain SAFU CryptoTax DeFAI AGI Claude Me Claude Skill Claude Design Claude Cowork
獨立知識媒體
與任何項目無關聯
區塊鏈底層技術,徹底拆解每一個環節
chain-bible.com
最新
為什麼搜尋同一個代幣名字,會跳出好幾個不同的合約地址?  ·  區塊瀏覽器不是只能查餘額,這幾個欄位才是真正該看懂的地方  ·  清空智能合約的儲存能拿到 Gas 退款?這個機制曾經被玩到走鐘  ·  IBC、Wormhole、LayerZero 都叫「互操作協議」,但驗證的邏輯完全不是同一回事  ·  跨鏈橋出事的從來不是密碼學,而是「誰在幫你確認這筆跨鏈交易是真的」  ·  同樣顯示「USDC」,鏈上看到的可能是完全不同的兩種資產
scaling

清空智能合約的儲存能拿到 Gas 退款?這個機制曾經被玩到走鐘

30 秒速讀
清空儲存曾經能換到大額退款,直到有人發現「先寫入、再清空」能穩定套利——這也是為什麼今天的退款只剩零頭,而且還設了上限。

完整解析 +
01 · 為什麼發生?

現在的 4,800 gas 退款,對一般使用者操作智能合約有實際感受得到的影響嗎?

對一般使用者而言,這筆退款的實際感受通常很有限——4,800 gas 相對於一筆完整交易的總消耗量(可能是數萬到數十萬 gas),只是一個相對小的折抵,加上退款金額還受到「不超過總消耗量五分之一」這個上限限制,實務上,使用者不太會特別因為某個操作觸發了清空退款,就感覺手續費明顯變便宜。

這筆退款現在比較像是一個技術層面的計算細節,而不是使用者體驗層面會主動感知到的變化——真正會關注這個機制的,主要是智能合約開發者,他們在設計合約邏輯時,可能會考慮是否要主動清空不再需要的儲存位置,來爭取這筆相對小額的退款,作為整體 gas 優化的其中一環,而不是單一決定性因素。

02 · 運作原理是什麼?

SELFDESTRUCT 這個操作既然大部分功能已經名存實亡,開發者現在還會用它嗎?

在 EIP-6780 之後,SELFDESTRUCT 在絕大多數情況下已經失去了原本「清除合約程式碼」的核心作用,只剩下轉出合約餘額這個功能,這代表過去依賴這個操作來做合約「升級」(部署新合約、銷毀舊合約、把資產轉移過去)的設計模式,已經不再適用,需要改用其他架構(例如可升級合約模式)來達成類似目的。

目前這個操作還保有效果的唯一情境,是「合約部署與自我銷毀發生在同一筆交易裡」——這個情境比較常見於某些特殊用途,例如透過工廠合約臨時建立、使用完立刻銷毀的一次性合約,這類特殊架構仍然可能用到 SELFDESTRUCT 原本的完整效果,但這已經是相對少數、特定情境下的用法,不是一般智能合約開發的常態工具。

03 · 如何應用

除了 GasToken,還有其他因為退款機制而衍生出的意外副作用嗎?

除了 GasToken 這類直接套利的操作,退款機制的存在也讓區塊的實際 gas 使用量計算變得更複雜——因為一筆交易最終消耗的 gas,要先計算總使用量,再扣除符合條件的退款,才是實際扣款金額,這代表區塊產出者在打包交易、估算一個區塊還能容納多少交易時,不能只看交易宣稱的 gas 上限,還要考慮退款可能造成的實際消耗低於預期,這種不確定性讓區塊容量規劃變得比單純加總 gas 上限更複雜。

這也是 EIP-3529 除了防堵 GasToken 套利之外,另一個重要的設計考量——透過設定退款上限,同時也降低了這種計算複雜度,讓區塊容量的預估更貼近實際情況,是這次升級同時解決兩個問題的一石二鳥設計。

04 · 我該怎麼做?

了解這段歷史,對評估一個新協議的經濟誘因設計有什麼幫助?

這個案例最有價值的地方,不在於記住「4,800 gas」這個具體數字,而在於它示範了一種評估任何經濟誘因設計時該有的思考習慣:一個看起來立意良善的獎勵機制(鼓勵清理儲存,對網路有益),如果沒有充分考慮到「使用者會不會為了套利而反過來操縱這個機制」,很可能會在實際運作後被證明適得其反——GasToken 的出現,不是因為使用者惡意破壞系統,而是完全理性地在既有規則下,找到了對自己最有利的操作方式,這正是機制設計最難預料、卻最常真實發生的情況。

評估任何新協議、新代幣的經濟模型時,除了看這個誘因「原本想達成什麼目標」,更該問「如果有理性、追求自身利益最大化的參與者,會怎麼利用這個規則,做出設計者沒預料到的操作」,這種反向壓力測試的思考方式,是 Gas 退款機制的歷史留給後續協議設計最實用的一課。

完整內容 +

如果你聽過「刪除資料反而能拿到手續費退款」這種說法,這在 Ethereum 上確實曾經是真的——但這個機制的完整故事,其實是一個「立意良善的經濟誘因,最終被市場玩到必須大幅削弱」的具體案例,理解這個機制現在剩下什麼、為什麼被削弱,能幫助你更準確地判斷智能合約開發或互動時的實際成本。

退款機制原本想解決什麼問題

每個在鏈上寫入資料的動作(也就是 SSTORE 這個底層操作),都會佔用全網節點永久需要儲存的空間,隨著越來越多智能合約累積越來越多資料,全網儲存需求(稱為「狀態」)會持續膨脹,這對節點營運方是一項長期負擔。設計者當初的想法是,如果能鼓勵開發者主動清空不再需要的資料(例如把某個儲存位置的值設回零),對整個網路是件好事,值得用手續費退款來獎勵這個行為。

這個邏輯本身合理:把一個非零的儲存位置清空歸零,理論上能讓這筆資料從節點的儲存需求中被釋放,網路整體因此受益,用退款回饋執行清空動作的人,是一種標準的經濟誘因設計。

退款機制怎麼被玩壞的

問題在於,退款機制被拿來做了設計者沒預料到的操作——最典型的案例是 GasToken 這類專案:使用者在網路壅塞程度低、手續費便宜的時候,故意寫入資料到儲存位置(把費用相對低廉的手續費「存」起來),等到網路壅塞、手續費昂貴的時候,再把這些儲存位置清空,觸發退款,相當於用今天的便宜手續費,換取未來昂貴時段的部分折抵。這個做法對個別使用者確實划算,但對整個網路而言,卻造成了反效果:退款機制原本是為了鼓勵「減少狀態膨脹」,但 GasToken 這類操作反而是先主動增加狀態(寫入),只是為了之後套利退款,整體上並沒有真正減少網路的儲存負擔,反而讓區塊的實際可用交易空間因為退款計算方式的緣故,變得更難預測。

除此之外,另一個經典手法是搭配 SELFDESTRUCT(一個能讓合約自我銷毀、把剩餘資產轉出的操作),原本這個操作也附帶退款,被拿來跟 SSTORE 清空退款疊加使用,進一步放大套利空間。

兩次升級,退款機制被大幅削弱

2021 年 8 月透過倫敦升級啟用的 EIP-3529,直接動了兩刀:完全移除 SELFDESTRUCT 的退款、把 SSTORE 清空儲存位置的退款金額從原本的 15,000 gas 大幅降到 4,800 gas,同時把單筆交易能拿到的退款總額,設定了嚴格上限(不能超過這筆交易總消耗量的五分之一),從根本上壓縮了套利空間,讓 GasToken 這類操作不再划算。

2024 年 3 月 Dencun 升級進一步透過 EIP-6780,把 SELFDESTRUCT 這個操作的效果限縮到近乎失效——現在只有在「合約部署,跟自我銷毀,發生在同一筆交易裡」這個極窄的情況下,才會真正清除合約程式碼與儲存,其他情況下呼叫 SELFDESTRUCT,只會把合約的餘額轉出,不再有清除儲存、也不再有退款,等於這個操作原本的核心功能已經名存實亡。

這跟你的錢有什麼關係

如果你是開發者或正在評估某個智能合約的實際 Gas 成本,現在的退款機制已經跟早期的預期差距很大——清空儲存位置確實仍然能拿到一筆較小的退款(目前是 4,800 gas),但這筆退款不該被當成能大幅折抵整體操作成本的主要考量,退款上限的存在也代表你無法透過堆疊大量清空操作來無限放大退款效果。如果你看到某個舊教學或舊文章提到「清空資料能拿到大額退款」或「透過 SELFDESTRUCT 節省手續費」,要意識到這些內容很可能是 2021 年或更早的資訊,實際規則早已改變——查證任何跟 Gas 成本計算相關的資訊時,先確認這份資料是哪個時間點寫的,是評估智能合約開發成本時容易被忽略、卻很重要的一步。

圖解
Gas 退款機制的演變:從被套利到被大幅削弱以時間軸呈現原始設計、GasToken 套利模式、EIP-3529 削弱退款、EIP-6780 進一步限縮 SELFDESTRUCT 四個階段的具體數字變化Gas Refund: A Timeline of Getting Gamed and Reined InOriginal DesignSSTORE clear:15,000 gasSELFDESTRUCT:24,000 gasGamed by GasToken:store cheap, clearexpensive for arbitrageEIP-3529 (2021)SSTORE clear:4,800 gasSELFDESTRUCT refund:removedRefund cap added:max 1/5 of gas usedEIP-6780 (2024)SELFDESTRUCT onlyclears storage if deploy+ destroy = same txOtherwise: only balancetransfer, no clear, no refundChain Bible · chain-bible.com
歡迎截圖分享,轉載請註明來源
提問
請至少輸入 10 個字
相關詞彙
相關文章
區塊瀏覽器不是只能查餘額,這幾個欄位才是真正該看懂的地方
fundamentals · 08/19
測試網是什麼:一個可以隨便搞砸、卻沒人會真的賠錢的區塊鏈
beginners · 08/17
送出交易後顯示「Pending」,這段時間你的錢到底在哪裡?
fundamentals · 08/17
自己跑一個驗證者節點,划算嗎?先算完這幾筆帳再決定
fundamentals · 08/17
更多相關主題