做web3开发的时候,明明自己小狐狸里还有2.15的代币,但页面我要转出2.1的时候,明明是够的,而且使用小狐狸提示gas费用是21000,这已经是最小的了,但网页转出到其他账户总是提示失败。而且这个错误非常不好捕获。
发现问题
Internal JSON-RPC error
"err: insufficient funds for gas * price + value: address 0xf9B6ACf0B4c0cf893624ab69a8E6D26fehave 3100004000000000 want 52000000000000000 (supplied gas 50000000)
排查问题
于是就四处寻找这个50000000是哪里来的呢,结果大家找了半天,愣是没找到这个50000000的数值是哪里设定的。
经过不断寻找,发现,如果在调用 web3.eth.sendTransaction
方法时没有传入 gas
参数,以太坊客户端会自动估算所需的 gas 量。然而,这种自动估算可能不够准确,有时候可能会导致交易失败。
如果没有指定 gas 限额,以太坊客户端会根据交易内容和当前网络状况估算一个 gas 限额。这个估算可能会尝试执行交易,直到确定所需的 gas 量。但是,在某些情况下,这种估算可能不足以完成交易,导致交易失败。
因此,为了确保交易成功,最好是手动设置一个合适的 gas 限额。一般来说,你可以使用 web3.eth.estimateGas
方法来估算一个合适的 gas 限额,然后将其传递给 sendTransaction
方法。
意思就是,如果代码里不设置gas的话,每次估算会不准确。
解决
最终,在代码中加入gas入参,每次都给他设定一下gas,解决了
web3.eth.sendTransaction({
from: '0xYourAddress', // 发送者的以太坊地址
to: '0xRecipientAddress', // 接收者的以太坊地址
value: web3.utils.toWei('1', 'ether'), // 发送的以太币数量,以 wei 为单位
gas: '21000', // 交易所需的 gas 数量
gasPrice: web3.utils.toWei('10', 'gwei'), // gas 价格,以 wei 为单位
// 可选参数:data、nonce等
}, function(error, hash){
if (!error)
console.log(hash); // 交易哈希
});