# 燃料(Gas)與手續費(Fee)
在昨天討論交易(Transaction)的時候,想必最後的三個欄位「燃料單位上限(GasLimit)」、「每單位燃料的優先價格上限(MaxPriorityFeePerGas)」、「每單位燃料的價格上限(MaxFeePerGas)」讓大家覺得很困惑吧。
今天就讓我們來介紹燃料(Gas)與手續費(Fee)的機制。
# 燃料(Gas)
在以太坊(Ethereum)上的所有交易實際上都是在「執行特定的操作」,對狀態進行改變(如:帳戶餘額的轉移、部署新合約、與合約互動等)。而進行這些操作自然就會對節點與網路產生「運算資源的消耗」。
基於使用者付費的原則,發起交易的帳戶便需要為了這些「運算資源」來支付手續費。
燃料(Gas)便是一種用來表達「被消耗的運算資源」的單位。
或許你會有個疑問,在電腦或手機上執行軟體,不是都通過消耗的電(瓦特*小時)、或者佔用的運算資源(佔用 CPU 多少執行時間、使用多少記憶體等)來進行計費嗎?為什麼到了以太坊上變成一個奇怪的單位。 這是因為節點並不是執行在「完全相同型號的機器上」,任何人只要滿足運行節點的最低標準需求,便可以在任何的電腦設備(包含但不限於:桌上型電腦、筆記型電腦、開發版、迷你電腦、手機等)上運行。因此幾乎不可能通過硬體規格來進行消耗運算資源的估價。
為了解決這個問題,以太坊設計了以太坊虛擬機(Ethereum Virtual Machine,簡稱 EVM),將所有運算資源抽象化,對每一種指令的操作都明定價碼,因此便能統一評估「被消耗的運算資源」囉! 關於 EVM 我們會在後續的章節有更深的探討,這邊就暫時不展開了。
# 燃料數量上限(GasLimit)
燃料數量上限(GasLimit)是指在一筆交易中,發起者願意支付的最大燃料數量上限。
請特別留意,執行越多的操作將會需要燃燒更多的燃料 。因此在部署合約或者與合約互動時,通常需要將這個數字設定的高一些,以支付足夠的數量來讓交易能夠完成。
另外,如果只有轉移 Ether 給其他帳戶,這個操作需要 21,000 單位的燃料作為燃料數量上限。
# 以轉帳為例
假設 Alice 要轉給 Bob 一顆 Ether,Alice 將這筆交易的 gas limit 設定為 40,000。而一筆轉移 Ether 的操作需要燃燒 21,000 單位。在執行完轉帳以後,Alice 將會收到一筆 (40,000 - 21,000) = 19,000 單位的燃料退款。
反之,Alice 太過於小氣,只把 gas limit 設定成 10,000 單位,將導致燃料不夠用的情況,此時這筆交易將會失敗,並被標記成 revert
的狀態,也不會有任何燃料被退回。
# 改變計價模式的倫敦升級(London Upgrade)
以太坊在倫敦升級時改變了燃料相關的計價模式,由於此處可以展開的範圍過大,讓我們下一章節再來討論,以下將以升級後的現在進行說明。
# 基礎費用(Base Fee)
每個區塊都有基礎費用,當發送者要發出交易時,設定的基礎費用不得低於該區塊的基礎費用。
請注意,這個基礎費用是通過一個公式進行計算的,其數值與前一個區塊所消耗掉的燃料數量有關。細節我們等倫敦升級章節再行探討。
當一筆交易被收入區塊中,這筆基礎費用將會直接燒毀,永遠地消失在這世界上。
燒到的手續費=基礎費用*使用掉的燃料數量。
# 優先費用(Priority Fee)
這是個資本主義的世界,就像去迪士尼樂園一樣,不想和其他人一起排隊,可以購買快速通行券來加速搭乘遊樂設施,通過課金來升級體驗。
在以太坊的世界也一樣,當每筆交易都支付一樣的單位費用時,人人平等,全部慢慢排隊,但也可以通過付點小費給礦工,讓礦工優先將交易放入區塊中,這個機制就是優先費用。
跟基礎費用不同的是,優先費用所產生的手續費會全部交給礦工。
給礦工的小費=優先費用*使用掉的燃料數量。
# 單位燃料費用上限(Max Fee)
對於使用者而言,每次發送交易都要設定基礎費用與優先費用是非常繁瑣的,為了提升體驗,因此衍生出單位燃料費用上限的概念。
單位燃料費用上限=基礎費用+優先費用
而基礎費用又是由公式與前一個區塊狀況而定,使用者無法自行決定,因此對於使用者而言,只需要設定「單位燃料上限」,發起交易的工具就會自動幫忙計算出「優先費用」了。
# 手續費(Fee)
總手續費=單位燃料費(Max Fee)*使用的燃料數量(Used Gas)。
當使用掉的燃數量將大於燃料數量上限時,交易將會失敗,此時的使用掉的燃料數量就會剛好等於燃料數量上限。