跳至主要内容
本页面使用机器翻译自英语,可能包含错误或不清楚的语言。如需最准确的信息,请参阅英文原文。由于更新频繁,部分内容可能与英文原文有出入。请加入我们在 Crowdin 上的努力,帮助我们改进本页面的翻译。 (Crowdin translation page, Contributing guide)

计算成本

由于 Kaia 的目标是保持 1 秒的区块时间,因此必须对事务的执行时间进行管理。 以下是实现这一目标的三种方法:

  1. 限制交易的气体限值
  2. 限制事务的执行时间
  3. 限制交易的计算成本

限制交易的气体上限并不是一个可行的解决方案,因为气体的概念代表了区块链平台中各种资源(如计算、存储、网络带宽等)当前的交换价值。 它不适合作为衡量事务执行时间的指标。

限制交易的执行时间也不可行,因为区块链平台上不同节点的执行时间可能不同。 例如,我们将事务的执行时间限制为 100 毫秒。 如果一个节点在 90 毫秒内执行了一个事务,而另一个节点在 110 毫秒内执行了该事务,则这两个节点无法达成共识。 因此,这种解决方案并不合适。

最后一种方法是限制交易的计算成本。 我们根据每个 EVM 操作码的实际执行时间对其计算成本进行建模,并限制一个事务的计算成本总和。 通过这种方法,我们可以排除其他因素,只计算归一化的执行时间单位,节点也能达成共识。

因此,我们为 Kaia 选择了第三种方案。 计算成本上限为 100,000,000 美元,但随着 CPU 计算性能的提高,坎昆 EVM 硬分叉后上限已提高到 150,000,000 美元。 该限制值由平台决定,因此开发人员应了解交易的计算成本。 Kaia 提供 kaia_estimateComputationCost 来计算事务的计算成本。 用法与 kaia_estimateGas 几乎相同。

备注

与硬叉相关的计算成本变更可在本页底部找到。 转到 Hardfork Changes

计算成本限额

在执行事务时,一系列操作码或预编译合约按顺序执行。 为了限制事务的执行时间,我们根据实际执行时间为操作码和预编译合约建立了一个确定性的执行时间计算模型。

根据这一模型,运算代码和预编译合同的预定计算成本值会被添加到总计算成本中。 如果总值超过计算成本限制,事务执行将中止,并返回 ComputationCostLimitReached(0x0a) 错误。

在设置计算成本限制值时,如果 --opcode-computation-cost-limit 标志值设置为非零值,我们会将其设置为限制值。 如果为零,则限制值将设置为为每个特定硬分叉定义的默认计算成本限制。 作为例外,call/estimateGas/estimateComputationCost 的限制始终设置为无限,不受标志或硬分叉值的影响。 但是,由于其他限制(如油箱盖),执行仍有可能中止。

操作码的计算成本

下表显示了 EVM 运算代码的计算成本。 计算成本是根据实验确定的。

