主页 > 最新版官网imtoken钱包下载 > 如何估算以太坊智能合约的gas?

如何估算以太坊智能合约的gas?

以太坊如何估算计算气体?在 Etherscan 上的交易信息中有 txn 使用的气体。结果与remix给出的结果和geth中getTransactionReceipt的gasUsed给出的结果一致。您可以直接使用 geth 或 remix 来模拟​​和估算 gas 成本。浏览器

之前还没有弄清楚以太坊gas查询,所以让我们尝试一下。重击

remix浏览器下方有一个可执行日志页面,可以详细调试,非常方便。微信

gas 成本有两个地方,交易成本和执行成本。这两者有什么区别?你可以参考他们的源代码。应用

以太坊gas查询

简单地说:交易成本是指将交易发送到以太坊区块链的成本,它是根据数据大小的大小而定。部署合约时,基于合约内容的大小。执行成本是指虚拟机(VM)执行所需的成本,合约部署时会执行构造函数和一些初始化工作。功能

这是一个简单的合约测试:oop

contract Test {
bytes32 public tmp;
function test(
bytes32 input,
uint num
)
constant returns (bytes32){
bytes32 result = input;
for(uint i = 0; i < num; i++) {
result = sha3(result);
}
}
function set(bytes32 input, uint num) {
tmp = test(input, num);
} }
复制代码

以太坊gas查询

如果直接调用常量函数,会由自己的节点发送。计算不会改变区块链上的值,也不会消耗gas,但是如果普通合约调用常量函数(非常量函数调用),需要矿工计算常量函数,所以会消耗气体。区块链

在上面的简单合约中,我让测试函数为第一个 bytes32 参数制作 sha3,第二个 uint 参数表示要制作多少个循环。我分别引入了set函数和test函数。 10个和1000个参数,结果如下。用户界面

set(“0x63d7db5ce060b288ecf5390594d5969bc1a206ceeb24df31cffcc8876df5e44b”, 10)
transaction cost:30628execution
cost:6988 
复制代码

以太坊gas查询

set(“0x63d7db5ce060b288ecf5390594d5969bc1a206ceeb24df31cffcc8876df5e44b”, 1000)
transaction cost:196022
execution cost:172318
复制代码

test(“0x63d7db5ce060b288ecf5390594d5969bc1a206ceeb24df31cffcc8876df5e44b”, 10)
transaction cost:25663 (cost only applies when called by a contract)
execution cost:2023 (cost only applies when called by a contract) 
复制代码

test(“0x63d7db5ce060b288ecf5390594d5969bc1a206ceeb24df31cffcc8876df5e44b”, 1000)
transaction cost:191057(cost only applies when called by a contract)
execution cost:167353(cost only applies when called by a contract)
复制代码

以太坊gas查询

ps:如果从执行成本中减去交易成本,1、3得到23640,2、4得到23704 spa

大致就是这样的过程。发现当参数设置为1000时以太坊gas查询,交易成本也会增加。 (初步猜测加上ps的计算:交易成本已经包括了执行成本,最后要支付给矿工的费用一起计算,因为每次相减的结果都很小)调试

另外,geth的estimateGas不准确的原因是一些不确定的算子操作会有所不同。例如,在一个合约中,如果blockhash的尾数是奇数,他会执行一个消耗大量gas的合约。 , 否则会执行 hello world 合约,所以在 gas 成本较大的情况下,它的 gas 成本是一半。

以太坊gas查询

因此,请始终记住设置合理的 gas 限制,以保护自己免受恶意攻击。

还建议参考traceTransaction命令查看每个操作码的gas成本。为了确认矿工处理交易的状态,在 ropsten 测试网上做了一个简单的实验。先在 ropsten 水龙头上玩一点 ether,然后在 metamask 上发送交易,因为 ropsten 是一个模拟 pow 的环境,我相信它应该是正确的数字。

如果重要的话,我再说一遍结论:Etherscan上的交易信息中有一个txn使用的gas,结果和remix给出的结果和geth中getTransactionReceipt的gasUsed给出的结果是一样的,然后你可以直接使用 geth 或者 remix 模拟来估算 gas 成本。

参考:以太坊DApp开发实践介绍

可以加微信拉以太坊技术群聊。