当前位置:   article > 正文

以太坊机制详解:Gas与Gas Prices深度解析_eth_estimategas

eth_estimategas

概述

读者可以前往我的博客获得更好的阅读体验。

在以太坊London升级后,以太坊启用了EIP1559进行gas计算。由于EIP1559引入的新的gas机制较为复杂,所以我写了此文介绍了以太坊的gas机制。

本文主要涉及以下内容:

  • EIP1559引入的新的gas price设置方式
  • 交易花费的具体计算方式

另,此文写作日期在以太坊即将进行合并时,所以我们在后文依旧使用了矿工这一称谓。

概念辨析

由于此篇是解析以太坊GAS机制的第一篇,所以我们首先在此处介绍gasgas price的区别。

前者是以太坊转账或者合约操作的基准价值。你可以在此网站查询到每一个操作码的最小GAS消费。如下图:

OpCode GAS

理论上,我们可以通过合约字节码判断出合约操作所需要的gas值。当然,如果读者使用了Foundry作为智能合约开发工具链,可以在合约代码根目录运行forge test --gas-report获得gas报告,如下图:

Foundry Gas Report

上述表格也显示了合约部署消耗的gas值。当然,以太坊中也有一种不需要与智能合约交互的但非常重要的操作就是ETH转账,此操作被规定为21,000。可以参考此交易,如下图:

Transfer Gas

如果你自定义交易的gas最大限额,但设置的数量小于合约操作所需要的gas,就会出现错误。比如这个交易,如下图:

Gas Small Fail

上图由红框框出的部分就是此交易的gas限制和gas实际用量。此操作实际的gas用量为160,596,此处的最大限额小于合约操作的用量,所以出现了错误。正常的合约操作可以参考此交易。当然此交易虽然失败了,但仍打包到区块内并收取交易手续费并奖励矿工。因为矿工在接受交易时并不清楚交易的gas用量,矿工会运行交易直至gas耗尽,此部分需要补偿矿工。

当Gas的实际用量小于Gas Limit时,剩余部分会退还给用户。

gas并不代表着进行这一操作所消耗的ETH数量。以太坊中存在大量的交易,我们需要根据网络情况调整手续费,为了有效调整手续费,以太坊引入了gas price价值作为计算手续费的单位,具体计算公式为
Transaction Fee = Gas * Gas Price,其中Transaction Fee就是交易手续费的意思。在后文中,我们会详细分析gas price的计算方法。

Gas Limit 的获取

对于Gas Limit的获取,以太坊客户端给出了一个专用的RPC API,被称为eth_estimateGas

此API调用所需要的参数其实就是交易所需要的参数,我们在此处直接给出两个示例帮助大家使用。

在后文中,我们主要使用Cloudflare提供的公用以太坊网关作为RPC API服务商,其地址为https://cloudflare-eth.com/v1/mainnet

为了方便读者学习,此处我们使用以太坊官方文档提供的线上测试功能。读者可以通过以下方法打开测试功能:

Test Console

首先,我们尝试获取转账交易的Gas消耗,在上图给出的测试栏的的左侧输入以下内容:

{
   
    "jsonrpc": "2.0",
    "method": "eth_estimateGas",
    "params": [
        {
   
            "from": "0x8D97689C9818892B700e27F316cc3E41e17fBeb9",
            "to": "0xd3CdA913deB6f67967B99D67aCDFa1712C293601",
            "value": "0x186a0"
        }
    ],
    "id": 0
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

输入完成后点击运行按钮,我们可以在右侧获得以下返回:

{
   
    "jsonrpc": "2.0",
    "result": "0x5208",
    "id": 0
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

其中,result就是此交易的gas,将其转为十进制,结果恰好为21000,与上文给出的结果相符。

当然,更常见的Gas估计是估计合约操作所消耗的Gas值,我们在此处以WETH合约(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2)为例获取存储deposit()操作的Gas消耗。

使用此API的具体参数可以参考以下

{
   
    "jsonrpc": "2.0",
    "method": "eth_estimateGas",
    "params": [
        {
   
            
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/540306
推荐阅读
相关标签
  

闽ICP备14008679号