在编写,测试和调试智能合约的过程中,应注意不同 OpCode 调用成本。 本文介绍能量消耗的计算细节,并提供相关参考链接。
关于能量成本及价格计算,可以参考 Tron Station。
OpCode 消耗
不同 OpCode 的能量消耗分为不同级别,成本等级分类及对应能量消耗如下:
public enum Tier {
ZeroTier(0),
BaseTier(2),
VeryLowTier(3),
LowTier(5),
MidTier(8),
HighTier(10),
ExtTier(20),
SpecialTier(1),
InvalidTier(0);
}
不同 OpCode 对应的消耗可以参考 OpCode.java。
虚拟机存在 memory 和 storage 的概念,对应这两类操作的 OpCode 消耗能量需要额外计算。
例如对于 memory 类别的 OpCode 而言,操作的 memory 大小会影响具体的消耗,例如 MLOAD
, MSTORE
OpCode, 此时的消耗与所操作内存的字长相关。
对于 storage 类别的 SSTORE
OpCode 而言,消耗能量不止与操作字长有关,还需要区分操作是重置,新增,还是删除。
val 当前值 | 操作 | 能量消耗 | 操作类别 |
---|---|---|---|
为空,即 val == 0x0 | sstore(val, n) | 20000 | SET / 设置 |
非空, val != 0x0 | sstore(val, n) | 5000 | RESET / 重置 |
非空, val != 0x0 | sstore(val, 0) | 5000 | CLEAR |
其他较高消耗操作
当通过合约给未激活账户转账 TRX 或 TRC10 创建账户时,会多消耗 25000 能量,此时没有 0.1 TRX 的账户创建费用。
当使用 CALL
, DELEGATECALL
等操作调用其他合约时,且附加转账操作时,多消耗 9000 能量。
当使用 CREATE
, CREATE2
在合约中动态创建合约时,消耗 32000 能量。
当使用预编译合约 (precompiled contracts) 时,不同调用操作消耗不同,请参考 PrecompiledContracts.java。
部署合约的能量消耗
部署合约时,合约代码每字节消耗 200 能量。
提示
部署合约时所提供的字节码一般分为两部分,一部分叫部署代码(creation code),一部分是合约的运行时代码(runtime code)。部署代码一般用于执行合约构造函数逻辑,并返回真正的合约运行时代码。计算部署合约时能量消耗,需要使用运行时代码长度。一般是部署代码字节码第二个
6060
或6080
为起始。
Updated 4 months ago