本文へスキップ
このページは英語からの機械翻訳を使用しており、誤りや不明瞭な表現が含まれている可能性があります。最も正確な情報については、オリジナルの英語版をご覧ください。頻繁な更新のため、一部のコンテンツはオリジナルの英語になっている可能性があります。Crowdinでの取り組みに参加して、このページの翻訳改善にご協力ください。 (Crowdin translation page, Contributing guide)

計算コスト

Kaiaは1秒のブロック時間を維持することを目標としているので、トランザクションの実行時間は管理されなければならない。 そのための3つのアプローチを紹介しよう:

  1. トランザクションのガス制限
  2. トランザクションの実行時間の制限
  3. トランザクションの計算コストを制限する

ガスという概念は、計算、ストレージ、ネットワーク帯域幅など、ブロックチェーンプラットフォームの様々なリソースの現在の交換価値を表しているため、トランザクションのガス上限を制限することは実現可能なソリューションではなかった。 トランザクションの実行時間の指標としては適さない。

トランザクションの実行時間はブロックチェーンプラットフォーム上のノード間で異なる可能性があるため、実行時間を制限することも実現不可能であった。 例えば、トランザクションの実行時間を100ミリ秒に制限する場合を考えてみよう。 あるノードが90ミリ秒でトランザクションを実行し、別のノードが110ミリ秒で実行した場合、2つのノードはコンセンサスに達することができない。 したがって、この解決策は適切ではない。

最後のアプローチは、トランザクションの計算コストを制限することである。 各EVMオペコードの計算コストを実際の実行時間に基づいてモデル化し、トランザクションの計算コストの合計を制限した。 このアプローチでは、他の要因を排除し、正規化された実行時間単位のみをカウントし、ノードは同様にコンセンサスを得ることができる。

したがって、カイアには3番目の選択肢を選びました。 計算コストの上限は100,000,000だったが、CPUの計算性能が向上したため、Cancun EVMのハードフォーク後は上限が150,000,000に引き上げられた。 この制限値はプラットフォームによって決定されるので、開発者はトランザクションの計算コストに注意すべきである。 トランザクションの計算コストを計算するために、カイアはkaia_estimateComputationCostを提供する。 使い方はkaia_estimateGasとほぼ同じ。

備考

計算コストに関連するハードフォークの変更は、このページの一番下にあります。 ハードフォーク変更へ。

計算コストの上限

トランザクションの実行時には、一連のオペコードまたはコンパイル済みのコントラクトが順次実行される。 トランザクションの実行時間を制限するために、実実行時間に基づくオペコードとコンパイル済みコントラクトの決定論的実行時間計算モデルを作成した。

このモデルに基づいて、オペコードとプリコンパイル・コントラクトに対する所定の計算コスト値が総計算コストに加算される。 合計値が計算コスト制限を超えた場合、トランザクションの実行は中断され、ComputationCostLimitReached(0x0a) エラーが返される。

計算コストの制限値を設定する際、--opcode-computation-cost-limitフラグの値が0以外であれば制限値として設定する。 ゼロの場合、各ハードフォークに定義されたデフォルトの計算コスト制限に設定される。 例外的に、call/estimateGas/estimateComputationCostの上限は常に無制限に設定され、フラグやハードフォーク値の影響を受けない。 ただし、ガスキャップのような他の制限により、実行が中断されることはある。

Opcodeの計算コスト

下表は、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) precompiled contract
新しいガス計算ロジックを使用。
計算コストも影響する。
より正確になる。
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
ページを改善してください。