【问题标题】:How do you estimate the current gas limit before sending a transaction?在发送交易之前,你如何估计当前的 gas 限制?
【发布时间】:2019-10-26 05:49:19
【问题描述】:

具体来说,我希望我的 node.js 能够将 ERC721 令牌发送到另一个钱包。有时,gas 价格很高,我的交易会卡在那里几个小时。在这些情况下,我希望我的 node.js 使用更多的气体来按时发送令牌。

我已经尝试获取最后一个区块的 gas 限制,但它似乎总是太低了。

var count = web3.eth.getTransactionCount(sender);

  var rawTransaction;

  var block = web3.eth.getBlock("latest");
  var currGas = block.gasLimit;
  currGas = currGas.toString(16);
  currGas = '0x' + currGas;

  if(isSending){
    rawTransaction = {
        "from": sender,
        "nonce": web3.toHex(count),
        "gasPrice": currGas,
        "gasLimit": "0x3A980",
        "to": skyDropContract,
        "value": "0x0",          
        "data": myContractABI.startGame.getData(index, {from: sender}),
        "chainId": 0x01
    };
  }

我正在使用web3@0.20.0,但如果我真的需要,可以切换版本。有没有办法在发送之前估算我的交易成本?我什至可能比当前估计的成本高出 1 gWei。

【问题讨论】:

  • 您似乎混淆了gas限制和gas价格。你得到了区块的 gas 限制,并试图将其用作 gas 价格。区块气体限制是一个区块中所有交易总共可以使用多少气体。 Gas 价格是您愿意支付的每个 Gas 单位的 wei 来让您的交易被挖掘。

标签: javascript ethereum solidity web3 web3js


【解决方案1】:

你可以试试estimategasweb3 1.0

myContract.methods.startGame(index)
    .estimateGas(
        {
            from: _from,
            gasPrice: _gasPrice
        }, function(error, estimatedGas) {
        }
    )
});

【讨论】:

  • 嗨,当我在交易中调用estimateGas 时,它会抛出execution reverted。气体估算不需要任何气体。它会发生什么?任何想法
【解决方案2】:

gasLimit是指可以消耗的最大gas量。你可以通过调用这样的方法来获取并重新使用最后一个区块总gasLimit:

web3.eth.getBlock("latest").gasLimit

但实际上,当您构建交易时,请将 gasLimit 视为您愿意支付的最高金额(in wei) .

这对你来说是一种保护机制,因为它可以避免你在执行成本太高时花费你所有的以太币。

这是一个 EVM 安全功能,可以避免运行卡住,就像执行达到 gasLimit 的成本一样,它会停止并且不会卡住。

因此,对于开发,您可以重复使用最新的区块限制或使用高数量。但是,当您想要部署任何东西时,请更好地进行估算,您将更好地了解您愿意支付的最大 Gas 量。

【讨论】:

  • 这给了我“未定义”,也许有升级之类的?
  • 有没有办法得到下限?
  • @rsc05 你在用等待吗?
【解决方案3】:

希望以下内容会有所帮助:

var block = await web3js.eth.getBlock("latest");
var gasLimit = block.gasLimit/block.transactions.length;

【讨论】:

  • SyntaxError: await 仅在异步函数中有效
  • 把它装进生活中
  • @rsc05 await 必须进入异步函数中。正如@chovy 所说,wrap 在 iife 函数中,即:(async () => { var block = await web3js.eth.getBlock("latest"); var gasLimit = block.gasLimit/block.transactions.length; })(); 或将其添加到普通异步函数中
猜你喜欢
  • 2022-11-03
  • 1970-01-01
  • 2022-08-16
  • 2019-12-16
  • 1970-01-01
  • 2023-04-01
  • 2018-10-23
  • 2010-11-05
  • 1970-01-01
相关资源
最近更新 更多