既然 Out of gas 是因為 Gas Limit 設得太低,為什麼錢包不乾脆把預設值設得非常寬鬆,一次性避開這個問題?
這裡有一個常被忽略的取捨:Gas Limit 本身雖然是「上限」,實際扣款是照 Gas Used 來算,理論上設得寬鬆一點不會多付錢——但問題出在部分錢包介面或錢包外掛,會把 Gas Limit 的數字直接拿去做交易是否會成功的初步判斷,如果上限設得極端寬鬆,某些惡意合約反而有機會利用這個空間去執行原本應該被擋下來的複雜邏輯,把使用者的資產轉移到非預期的地方。
更實際的原因是,多數錢包的自動估算機制,是根據近期同類型交易的實際消耗量去抓一個合理區間,這個估算在絕大多數情況下已經足夠準確——真正需要手動調高的情境,通常是網路正在經歷異常壅塞,或是你在跟一個邏輯特別複雜、鮮少被呼叫過的合約互動,這類邊緣情況下自動估算容易失準,此時才需要使用者自己介入調整。
Revert 型的失敗,聽起來合約明明知道這筆交易不該成功,為什麼不能在真正扣 gas 之前就先擋下來?
這個問題的核心在於,「合約知不知道」跟「合約什麼時候才能知道」是兩個不同的時間點。合約邏輯本身,只有在被實際執行到那一行判斷式的時候,才會產生「這筆交易不符合條件」這個結論——在那之前,包含判斷式本身在內的所有前置運算,都得先被跑過一遍,因為判斷條件是否成立,經常需要依賴前面步驟計算出來的中間結果(例如當下的市場價格、當下的帳戶餘額),這些中間結果沒有辦法在交易正式送出前就百分之百預先確定。
這也是為什麼滑點這類牽涉即時市場數據的判斷式特別容易觸發 Revert——你送出交易的那一刻,看到的價格只是「當下」的快照,但這筆交易真正被驗證者排進區塊、實際執行的時間點,可能已經是幾秒甚至更久之後,這段時間差裡價格完全有可能已經變動到超出你原本設定的容忍範圍,而這個超出的事實,只有在合約真正執行到那個判斷點時才會被確認。
如果 Gas 費用不會因為交易失敗而退還,這代表在網路壅塞、Gas Price 特別高的時候,是不是應該完全避免嘗試任何有可能失敗的交易?
這個判斷需要拆成兩層來看。第一層是「失敗機率有多高」:如果你正在做的是一筆邏輯單純、你自己對交易條件有十足把握的操作(例如單純轉帳給一個確定存在且沒有特殊限制的地址),失敗機率本來就低,這種情況下網路壅塞頂多影響的是你要付的手續費金額,跟失敗機率本身沒有直接關聯。真正該提高警覺的,是那些牽涉不確定條件的操作,例如複雜的合約互動、有時間窗口限制的搶購、或是波動劇烈時段的代幣交換。
第二層是「失敗的代價相對你要付的手續費金額划不划算」:在網路壅塞、Gas Price 飆高的時候,就算失敗機率沒有改變,一旦真的失敗,你付出的絕對金額也會比平常更高——這也是為什麼經驗豐富的使用者,通常會選擇在網路壅塞時段,優先處理那些失敗機率低的簡單操作,把牽涉不確定條件、失敗機率較高的複雜操作,留到網路負載較低、Gas Price 相對便宜的時段再進行。
如果我已經送出一筆交易,還在等待確認的過程中,發現自己可能設錯了滑點或參數,有沒有辦法搶在它失敗之前先停損?
在交易還處於待處理(pending)狀態、尚未被驗證者實際打包進區塊之前,多數錢包都提供「加速」或「取消」這兩個選項,其運作原理是送出一筆使用相同帳戶序號(nonce)、但 Gas Price 更高的新交易,利用驗證者傾向優先處理手續費較高交易的誘因,讓這筆新交易搶先被執行,蓋過原本卡住的那一筆。「取消」本質上就是送出一筆內容為「轉帳金額歸零、只轉給自己」的替代交易,一樣需要支付 Gas 費用。
但這個做法有一個重要的前提限制:只要原本那筆交易還沒有被驗證者實際執行,這個操作才有意義;一旦交易已經進入執行階段(即使最終結果是失敗),代表 Gas 已經開始被消耗,這時候送出加速或取消都不會改變已經發生的事實,你能做的,只有在下一次送出交易前,重新確認參數設定是否正確。這也是為什麼交易確認前的等待時間,其實是使用者唯一還有機會介入調整的窗口——一旦進入執行階段,就沒有回頭路。
2026 年 5 月,以太坊網路單月就記錄了超過 120 萬筆失敗交易,這些交易全部產生了 gas fee——最高單筆失敗交易付出的手續費,換算下來超過一萬美元。對第一次遇到這種情況的人來說,這件事直覺上很荒謬:東西沒送到、錢卻被扣了,這在日常生活的匯款或轉帳經驗裡幾乎不會發生。理解為什麼會這樣,得先搞懂一件事:Gas fee 買的從來不是「交易成功」這個結果,而是「有人幫你嘗試執行」這個過程本身。
每一筆送到以太坊網路的交易,都包含兩個關鍵欄位:Gas Limit(你願意為這筆交易支付的計算量上限)跟 Gas Price(每單位計算資源願意付的價格)。驗證者(或早期的礦工)收到交易後,會開始實際執行裡面的每一個運算步驟,每執行一步就消耗一點 Gas——這個過程跟「先看結果、再決定要不要收錢」完全相反,因為在交易真正執行完畢之前,沒有人能預先知道這筆交易到底需要多少計算量。你實際被收取的金額,是「Gas Used(實際消耗的計算量)乘以 Gas Price」,而不是「Gas Limit 乘以 Gas Price」——差別在於,如果交易半路失敗,已經被消耗掉的那部分計算資源依然要付錢,只有還沒被用到的部分才會退還。
以太坊虛擬機(EVM)處理一筆交易的方式,是把交易當成一連串的指令依序執行,每一個指令都會被打包進區塊之前,需要先被驗證者的硬體實際跑過一遍——即使最終結果是「這筆交易應該被拒絕」,驗證者依然得先執行到判定失敗的那一步,才知道要拒絕它。想像成一台自動販賣機:你投了錢、選了商品,如果商品卡住掉不下來,販賣機的機械裝置依然運轉過、耗過電,這筆電費不會因為商品沒掉下來就自動免除。EVM 的邏輯本質上跟這個類似——區塊鏈的安全模型仰賴的正是「每一步計算都必須留下可驗證的紀錄」,就算這筆交易最終沒有改變任何東西,執行到失敗那一刻為止的過程,依然被記錄進了鏈上歷史,也依然佔用了驗證者的真實運算資源。
第一種是「Gas Limit 設得太低」(Out of Gas):使用者或錢包預估的計算量上限,低於這筆交易實際需要的量,執行到一半計算資源就耗盡,交易被迫中止——這種情況下,原本要轉出去的資產不會離開你的錢包,但已經消耗掉的那部分 Gas 費用仍然要付。第二種是「執行條件不成立而被回退」(Revert),這種情況更常見於跟智能合約互動的場景,例如在去中心化交易所進行代幣交換時,如果市場價格波動超過你設定的滑點容忍度、或者合約邏輯判斷這筆交易不符合特定條件(例如額度已被項目方鎖定、或觸發了黑名單機制),合約會主動讓交易失敗並把狀態復原——但復原的是交易的「結果」,不是已經被驗證者執行過的那段計算過程,所以 Gas 費用同樣不會被退還。
在送出任何一筆交易之前,先確認你設定的 Gas Limit 是否合理——多數錢包會根據近期類似交易自動估算,但在網路壅塞或跟複雜合約互動時,這個估算值可能偏低,遇到不確定的情境,寧可把上限設得寬鬆一些,避免因為 Out of Gas 白白付一筆錢卻什麼都沒換到。進行代幣交換這類容易受滑點影響的操作時,適度收緊滑點容忍度雖然能降低被套利機器人夾單的風險,但也代表交易更容易因為條件不成立而 Revert 失敗,這兩者之間本身就是一個需要根據當下市場波動程度動態調整的取捨,不存在一個永遠正確的設定值。