為什麼我錢包裡還有ETH,但交易就是確認不了?
編者按:本文來自區塊律動BlockBeats(ID:BlockBeats),Odaily經授權轉載。
編者按:本文來自
區塊律動BlockBeats(ID:BlockBeats)
區塊律動BlockBeats(ID:BlockBeats)
區塊律動BlockBeats(ID:BlockBeats)
區塊律動BlockBeats(ID:BlockBeats)
,Odaily經授權轉載。
區塊律動BlockBeats(ID:BlockBeats)
二級標題
區塊律動BlockBeats(ID:BlockBeats)
在Uniswap 給20 多萬個用戶地址撒錢的時候,也許不少人在開心之餘心裡想的都是,「這gas 費也太高了。」
二級標題
當天是以太坊歷史上值得紀念的一天,gas 建議最高達到了1000 GWEI,這是歷史最高點。
在見證歷史、全民領空投的當天上午,不少人都遇到了關於gas 費的問題,gas 費貴已經不是問題了,問題是gas 費交到錢包建議的最大值也不能在計劃時間內成交。大家Metamask 上顯示都是pending,一圈一圈轉得讓人心煩。
二級標題
Gas 的邏輯
這個事要先從以太坊賬戶講起。
外部賬戶是指用戶們所使用的賬戶,由私鑰持有者所控制。合約賬戶是指帶有應用邏輯的智能合約,由合約代碼所控制(往往是項目方所有)。用戶們在使用DeFi 應用時,就是在用自己的賬戶與DeFi 項目的智能合約進行交互。二級標題
各類賬戶之間可以隨意進行交互,錢包間可以進行轉賬,合約間也可以相互調用。每一次鏈上交互都需要消耗一定的計算量,計算量消耗的大小由計算難度所決定,而Gas 就是計算量的計量單位。例如加法運算較簡單,需要消耗3 個Gas,除法運算相對複雜,需要5 個Gas。
為了避免全節點趨於集中,追求架構去中心化的區塊鏈會嚴格限制每單個區塊的容量。例如比特幣的Block Size Limit 以及以太坊的Block Gas Limit。在律動BlockBeats 撰文時,以太坊每單個區塊的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 來加速交易(律動注:理解為給礦工更多的酬勞以達到一個插隊的目的)。
當用戶想要加速交易時,在以太坊錢包中,用戶可以選擇加速交易選項,這時會被要求支付更高的Gas 費用,用戶同意之後相當於發起了一筆新的交易,而新的交易與待確認交易的Nonce 值相同。
二級標題
由於以太坊網絡規定,Nonce 值是連續不可跳躍的,且同一個地址每筆交易的Nonce 值不可重複,所以礦工會打包新生成的交易,在新交易被打包確認之後,之前較低Gas Price 的交易會廢棄掉。
若用戶不想加速交易,只要此交易還在交易池中未被打包,用戶可以隨時選擇取消交易。取消交易的邏輯與加速交易相同,用戶發起一筆Gas Price 更高,但與待確認交易Nonce 相同的交易,但交易金額變為0,所以本質上,取消交易的成本與加速交易的成本一樣需要成本。
需要注意的是,在待定交易確認完成之前,後面的交易都需要排隊等候,所以用戶不要由於等候時間過長重複發起多筆交易。
二級標題
交易失敗(Fail)
律動BlockBeats 發現,目前最常見的交易失敗原因是交易Gas 已用盡(Out of Gas)。也就是說,這筆交易的計算量超過了用戶所設定的Gas Limit。一般在這種情況下,交易狀態將會顯示為失敗,並提示Gas 已用盡,並且所支付的Gas 不會被退還。
有些用戶可能會認為這並不公平,但本質上礦工已經在做功計算,只是算到一半Gas 不夠了,所以礦工只能放棄繼續作業,但之前的工作需要被支付「工資」,因此之前交的Gas 費不退大概也可以理解了。遇到這種情況,用戶只能重新再發起一次交易,並將此交易的Gas Limit 上調。
另一種交易失敗的情況是,當用戶向智能合約發起交易轉賬,但某些錯誤導致無法執行合約時,交易會返回Bad Instruction。


