본문으로 건너뛰기

계산 비용

카이아는 1초 블록타임을 목표로 하고 있기 때문에 트랜잭션의 실행 시간을 관리해야 합니다. 이를 달성하기 위한 세 가지 접근 방식이 있습니다:

  1. 거래 가스 한도 제한
  2. 트랜잭션의 실행 시간 제한
  3. 트랜잭션의 계산 비용 제한

트랜잭션의 가스 한도를 제한하는 것은 가스 개념이 연산, 스토리지, 네트워크 대역폭 등 블록체인 플랫폼의 다양한 리소스의 현재 교환 가치를 나타내기 때문에 실현 가능한 해결책이 아니었습니다. 트랜잭션 실행 시간을 측정하는 지표로 적합하지 않습니다.

트랜잭션의 실행 시간은 블록체인 플랫폼의 노드마다 다를 수 있기 때문에 트랜잭션의 실행 시간을 제한하는 것 역시 가능하지 않았습니다. 예를 들어 트랜잭션의 실행 시간을 100밀리초로 제한하는 경우를 생각해 보겠습니다. 한 노드가 트랜잭션을 90초 안에 실행하고 다른 노드가 110초 안에 실행한다면 두 노드는 합의에 도달할 수 없습니다. 따라서 이 솔루션은 적절하지 않습니다.

마지막 접근 방식은 트랜잭션의 계산 비용을 제한하는 것입니다. 실제 실행 시간을 기준으로 각 EVM 연산 코드의 계산 비용을 모델링하고 트랜잭션의 계산 비용 합계를 제한합니다. 이 접근 방식을 사용하면 다른 요소를 제거하고 정규화된 실행 시간 단위만 계산하므로 노드들도 합의에 도달할 수 있습니다.

따라서 저희는 카이아에 세 번째 옵션을 선택했습니다. 계산 비용 제한은 100,000,000이었으나, CPU 컴퓨팅 성능이 향상됨에 따라 Cancun EVM 하드포크 이후 150,000,000으로 제한이 상향되었습니다. 이 제한 값은 플랫폼에 따라 결정되므로 개발자는 트랜잭션의 계산 비용을 알고 있어야 합니다. 트랜잭션 비용을 계산하기 위해 Kaia는 klay_estimateComputationCost를 제공합니다. 사용법은 klay_estimateGas와 거의 동일합니다.

노트

계산 비용과 관련된 하드포크 변경 사항은 이 페이지 하단에서 확인할 수 있습니다. 하드포크 변경사항으로 이동합니다.

계산 비용 제한

트랜잭션을 실행할 때 일련의 옵코드 또는 미리 컴파일된 컨트랙트가 순차적으로 실행됩니다. 트랜잭션의 실행 시간을 제한하기 위해 실제 실행 시간을 기반으로 옵코드와 사전 컴파일된 컨트랙트에 대한 결정론적 실행 시간 계산 모델을 만들었습니다.

이 모델을 기반으로 옵코드와 미리 컴파일된 컨트랙트에 대해 미리 정해진 계산 비용 값이 총 계산 비용에 추가됩니다. 총 비용이 계산 비용 한도를 초과하면 트랜잭션 실행이 중단되고 ComputationCostLimitReached(0x0a) 오류가 반환됩니다.

연산 비용 제한 값을 설정할 때 --opcode-computation-cost-limit 플래그 값이 0으로 설정되지 않았다면 이 값을 제한값으로 설정합니다. 이 값이 0이면 각 특정 하드포크에 정의된 기본 계산 비용 제한 값으로 설정됩니다. 예외적으로 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

미리 컴파일된 컨트랙트 계산 비용 표

Input은 미리 컴파일된 컨트랙트의 바이트 배열 입력입니다.

주소미리 컴파일된 컨트랙트계산 비용
0x01ecrecover113,150
0x02sha256hashnumOfWords(input) / 32 * 100 + 1,000
0x03ripemd160hashnumOfWords(input) / 32 * 10 + 100
0x04dataCopy0
0x05bigModExpsee the code here
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

하드포크 변경 사항

하드포크신규 항목변경 사항
Cancun EVMBLOBBASEFEE (0x49)
BLOBHASH (0x50)
TSTORE (0x5c) opcode
TLOAD (0x5d)
MCOPY (0x5e)
kzg (0x0a) precompiled contract
increase the computation cost limit
from 100,000,000 to 150,000,000

reduce the computation cost of some opcodes
due to cpu performance increase
-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

increase the computation cost of some opcodes
due to increased database size
-SLOAD (0x54): 835 -> 2550
-SSTORE (0x55): 1548 -> 2510
Shanghai EVMPUSH0 (0x5f) opcode
KoremodExp (0x05) precompiled contract
use new gas calculation logic.
Computation cost also affected.
Become more accurate.
London EVMBaseFee (0x48) opcode
Istanbul EVMCHAINID (0x46) opcode
SELFBALANCE (0x47) opcode
blake2f (0x09) precompiled contract
reduce the computation cost of over-priced opcodes
- ADDMOD (0x08): 3349 -> 1410
- MULMOD (0x09): 4757 -> 1760
- XOR (0x18): 657 -> 454
- NOT (0x19): 1289 -> 364
- SHL (0x1B): 1603 -> 478
- SHR (0x1C): 1815 -> 834
페이지를 개선해 주세요