有趣的地方

有趣的地方

小狐狸转账失败,提示gas费过高

做web3开发的时候,明明自己小狐狸里还有2.15的代币,但页面我要转出2.1的时候,明明是够的,而且使用小狐狸提示gas费用是21000,这已经是最小的了,但网页转出到其他账户总是提示失败。而且这个错误非常不好捕获。

发现问题

2ed573372f914d0bbafe5a8b460b17de.png

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); // 交易哈希
});

 1bdec78d853047c89a59d1020f8b4e97.png

 

 

发表评论:

Powered By Z-BlogPHP 1.7.3

© 2018-2020 有趣的地方 粤ICP备18140861号-1 网站地图