javascript 在发送交易之前,您如何估计当前的汽油限制?

9o685dep  于 2023-02-07  发布在  Java
关注(0)|答案(4)|浏览(158)

具体来说,我希望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个单位。

nlejzf6q

nlejzf6q1#

尝试使用web3 1.0运行estimateGas()

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

rbl8hiat2#

gasLimit指的是可以消耗的最大气体量。你可以通过调用如下代码来获取并重用最后一个块的总气体量:

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

但实际上,当您构建交易时,请将gasLimit视为您愿意支付的最大金额(in wei)。
这是一种保护机制,因为如果执行成本太高,它可以防止您花费所有的以太币。
这是一个EVM安全特性,可以避免陷入运行,因为如果执行达到成本的gasLimit,它将停止而不会陷入运行。
因此,对于开发,您可以重用最新的块限制或使用高数量。但当您想部署任何东西时,请更好地进行估计,您将更好地了解您愿意支付多少汽油,最大值。

3b6akqbq

3b6akqbq3#

ETH已经转向动态定价,请参见EIP-1159。估算gas的一种方法是拉入前一个区块,并找到支付的天然气的中值。以下是在web3 py中如何进行估算

def _estimate_gas(transactions) -> int:
    # Returns the median of the gas in previous block transactions
    return int(median(t.gas for t in transactions)) 

w3 = Web3(Web3.HTTPProvider("RPC"))
block = w3.eth.get_block("latest", full_transactions=True)
gas = _estimate_gas(block.transactions)

另一方面,gasPrice非常简单,只需使用w3.eth.gas_price
(克罗斯在以太坊堆栈交换here上发布了我的答案)

7hiiyaii

7hiiyaii4#

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

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

相关问题