以太坊智能合约Gas计算差异排查:手动计算与Metamask结果不符
合约代码
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.2 <0.9.0; contract Sum { uint public sum; uint private first; uint private second; function setNumbers(uint a, uint b)public { first=a; second=b; } function add() public{ sum= first+second; } }
背景信息
部署上述合约后,Metamask显示总Gas消耗为161621,Remix提供的合约字节码总长度为536字节,字节码内容如下:0x608060405234801561001057600080fd5b506101f8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806307d01c3a146100465780634f2be91f14610064578063a378c8981461006e575b600080fd5b61004e61008a565b60405161005b91906100d3565b60405180910390f35b61006c610090565b005b6100886004803603810190610083919061011f565b6100a8565b005b60005481565b6002546001546100a0919061018e565b600081905550565b81600181905550806002819055505050565b6000819050919050565b6100cd816100ba565b82525050565b60006020820190506100e860008301846100c4565b92915050565b600080fd5b6100fc816100ba565b811461010757600080fd5b50565b600081359050610119816100f3565b92915050565b60008060408385031215610136576101356100ee565b5b60006101448582860161010a565b92505060206101558582860161010a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610199826100ba565b91506101a4836100ba565b92508282019050808211156101bc576101bb61015f565b5b9291505056fea264697066735822122066bf42d24b9ddb1454ff5a1a748bee45d9f6ca583f4ee7e2bda77c1715968e5064736f6c63430008120033
手动计算规则
- 每笔交易基础Gas为21000
- 创建合约Gas为32000
- 每个非零字节消耗16 Gas
- 每个零字节消耗4 Gas
- 运行时代码成本为runtimeBytecode长度×200
- 初始化代码Opcode成本通过Remix调试工具获取,总计147(部署后字节码长度为0x01f8即504字节)
手动计算结果
- 交易基础Gas:21000
- 创建合约Gas:32000
- 非零字节成本:458×16=7328
- 零字节成本:78×4=312
- 运行时代码成本:504×200=100800
- 初始化Opcode成本:147
总计:161587
问题
Metamask显示总Gas为161621,与手动计算结果相差34,无法定位计算错误点,请问遗漏了哪些部分?
内容的提问来源于stack exchange,提问作者unipsilo

