本月 16 日晚間,Uniswap 大灑 UNI 幣給 20 多萬用戶,以太坊 Gas 費用隨之飆上 1,000 GWEI 的歷史高點。不過,高昂的手續費甚至已經不是問題,問題是 Gas 費開到建議的最大值也沒辦法成交。本文將詳細講解以太坊交易費率機制及問題。本文由專欄作者 BlockBeats 撰稿。
(前情提要:以太坊手續費暴漲!Uniswap「UNI 空投」席捲下,最高飆達平均 1000 gwei)
在 Uniswap 給 20 多萬個用戶地址撒錢的時候,也許不少人在開心之餘心裡想的都是,「這 gas 費也太高了。」當天是以太坊歷史上值得紀念的一天,gas 建議最高達到了 1,000 GWEI,這是歷史最高點。在見證歷史、全民領空投的當天上午,不少人都遇到了關於 gas 費的問題。
gas 費貴已經不是問題了,問題是 gas 費交到錢包建議的最大值也不能在計劃時間內成交。大家 Metamask 上顯示都是 pending,一圈一圈轉得讓人心煩。
為什麼你使用了預設的 gas 費金額,卻依然不能即時交易?此文將詳細講解以太坊交易費率機制以及在以太坊上發起交易會遇到的問題。
Gas 的邏輯
這個事要先從以太坊帳戶講起。
以太坊網路中有兩類帳戶,外部帳戶(Externally Owned Account)以及合約帳戶(Contract Account)。
外部帳戶是指用戶們所使用的帳戶,由私鑰持有者所控制。合約帳戶是指帶有應用邏輯的智能合約,由合約代碼所控制(往往是項目方所有)。用戶們在使用 DeFi 應用時,就是在用自己的帳戶與 DeFi 項目的智能合約進行交互。
各類帳戶之間可以隨意進行交互,錢包間可以進行轉帳,合約間也可以相互調用。
每一次鏈上交互都需要消耗一定的計算量,計算量消耗的大小由計算難度所決定,而 Gas 就是計算量的計量單位。
例如加法運算較簡單,需要消耗 3 個 Gas,除法運算相對複雜,需要 5 個 Gas。
每一單位的 Gas 都有其對應的價格,也就是 Gas 價格(Gas Price),而 Gas 價格以 Wei 為最小單位。用戶需要購買 ETH 來支付 Gas 費用。1 ETH=1e18 Wei,而我們通常看到的單位 GWei 為 1e9 Wei。通常,錢包軟體會通過歷史 Gas Price 對用戶將要發起的這筆交易的費用進行預估。
為了避免全節點趨於集中,追求架構去中心化的區塊鏈會嚴格限制每單個區塊的容量。例如比特幣的 Block Size Limit 以及以太坊的 Block Gas Limit。
在筆者撰文時,以太坊每單個區塊的 Block Gas Limit 約為 12,000,000 個 Gas,這也就是每一區塊總計算量的上限。
平均每15 秒出一區塊。當交易需求超過區塊容量時,用戶為了將自己的交易盡快被上鏈確認,就需要競爭每一區塊內的資源。此時用戶會對Gas 進行競價,礦工會優先將 Gas Price 高的交易納入區塊。
通常用戶在進行轉帳時還會看到錢包會提高可以調節 Gas Limit 的選項。
與 Block Gas Limit 不同,Gas Limit 是指對於一筆交易,用戶所能接受的 Gas 使用量上限。由於有時合約內可能存在漏洞,一筆交易會不停死循環地進行計算。
如果沒有 Gas Limit,這筆交易會消耗盡用戶錢包內所有的 ETH。而礦工通常所收取的費用是按實際執行該交易時消耗的計算量(Gas Used by Transaction)進行結算的,而 Gas Limit 內剩餘的 ETH 就會回到用戶帳戶中。
所以我們可以得出,所消耗的 ETH 數量(Ether Cost)= 交易費用(Gas Fee / Transaction Fee)= 每筆交易所消耗的 Gas 數量(Gas Used By Transaction)* Gas 價格(Gas Price)。
了解了以太坊的手續費機制以及帳戶類型,我們來看看用戶在交易時時常會碰到的問題。
待確認交易(Pending)/ 加速交易?
每當用戶發起一筆交易時,交易會被放入一個交易池(Mempool) 中。如上文提到,礦工會優先打包池子中 Gas Price 最高的交易(礦工的趨利性)。所以用戶設定的 Gas Price 決定了交易被打包執行的速度。
在網路擁擠的時候,由於 Gas Price 飆升,用戶的交易可能長時間處於待確認狀態。為了盡快將待定交易發出,用戶可以選擇支付更多的 Gas Price 來加速交易(注:理解為給礦工更多的酬勞以達到一個插隊的目的)。
加速交易又是怎麼操作的呢?為了更加詳細地理解加速交易的邏輯,我們需要明白另一個參數:Nonce。
每一個帳戶發出的交易都會有一個按順序排列的交易編號--Nonce,從 0 開始,每次發起一筆轉帳,該帳戶的 Nonce 值會增加 1。
當用戶想要加速交易時,在以太坊錢包中,用戶可以選擇加速交易選項,這時會被要求支付更高的 Gas 費用,用戶同意之後相當於發起了一筆新的交易,而新的交易與待確認交易的 Nonce 值相同。
由於以太坊網路規定,Nonce 值是連續不可跳躍的,且同一個地址每筆交易的 Nonce 值不可重複,所以礦工會打包新生成的交易,在新交易被打包確認之後,之前較低 Gas Price 的交易會廢棄掉。
若用戶不想加速交易,只要此交易還在交易池中未被打包,用戶可以隨時選擇取消交易。取消交易的邏輯與加速交易相同,用戶發起一筆 Gas Price 更高,但與待確認交易 Nonce 相同的交易,但交易金額變為 0,所以本質上,取消交易的成本與加速交易的成本一樣需要成本。
需要注意的是,在待定交易確認完成之前,後面的交易都需要排隊等候,所以用戶不要由於等候時間過長重複發起多筆交易。
延伸閱讀:以太坊可擴展性挑戰:區塊網路狀態數據 v.s 手續費 Gas
延伸閱讀:分析觀點|最近以太坊提高 Gas Limit ,有可能導致網路癱瘓?
交易失敗(Fail)
筆者發現,目前最常見的交易失敗原因是交易 Gas 已用盡(Out of Gas)。也就是說,這筆交易的計算量超過了用戶所設定的 Gas Limit。一般在這種情況下,交易狀態將會顯示為失敗,並提示 Gas 已用盡,並且所支付的 Gas 不會被退還。
有些用戶可能會認為這並不公平,但本質上礦工已經在做功計算,只是算到一半 Gas 不夠了,所以礦工只能放棄繼續作業,但之前的工作需要被支付「工資」,因此之前交的 Gas 費不退大概也可以理解了。遇到這種情況,用戶只能重新再發起一次交易,並將此交易的 Gas Limit 上調。
另一種交易失敗的情況是,當用戶向智能合約發起交易轉帳,但某些錯誤導致無法執行合約時,交易會返回 Bad Instruction。
比如,當用戶參與類似於群眾募資活動時,可能會發生下面這些情況:
- 額度已滿;
- 或用戶未被列入白名單;
- 或用戶超額認購代幣等情況。
此時,用戶所設置的 Gas Limit 將會被全部用盡,最終導致交易失敗。
不過以太坊拜占庭硬分叉後,增添了新的運算子 Reverted(EIP-140)。當合約中出現錯誤導致交易失敗時,交易將不會耗盡 Gas Limit 所設定的所有 Gas,合約將停止執行並退回剩餘 Gas 費用,同時告知用戶錯誤原因。
當然,如果用戶錢包中 ETH 的數量不足以支付 Gas 費用時,交易也會被判定為失敗。
在沒有熱點的時候,以太坊網路一片祥和,所有的轉帳成本,包括時間和金額都還可控,但當風口到來,大家在網路中就會遇到各種問題,Gas 費的邏輯是新人使用錢包時最大障礙。
基本上,在 Gas 費會遇到的所有問題,這篇文章都覆蓋到了,鏈上交易並不復雜,說簡單點,一切操作有問題,加錢就可以搞定。
這場運動目前看來,以太坊上流動性挖礦的熱潮暫時告一段落,這場運動除了創造出一片泡沫之外,也讓更多用戶開始習慣錢包的使用,錢包終於成了一個高頻率使用工具。
而鏈上交易發生的問題其實也在為錢包的優化提供空間,為新人提供「一鍵加速」、「一鍵取消」這樣的服務或許將可以在越來越多的錢包中看到。
📍相關報導📍
Uni的成功或將帶領「Defi牛市」持續;分析師:以太坊2.0可能救不了手續費難題
乾爹模式結束!Coinbase Pro 宣布「停止吸收」以太坊手續費,將引發用戶出走潮?
【新手必讀|加密小知識】關於礦工費(Gas Fee),你不可不知的 6 件事
讓動區 Telegram 新聞頻道再次強大!!立即加入獲得第一手區塊鏈、加密貨幣新聞報導。
LINE 與 Messenger 不定期為大家服務