赞
踩
读者可以前往我的博客获得更好的阅读体验。
在以太坊London升级后,以太坊启用了EIP1559
进行gas
计算。由于EIP1559
引入的新的gas
机制较为复杂,所以我写了此文介绍了以太坊的gas
机制。
本文主要涉及以下内容:
EIP1559
引入的新的gas price
设置方式另,此文写作日期在以太坊即将进行合并时,所以我们在后文依旧使用了矿工这一称谓。
由于此篇是解析以太坊GAS机制的第一篇,所以我们首先在此处介绍gas
与gas price
的区别。
前者是以太坊转账或者合约操作的基准价值。你可以在此网站查询到每一个操作码的最小GAS消费。如下图:
理论上,我们可以通过合约字节码判断出合约操作所需要的gas
值。当然,如果读者使用了Foundry
作为智能合约开发工具链,可以在合约代码根目录运行forge test --gas-report
获得gas
报告,如下图:
上述表格也显示了合约部署消耗的gas
值。当然,以太坊中也有一种不需要与智能合约交互的但非常重要的操作就是ETH转账,此操作被规定为21,000
。可以参考此交易,如下图:
如果你自定义交易的gas
最大限额,但设置的数量小于合约操作所需要的gas
,就会出现错误。比如这个交易,如下图:
上图由红框框出的部分就是此交易的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的获取,以太坊客户端给出了一个专用的RPC API,被称为eth_estimateGas
。
此API调用所需要的参数其实就是交易所需要的参数,我们在此处直接给出两个示例帮助大家使用。
在后文中,我们主要使用Cloudflare提供的公用以太坊网关作为RPC API服务商,其地址为https://cloudflare-eth.com/v1/mainnet
。
为了方便读者学习,此处我们使用以太坊官方文档提供的线上测试功能。读者可以通过以下方法打开测试功能:
首先,我们尝试获取转账交易的Gas消耗,在上图给出的测试栏的的左侧输入以下内容:
{
"jsonrpc": "2.0",
"method": "eth_estimateGas",
"params": [
{
"from": "0x8D97689C9818892B700e27F316cc3E41e17fBeb9",
"to": "0xd3CdA913deB6f67967B99D67aCDFa1712C293601",
"value": "0x186a0"
}
],
"id": 0
}
输入完成后点击运行按钮,我们可以在右侧获得以下返回:
{
"jsonrpc": "2.0",
"result": "0x5208",
"id": 0
}
其中,result
就是此交易的gas
,将其转为十进制,结果恰好为21000
,与上文给出的结果相符。
当然,更常见的Gas估计是估计合约操作所消耗的Gas值,我们在此处以WETH合约(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2)为例获取存储deposit()
操作的Gas消耗。
使用此API的具体参数可以参考以下
{
"jsonrpc": "2.0",
"method": "eth_estimateGas",
"params": [
{
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。