계산 비용
카이아는 1초 블록타임을 목표로 하고 있기 때문에 트랜잭션의 실행 시간을 관리해야 합니다. 이를 달성하기 위한 세 가지 접근 방식이 있습니다:
1. 거래 가스 한도 제한(카이아 제외)
트랜잭션의 가스 한도를 제한하는 것은 가스 개념이 연산, 스토리지, 네트워크 대역폭 등 블록체인 플랫폼의 다양한 리소스의 현재 교환 가치를 나타내기 때문에 실현 가능한 해결책이 아니었습니다. 트랜잭션 실행 시간을 측정하는 지표로 적합하지 않습니다.
2. 트랜잭션 실행 시간 제한(카이아 제외)
트랜잭션의 실행 시간은 블록체인 플랫폼의 노드마다 다를 수 있기 때문에 트랜잭션의 실행 시간을 제한하는 것 역시 가능하지 않았습니다. 예를 들어 트랜잭션의 실행 시간을 100ms로 제한하는 경우를 생각해 보겠습니다. 한 노드가 트랜잭션을 90초 안에 실행하고 다른 노드가 110초 안에 실행한다면 두 노드는 합의에 도달할 수 없습니다. 따라서 이 솔루션은 적절하지 않습니다.
3. 블록 실행 시간 제한(카이아에서 적용)
카이아에는 검증되지 않은 블록 실행 시간 제한이 있습니다. 유효성 검사자 간에 실행 시간을 합의할 수 없으므로 이 제한은 블록 유효성 검사의 대상 이 아닙니다. 단, 블록 제안자는 블록 실행 시간 제한을 시행해야 합니다. 제안자는 트랜잭션이 250ms 이내에 실행이 완료될 때까지만 트랜잭션을 포함해야 합니다(블록생성시간제한). 가상의 장기 실행 트랜잭션이 영원히 거부되는 것을 방지하기 위해 블록의 첫 번째 트랜잭션은 예외로 처리됩니다. 그러나 첫 번째 트랜잭션은 여전히 계산 비용에 의해 제한되므로 지나치게 긴 시간을 소비할 수 없습니다. 또 다른 면제 대상은 KIP-245 번들입니다.
4. 트랜잭션 계산 비용 제한(카이아에서 적용)
실제 실행 시간을 기준으로 각 EVM 연산 코드의 계산 비용을 모델링하고 트랜잭션의 계산 비용 합계를 제한합니다. 이 접근 방식을 사용하면 다른 요소를 제거하고 정규화된 실행 시간 단위만 계산하므로 노드들도 합의에 도달할 수 있습니다. 연산 비용 제한은 100,000,000(OpcodeComputationCostLimit)이었으나, CPU 연산 성능이 향상됨에 따라 칸쿤 EVM 하드포크 이후 150,000,000(OpcodeComputationCostLimitCancun)으로 제한이 상향되었습니다. 이 제한 값은 플랫폼에 따라 결정되므로 개발자는 트랜잭션의 계산 비용을 알고 있어야 합니다. 트랜잭션의 계산 비용을 계산하기 위해 Kaia는 kaia_estimateComputationCost를 제공합니다. 사용법은 kaia_estimateGas와 거의 동일합니다.
계산 비용과 관련된 하드포크 변경 사항은 이 페이지 하단에서 확인할 수 있습니다. 하드포크 변경사항으로 이동합니다.
계산 비용 제한
트랜잭션을 실행할 때 일련의 옵코드 또는 미리 컴파일된 컨트랙트가 순차적으로 실행됩니다. 트랜잭션의 실행 시간을 제한하기 위해 실제 실행 시간을 기반으로 옵코드와 사전 컴파일된 컨트랙트에 대한 결정론적 실행 시간 계산 모델을 만들었습니다.
이 모델을 기반으로 옵코드와 미리 컴파일된 컨트랙트에 대해 미리 정해진 계산 비용 값이 총 계산 비용에 추가됩니다. 총 값이 계산 비용 한도를 초과하면 트랜잭션 실행이 중단되고 ComputationCostLimitReached(0x0a) 오류가 반환됩니다.
연산 비용 제한 값을 설정할 때 --opcode-computation-cost-limit
플래그 값이 0으로 설정되지 않았다면 이 값을 제한값으로 설정합니다. 이 값이 0이면 각 특정 하드포크에 정의된 기본 계산 비용 제한 값으로 설정됩니다.
예외적으로 call/estimateGas/estimateComputationCost의 계산 비용의 제한은 없으며 플래그나 하드포크 값의 영향을 받지 않습니다. 그러나 가스 한도와 같은 다른 제한 사항으로 인해 실행이 중단될 수 있습니다.
연산 코드 계산 비용
아래 표는 EVM 연산 코드의 계산 비용을 보여줍니다. 계산 비용은 실험을 기반으로 결정되었습니다.
연산 코드 | 계산 비용 |
---|---|
STOP | 0 |
ADD | 150 |
MUL | 200 |
SUB | 219 |
DIV | 404 |
SDIV | 360 |
MOD | 320 |
SMOD | 560 |
ADDMOD | 360 |
MULMOD | 700 |
EXP | 720 |
SIGNEXTEND | 481 |
LT | 201 |
GT | 264 |
SLT | 176 |
SGT | 222 |
EQ | 220 |
ISZERO | 165 |
AND | 288 |
OR | 160 |
XOR | 454 |
NOT | 364 |
BYTE | 589 |
SHL | 478 |
SHR | 498 |
SAR | 834 |
SHA3 | 560 |
ADDRESS | 284 |
BALANCE | 1407 |
ORIGIN | 210 |
CALLER | 188 |
CALLVALUE | 149 |
CALLDATALOAD | 596 |
CALLDATASIZE | 194 |
CALLDATACOPY | 100 |
CODESIZE | 145 |
CODECOPY | 898 |
GASPRICE | 131 |
EXTCODESIZE | 1481 |
EXTCODECOPY | 1000 |
RETURNDATASIZE | 10 |
RETURNDATACOPY | 40 |
EXTCODEHASH | 1000 |
BLOCKHASH | 500 |
COINBASE | 189 |
TIMESTAMP | 265 |
NUMBER | 202 |
PREVRANDAO | 1498 |
GASLIMIT | 166 |
CHAINID | 120 |
SELFBALANCE | 374 |
POP | 140 |
MLOAD | 376 |
MSTORE | 288 |
MSTORE8 | 230 |
SLOAD | 2550 |
SSTORE | 2510 |
JUMP | 253 |
JUMPI | 176 |
PC | 147 |
MSIZE | 137 |
GAS | 230 |
JUMPDEST | 10 |
PUSH0 | 80 |
PUSH1 | 120 |
PUSH2 | 120 |
PUSH3 | 120 |
PUSH4 | 120 |
PUSH5 | 120 |
PUSH6 | 120 |
PUSH7 | 120 |
PUSH8 | 120 |
PUSH9 | 120 |
PUSH10 | 120 |
PUSH11 | 120 |
PUSH12 | 120 |
PUSH13 | 120 |
PUSH14 | 120 |
PUSH15 | 120 |
PUSH16 | 120 |
PUSH17 | 120 |
PUSH18 | 120 |
PUSH19 | 120 |
PUSH20 | 120 |
PUSH21 | 120 |
PUSH22 | 120 |
PUSH23 | 120 |
PUSH24 | 120 |
PUSH25 | 120 |
PUSH26 | 120 |
PUSH27 | 120 |
PUSH28 | 120 |
PUSH29 | 120 |
PUSH30 | 120 |
PUSH31 | 120 |
PUSH32 | 120 |
DUP1 | 190 |
DUP2 | 190 |
DUP3 | 176 |
DUP4 | 142 |
DUP5 | 177 |
DUP6 | 165 |
DUP7 | 147 |
DUP8 | 157 |
DUP9 | 138 |
DUP10 | 174 |
DUP11 | 141 |
DUP12 | 144 |
DUP13 | 157 |
DUP14 | 143 |
DUP15 | 237 |
DUP16 | 149 |
SWAP1 | 141 |
SWAP2 | 156 |
SWAP3 | 145 |
SWAP4 | 135 |
SWAP5 | 115 |
SWAP6 | 146 |
SWAP7 | 199 |
SWAP8 | 130 |
SWAP9 | 160 |
SWAP10 | 134 |
SWAP11 | 147 |
SWAP12 | 128 |
SWAP13 | 121 |
SWAP14 | 114 |
SWAP15 | 197 |
SWAP16 | 128 |
LOG0 | 100 |
LOG1 | 500 |
LOG2 | 500 |
LOG3 | 500 |
LOG4 | 500 |
PUSH | 0 |
DUP | 0 |
SWAP | 0 |
CREATE | 2094 |
CALL | 5000 |
CALLCODE | 4000 |
RETURN | 0 |
DELEGATECALL | 696 |
CREATE2 | 10000 |
STATICCALL | 10000 |
REVERT | 0 |
SELFDESTRUCT | 0 |
BASEFEE | 198 |
BLOBBASEFEE | 120 |
BLOBHASH | 165 |
TSTORE | 280 |
TLOAD | 220 |
MCOPY | 250 |