跳至主要內容
本頁面使用機器翻譯自英語,可能包含錯誤或不清楚的語言。如需最準確的信息,請參閱英文原文。由於更新頻繁,部分內容可能與英文原文有出入。請加入我們在 Crowdin 上的努力,幫助我們改進本頁面的翻譯。 (Crowdin translation page, Contributing guide)

計算成本

由於 Kaia 的目標是保持 1 秒的區塊時間,因此必須對事務的執行時間進行管理。 以下是實現這一目標的三種方法:

  1. 限制交易的氣體限值
  2. 限制事務的執行時間
  3. 限制交易的計算成本

限制交易的氣體上限並不是一個可行的解決方案,因為氣體的概念代表了區塊鏈平臺中各種資源(如計算、存儲、網絡帶寬等)當前的交換價值。 它不適合作為衡量事務執行時間的指標。

限制交易的執行時間也不可行,因為區塊鏈平臺上不同節點的執行時間可能不同。 例如,我們將事務的執行時間限制為 100 毫秒。 如果一個節點在 90 毫秒內執行了一個事務,而另一個節點在 110 毫秒內執行了該事務,則這兩個節點無法達成共識。 因此,這種解決方案並不合適。

最後一種方法是限制交易的計算成本。 我們根據每個 EVM 操作碼的實際執行時間對其計算成本進行建模,並限制一個事務的計算成本總和。 通過這種方法,我們可以排除其他因素,只計算歸一化的執行時間單位,節點也能達成共識。

因此,我們為 Kaia 選擇了第三種方案。 計算成本上限為 100,000,000 美元,但隨著 CPU 計算性能的提高,坎昆 EVM 硬分叉後上限已提高到 150,000,000 美元。 該限制值由平臺決定,因此開發人員應瞭解交易的計算成本。 To calculate the computation cost of a transaction, Kaia provides kaia_estimateComputationCost. The usage is almost the same as kaia_estimateGas.

備註

與硬叉相關的計算成本變更可在本頁底部找到。 轉到 Hardfork Changes

計算成本限額

在執行事務時,一系列操作碼或預編譯合約按順序執行。 為了限制事務的執行時間,我們根據實際執行時間為操作碼和預編譯合約建立了一個確定性的執行時間計算模型。

根據這一模型,運算代碼和預編譯合同的預定計算成本值會被添加到總計算成本中。 If the total value exceeds computation cost limit, transaction execution is aborted and returns ComputationCostLimitReached(0x0a) error.

在設置計算成本限制值時,如果 --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
讓這個頁面變得更好