1. 程式人生 > >以太坊交易手續費

以太坊交易手續費

	想了解更多區塊鏈技術,請百度【鏈客區塊鏈技術問答社群】進入

在以太坊發出交易或者其他一些東西的時候,如果手續費計算有問題或者沒有在此之前半段賬戶餘額是不是充足,便會碰到“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的乘積然後和餘額進行比較。
其他情況
還有一些其他原因引起的此異常。比如有同學說,我通過區塊鏈瀏覽器查詢地址上餘額足夠,通過上面的公式計算獲得的金額也小於餘額,但每次通過節點發送交易,都會丟擲此異常。
針對這個問題,需要做的第一步排查就是:發出交易的節點是否同步到了賬戶的餘額,不是通過區塊鏈瀏覽器查詢餘額,而是要直接在本地節點中查詢餘額。