1. 程式人生 > >以太坊手續費不足異常(insufficient funds)

以太坊手續費不足異常(insufficient funds)

在以太坊傳送交易的時候,如果手續費計算有誤或者沒有事先判斷賬戶餘額是否足夠,便會碰到“insufficient funds for gas * price + value”異常。今天就帶大家看看原始碼分析一下此異常的始末。

手續費不足異常

手續費不足異常,顧名思義就是發起交易所需手續費超過了地址中的餘額。我們知道,發起交易所需的手續費是由gasLimit和gasPrice組成,即它們的乘積。然而交易一旦發出之後,實際消費的手續費卻是由gasPrice和交易的位元組數決定的。

我們先看一下異常資訊:

Insufficient funds for gas * price + value

這條異常資訊就是告訴我們:當前地址的餘額不足以支付gasLimit乘以gasPrice再加上轉賬的value值。異常中的gas指的就是gasLimit,price就是gasPrice,value指的是發起交易轉賬的以太幣。

原始碼分析

異常定義程式碼,註釋部分已經很明確的說明了異常資訊發生的情況:

// ErrInsufficientFunds is returned if the total cost of executing a transaction
    // is higher than the balance of the user's account.
    ErrInsufficientFunds = errors.New
("insufficient funds for gas * price + value")

呼叫檢驗金額程式碼:

// Transactor should have enough funds to cover the costs
    // cost == V + GP * GL
    if pool.currentState.GetBalance(from).Cmp(tx.Cost()) < 0 {
        return ErrInsufficientFunds
    }

再看一下tx.Cost是如何計算獲取得到的:

// Cost returns amount + gasprice * gaslimit.
func (tx *Transaction) Cost() *big.Int
{ total := new(big.Int).Mul(tx.data.Price, new(big.Int).SetUint64(tx.data.GasLimit)) total.Add(total, tx.data.Amount) return total }

很明顯程式碼中也是通過amount加上gasprice和gaslimit的乘積然後和餘額進行比較。

其他情況

還有一些其他原因引起的此異常。比如有同學說,我通過區塊鏈瀏覽器查詢地址上餘額足夠,通過上面的公式計算獲得的金額也小於餘額,但每次通過節點發送交易,都會丟擲此異常。

針對這個問題,需要做的第一步排查就是:發出交易的節點是否同步到了賬戶的餘額,不是通過區塊鏈瀏覽器查詢餘額,而是要直接在本地節點中查詢餘額。

更多資訊

**獲取更多資訊,請關注微信公眾號:程式新視界。或加入QQ技術交流群:659809063。
本人誠接以太坊相關研發及技術支援(以太坊介面封裝&代幣開發等),如有需要請聯絡QQ:541075754。非誠勿擾。**
這裡寫圖片描述

獲得一對一技術諮詢請掃碼加入知識星球(小密圈)
這裡寫圖片描述