主页 > 官网最新版imtoken钱包 > 以太坊 gas 消耗量估算

以太坊 gas 消耗量估算

官网最新版imtoken钱包 2023-06-19 06:20:40

以太坊如何估算、预估或计算gas?

在 Etherscan 的交易信息中有 txn 使用的 gas。 结果与remix给出的结果和geth中getTransactionReceipt中gasUsed给出的结果一致。 你可以直接使用 geth 或 remix 来模拟​​和估算 gas 成本。

这个问题我之前一直没有搞清楚,所以就做个实验看看。

remix浏览器底部有一个可执行日志页面,可以详细查看和调试,非常方便。

clipboard.png

gas成本有两个地方以太坊发币消耗,交易成本和执行成本。 这两者有什么区别? 你可以参考他们的。

简单的说:

交易成本是指将交易发送到以太坊区块链的成本,它基于数据大小的大小,在部署合约时基于合约内容的大小。

执行成本是指虚拟机(VM)执行所需的成本,在部署合约时,会执行构造函数和一些初始化工作。

以太坊发币消耗_site163.com 基于以太坊发币_以太坊发币消耗

下面是一个简单的合约实验:

contract Test {
    bytes32 public tmp;
    function test(
        bytes32 input, 
        uint num
    ) constant returns (bytes32){
        bytes32 result = input;
        for(uint i = 0; i < num; i++) {

site163.com 基于以太坊发币_以太坊发币消耗_以太坊发币消耗

result = sha3(result); } } function set(bytes32 input, uint num) { tmp = test(input, num); } }

以太坊发币消耗_site163.com 基于以太坊发币_以太坊发币消耗

如果直接调用常量函数,因为节点本身计算的值不会被更改到区块链,所以不会消耗gas,但是如果你从一个通用合约中调用一个常量函数(非常量函数调用)的话,gas会被消耗,因为矿工是用来计算常量函数的。

在上面的简单合约中,我要求测试函数对第一个bytes32参数执行sha3,第二个uint参数表示要执行的循环次数。 我分别在set函数和test函数中放入了10个和1000个参数,结果如下。

set(“0x63d7db5ce060b288ecf5390594d5969bc1a206ceeb24df31cffcc8876df5e44b”, 10)
transaction cost:30628
execution cost:6988
set(“0x63d7db5ce060b288ecf5390594d5969bc1a206ceeb24df31cffcc8876df5e44b”, 1000)
transaction cost:196022
execution cost:172318

site163.com 基于以太坊发币_以太坊发币消耗_以太坊发币消耗

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)

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

以太坊发币消耗_site163.com 基于以太坊发币_以太坊发币消耗

大致是这样的过程。 发现参数设置为1000时,也会增加交易费用。 (初步猜测加上ps的计算:交易费用已经包含了执行费用,最后还要一起计算要支付给矿工的手续费,因为每次相减的结果都差不多)

另外,geth的estimateGas之所以不准确,是因为一些不确定的算子操作会有所不同。 比如在一个合约中以太坊发币消耗,如果blockhash的尾数是奇数,就会执行消耗gas多的合约,反之则执行hello world合约,所以他的gas cost是一半一半的情况一个大的。

所以永远记得设置一个合理的gas limit,以防止自己受到恶意攻击。

另一个建议

您可以参考 traceTransaction 命令查看每个操作码的 gas 成本。

为了确认矿工如何处理交易,在 ropsten 测试网上做一个简单的实验。 先拿一点ether在ropsten faucet上玩,然后在metamask上发送交易,因为ropsten模拟的是pow的环境,所以相信应该是正确的数字。

重要的话再次总结

Etherscan上的交易信息中有txn使用的gas,结果与remix给出的结果和geth中getTransactionReceipt中gasUsed给出的结果一致。 以后可以直接使用geth或者remix来模拟估算gas成本。

安利给大家以太坊开发的入门教程: