跳到主要内容

opcode-costs

Opcode 成本速查与内存扩展

本页汇总常用指令成本与内存扩展公式,便于估算 gas。实际数值随硬分叉/EIP 可能调整,请以客户端实现为准(Berlin/London/Shanghai/Dencun 之后的一般取值)。

访问冷热与附加成本(EIP-2929)

  • 账户首次访问(BALANCE/EXTCALL/CALL 等):额外“冷账户”成本 ≈ 2600,后续同交易内为“热”
  • 存储槽首次访问(SLOAD/SSTORE):额外“冷槽”成本 ≈ 2100;SLOAD 热读 ≈ 100

存储写入(EIP-2200/3529 摘要)

  • 0 → 非 0:高成本(约 20k)
  • 非 0 → 0:中成本(约 5k),并产生退款(EIP-3529 后约 4800,上限见退款规则)
  • 非 0 → 非 0(不同值):中成本(约 5k)
  • 重写相同值(no-op):低成本(≈ 100)
  • 首次触达槽位另加“冷槽”成本(≈ 2100)

哈希与日志

  • KECCAK256(SHA3):基准 + 按 32 字节字数线性增长
  • LOG0..LOG4:基准 + 每个 topic 额外成本 + data 每字节线性成本

调用族与账户创建

  • CALL/STATICCALL/DELEGATECALL:基准调用成本 + 冷账户附加;转账(value>0)有额外成本
  • 通过 CALL 向“新账户”转账会触发新建账户成本(约 25k),仅当账户此前不存在且转账后非空

算术/位运算(代表性)

  • Verylow(≈3):ADD/SUB/AND/OR/XOR/NOT/SHL/SHR/SAR/ISZERO/...
  • Low(≈5):MUL/DIV/SDIV/MOD/SMOD/ADDMOD/MULMOD/SIGNEXTEND
  • EXP:10 + 50 * 按指数字节数(近似)

内存扩展公式

以“32 字为单位”的内存大小 a,内存成本函数:

Cmem(a) = Gmemory * a + floor(a^2 / 512)
// Gmemory 通常为 3;扩展成本 = Cmem(a_new) - Cmem(a_old)

拷贝类指令(CALLDATACOPY/CODECOPY/EXTCODECOPY/RETURNDATACOPY)= 基准 + 每 32 字线性 + 内存扩展

退款与上限(EIP-3529)

  • 退款计数器不超过“交易实际消耗 gas 的 20%”
  • SELFDESTRUCT 退款被移除;SSTORE 清零退款显著降低(约 4800)

提示:以上为工程估算常用值/公式,精确表请参考客户端(geth、reth、nethermind)常量与 EIP 规范实现。