您如何估计智能合约调用所需的气体量?

7al*_*lip 7 web3js rsk

我想在 RSK 网络中发送交易,并在日志中收到此消息: Not enough gas for transaction execution.

我从我的测试环境中获得了气体限制参数,使用web3.eth.estimateGas.

Ale*_*ero 7

RSK 节点具有用于 的 JSON-RPC eth_estimateGas,这是执行气体估计的最可靠方法。

您可以使用以下命令从终端执行此操作curl

curl \
  -X POST \
  -H "Content-Type:application/json" \
  --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{"from": "0x560e6c06deb84dfa84dac14ec08ed093bdd1cb2c", "to": "0x560e6c06deb84dfa84dac14ec08ed093bdd1cb2c", "gas": "0x76c0", "gasPrice": "0x3938700", "value": "0x9184e72a", "data": "" }],"id":1}' \
  http://localhost:4444
Run Code Online (Sandbox Code Playgroud)
{"jsonrpc":"2.0","id":1,"result":"0x5208"}
Run Code Online (Sandbox Code Playgroud)

或者,使用web3.js

web3.eth.estimateGas({"to": "0x391ec8a27d29a42c7601651d2f38b1e1895e27a1", "data": "0xe26e496319a16c8ccae126f4aac7e3010123927a4739288cd1ace12feafae9a2"})
Run Code Online (Sandbox Code Playgroud)
23176
Run Code Online (Sandbox Code Playgroud)

虽然这与geth(Ethereum) 和其他与以太坊兼容的节点中发现的 JSON-RPC 相同,但请注意,RSK 和以太坊中的 gas 计算是不同的。因此它们的实现不同。

例如,某些 VM 操作码的价格不同。与 gas 估算相关的另一个值得注意的不同点是,以太坊实现了EIP-150,而 RSK 没有。这意味着气体估计减少 1/64不适用于 RSK。(这对气体估计详细影响可能超出了这个问题的范围。)

这意味着在针对ganache-cli(以前的testrpc)运行时,您会期望不正确的值,这在常见的开发人员工具(例如 Truffle)中默认使用。

要获得正确的 gas,使用 RSK 特定的计算,最好的方法是在调用eth_estimateGas 本地开发和测试时使用 RSK Regtest 。在其他场景中,您也可以使用 RSK 测试网和主网。


以下其他场景也相关,但与您的问题没有直接关系,但也很高兴知道:

在调用具有pureview修饰符的智能合约函数时,不需要gas(因此也不需要gas 估计)。

在执行某些具有定义不变 gas 价格的交易时,您可以简单地将其用作硬编码常量。例如,本地货币(在这种情况下为 RBTC)的转移,不变的 gas 价格是21000。这假设没有data(有时称为“消息”)与交易一起发送。

  • 本文解释了以太坊和 RSK 之间 Gas 估算的最大差异之一 https://medium.com/iovlabs-innovation-stories/the-dark-side-of-ethereum-1-64th-call-gas-reduction-ba661778568c (2认同)