以太坊手續費不足異常(insufficient funds)
阿新 • • 發佈:2018-12-31
在以太坊傳送交易的時候,如果手續費計算有誤或者沒有事先判斷賬戶餘額是否足夠,便會碰到“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。非誠勿擾。**
獲得一對一技術諮詢請掃碼加入知識星球(小密圈)