在发送交易之前,您如何估算当前的天然气限额?

时间:2019-06-11 18:39:32

标签: javascript ethereum solidity web3 web3js

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

我试图获得最后一个方块的气体限制,但是它似乎总是太低了。

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。

3 个答案:

答案 0 :(得分:0)

您可以尝试将web3 1.0estimategas

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

答案 1 :(得分:0)

gasLimit 是指可以消耗的最大气体量。您可以通过调用类似这样的命令来获取并重复使用最后一个块的gasLimit:

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

但是在实践中,当您进行交易时,请将 gasLimit 视为您愿意支付的最大金额( em ) 。

这对您来说是一种保护机制,因为如果执行成本太高,它将避免您花费所有的以太币。

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

因此,对于开发而言,您只需重新使用最新的块限制或使用大量即可。但是,当您要部署任何东西时,估算会变得更好,并且您会更好地了解您愿意支付的最大油耗。

答案 2 :(得分:0)

希望以下内容对您有所帮助:

@Test
public void test() throws Exception {
  camelContext.addRoutes(new RouteBuilder() {
    @Override
    public void configure() throws Exception {

      from("direct:test")
          .multicast(AggregationStrategies.useOriginal()) // <- Using the camel AggregationStrategy now
            .process(exchange -> {
              exchange.setProperty("c", 1);
              exchange.getIn().setHeader("d", 1);
            })
          .end()
          .log("Property a: ${exchangeProperty.a}")
          .log("Header b: ${header.b}")
          .log("Property c: ${exchangeProperty.c}")
          .log("Header d: ${header.d}");
    }
  });

  Exchange exchange = new ExchangeBuilder(camelContext)
      .withProperty("a", 1)
      .withHeader("b", 1)
      .build();
  camelContext.createProducerTemplate().send("direct:test", exchange);
}