操作码计算成本
STOP0
ADD150
MUL200
SUB219
DIV404
SDIV360
MOD320
SMOD560
ADDMOD360
MULMOD700
EXP720
SIGNEXTEND481
LT201
GT264
SLT176
SGT222
EQ220
ISZERO165
AND288
OR160
XOR454
NOT364
BYTE589
SHL478
SHR498
SAR834
SHA3560
ADDRESS284
BALANCE1407
ORIGIN210
CALLER188
CALLVALUE149
CALLDATALOAD596
CALLDATASIZE194
CALLDATACOPY100
CODESIZE145
CODECOPY898
GASPRICE131
EXTCODESIZE1481
EXTCODECOPY1000
RETURNDATASIZE10
RETURNDATACOPY40
EXTCODEHASH1000
BLOCKHASH500
COINBASE189
TIMESTAMP265
NUMBER202
PREVRANDAO1498
GASLIMIT166
CHAINID120
SELFBALANCE374
POP140
MLOAD376
MSTORE288
MSTORE8230
SLOAD2550
SSTORE2510
JUMP253
JUMPI176
PC147
MSIZE137
GAS230
JUMPDEST10
PUSH080
PUSH1120
PUSH2120
PUSH3120
PUSH4120
PUSH5120
PUSH6120
PUSH7120
PUSH8120
PUSH9120
PUSH10120
PUSH11120
PUSH12120
PUSH13120
PUSH14120
PUSH15120
PUSH16120
PUSH17120
PUSH18120
PUSH19120
PUSH20120
PUSH21120
PUSH22120
PUSH23120
PUSH24120
PUSH25120
PUSH26120
PUSH27120
PUSH28120
PUSH29120
PUSH30120
PUSH31120
PUSH32120
DUP1190
DUP2190
DUP3176
DUP4142
DUP5177
DUP6165
DUP7147
DUP8157
DUP9138
DUP10174
DUP11141
DUP12144
DUP13157
DUP14143
DUP15237
DUP16149
SWAP1141
SWAP2156
SWAP3145
SWAP4135
SWAP5115
SWAP6146
SWAP7199
SWAP8130
SWAP9160
SWAP10134
SWAP11147
SWAP12128
SWAP13121
SWAP14114
SWAP15197
SWAP16128
LOG0100
LOG1500
LOG2500
LOG3500
LOG4500
PUSH0
DUP0
SWAP0
CREATE2094
CALL5000
CALLCODE4000
RETURN0
DELEGATECALL696
CREATE210000
STATICCALL10000
REVERT0
SELFDESTRUCT0
BASEFEE198
BLOBBASEFEE120
BLOBHASH165
TSTORE280
TLOAD220
MCOPY250

Precompiled contracts computation cost table

Input is a byte array input of a precompiled contract.

AddressPrecompiled contractsComputation Cost
0x01ecrecover113,150
0x02sha256hashnumOfWords(input) / 32 * 100 + 1,000
0x03ripemd160hashnumOfWords(input) / 32 * 10 + 100
0x04dataCopy0
0x05bigModExp查看代码 此处
0x06bn256Add8,000
0x07bn256ScalarMul100,000
0x08bn256PairingnumOfPairings(input) * 1,000,000 + 2,000,000
0x09blake2fbigEndian(getRounds(input[0:4])) * 10 + 10,000
0x0Akzg2,200,000
0x3FDvmLog10
0x3FEfeePayer10
0x3FFvalidateSendernumOfSigs(input) * 180,000 + 10,000

Hardfork Changes

HardforkNew itemsChanges
Cancun EVMBLOBBASEFEE (0x49)
BLOBHASH (0x50)
TSTORE (0x5c) opcode
TLOAD (0x5d)
MCOPY (0x5e)
kzg (0x0a) precompiled contract
提高计算成本限制
从 100,000,000 提高到 150,000,000

降低某些操作码的计算成本
由于 CPU 性能提高
-Sdiv (0x05):739 -> 360
-Mod (0x06):812 -> 320
-Addmod (0x08):1410 -> 360
-Mulmod (0x09):1760 -> 700
-Exp (0x0A):5000 -> 720
-Sha3 (0x20): 2465 -> 560
-Mstore8 (0x53):5142 -> 230
-Log1, Log2, Log3, Log4 (0xA1-0xA4):1000 -> 500

由于数据库大小增加,某些操作码的计算成本会增加

-SLOAD (0x54):835 -> 2550
-SSTORE (0x55):1548 -> 2510
Shanghai EVMPUSH0 (0x5f) opcode
KoremodExp (0x05) 预编译合同
使用新的气体计算逻辑。
计算成本也受到影响。
更加准确。
London EVMBaseFee (0x48) opcode
Istanbul EVMCHAINID (0x46) opcode
SELFBALANCE (0x47) opcode
blake2f (0x09) precompiled contract
降低过高操作码的计算成本
- ADDMOD (0x08):3349 -> 1410
- MULMOD (0x09):4757 -> 1760
- XOR (0x18):657 -> 454
- NOT (0x19):1289 -> 364
- SHL (0x1B): 1603 -> 478
- SHR (0x1C):1815 -> 834
让这个页面变得更好