你如何估计智能合约调用所需的 gas 量?

Posted

技术标签:

【中文标题】你如何估计智能合约调用所需的 gas 量?【英文标题】:How do you estimate the amount of gas required for a smart contract invocation? 【发布时间】:2021-05-01 09:10:38 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

RSK 节点有一个用于eth_estimateGas 的 JSON-RPC, 这是进行气体估算的最可靠方法。

您可以在终端使用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
"jsonrpc":"2.0","id":1,"result":"0x5208"

或者,使用web3.js

web3.eth.estimateGas("to": "0x391ec8a27d29a42c7601651d2f38b1e1895e27a1", "data": "0xe26e496319a16c8ccae126f4aac7e3010123927a4739288cd1ace12feafae9a2")
23176

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

例如,某些 VM 操作码的价格是不同的。 与气体估算有关的另一个显着差异点, 是以太坊实现EIP-150, 而 RSK 没有。 这意味着气体估计中的 1/64 减少不适用于 RSK。 (detailed implications of this on gas estimation 可能超出了这个问题的范围。)

这意味着在运行 ganache-cli(之前的 testrpc)时,您会得到不正确的值, 在 Truffle 等常用开发工具中默认使用。

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


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

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

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

【讨论】:

这篇文章解释了以太坊和 RSK 之间气体估算的最大差异之一medium.com/iovlabs-innovation-stories/…

以上是关于你如何估计智能合约调用所需的 gas 量?的主要内容,如果未能解决你的问题,请参考以下文章

Web3 开发系列教程—创建你的第一个智能合约什么是 Gas,它是如何使用的?

深入以太坊智能合约 ABI

深入以太坊智能合约 ABI

在我用于测试的 js 文件中。我将发送交易调用到智能合约,那么 value 和 gas 之间有啥区别:

合约代码无法存储,请检查您的gas限制:以太坊智能合约部署失败:

智能合约实战 gas gasprice gaslimit