Opcode연산 코드
Opcode(Operation Code, 연산 코드)는 EVM(Ethereum Virtual Machine)이 실행하는 바이트코드의 최소 실행 단위다. 각 opcode는 1바이트(0x00~0xFF)로 표현되며, 스택 조작·산술 연산·스토리지 접근 등 특정 연산을 수행한다.
바이트코드와 Opcode의 관계
Solidity로 작성한 스마트 컨트랙트를 컴파일하면 EVM이 이해할 수 있는 바이트코드가 생성된다. 이 바이트코드의 각 바이트(16진수)가 특정 Opcode에 1:1로 대응된다.
| 바이트코드 | Opcode | 의미 |
|---|---|---|
| 0x60 | PUSH1 | 1바이트 값을 스택에 추가 |
| 0x01 | ADD | 스택 상위 두 값을 더함 |
| 0x02 | MUL | 스택 상위 두 값을 곱함 |
| 0x55 | SSTORE | 스토리지에 값 저장 |
| 0x54 | SLOAD | 스토리지에서 값 읽기 |
| 0x56 | JUMP | 특정 위치로 점프 |
| 0x00 | STOP | 실행 종료 |
| 0xf3 | RETURN | 데이터 반환 후 종료 |
EVM 스택 기반 실행 (역폴란드 표기법)
EVM은 LIFO(Last In First Out) 스택 기반 가상 머신이다. 모든 연산은 스택에서 값을 꺼내고(pop) 결과를 다시 넣는(push) 방식으로 동작한다. 이를 역폴란드 표기법(Reverse Polish Notation)이라 한다.
예시 — 2 + 2 × 2 = 6 계산:
주요 Opcode 분류
| 분류 | 예시 | 설명 |
|---|---|---|
| 스택 | PUSH1 | 값 추가·제거·복사·교환 |
| 산술 | ADD, SUB, MUL, DIV, MOD, EXP | 정수 연산 |
| 비교 | LT, GT, SLT, SGT, EQ, ISZERO | 비교 연산 |
| 비트 | AND, OR, XOR, NOT, SHL, SHR | 비트 연산 |
| 환경 | CALLER, CALLVALUE, GAS, TIMESTAMP, NUMBER | 트랜잭션·블록 정보 |
| 스토리지 | SLOAD, SSTORE | 영구 저장소 읽기/쓰기 |
| 메모리 | MLOAD, MSTORE, MSTORE8, MSIZE | 임시 메모리 |
| 제어 | JUMP, JUMPI, JUMPDEST, STOP, RETURN, REVERT | 실행 흐름 제어 |
| 호출 | CALL, STATICCALL, DELEGATECALL, CREATE, CREATE2 | 컨트랙트 호출/생성 |
| 해시 | SHA3(KECCAK256) | 해시 계산 |
| 로그 | LOG0~LOG4 | 이벤트 로그 기록 |
Gas 비용
각 Opcode마다 고정된 Gas 비용이 있다. 스토리지 접근이 가장 비싸고, 산술 연산은 저렴하다.
| Opcode | Gas 비용 | 비고 |
|---|---|---|
| ADD, SUB | 3 | 기본 산술 |
| MUL, DIV | 5 | 곱셈·나눗셈 |
| PUSH, POP | 2~3 | 스택 조작 |
| SLOAD | 800 (EIP-2929 이후 2100) | 스토리지 읽기 |
| SSTORE (신규 슬롯) | 20,000 | 스토리지 새 값 쓰기 |
| SSTORE (기존 슬롯 수정) | 2,900 | 기존 값 덮어쓰기 |
| CALL | 700+ | 외부 컨트랙트 호출 |
| CREATE | 32,000 | 컨트랙트 생성 |
| KECCAK256 | 30 + 6/word | 해시 계산 |
Method ID와 Opcode
함수 호출 시 calldata의 첫 4바이트는 Method ID다. 이는 "함수명(매개변수타입,...)"의 keccak-256 해시 앞 4바이트다.
EVM은 이 4바이트를 보고 어떤 함수를 실행할지 결정하며, 내부적으로 JUMPI opcode로 해당 함수 위치로 분기한다.
인라인 어셈블리 (Yul)
Solidity는 assembly { } 블록으로 직접 Opcode를 작성할 수 있다. 이를 인라인 어셈블리(Yul)라 한다.
인라인 어셈블리를 사용하는 이유:
- •Gas 최적화: 컴파일러가 생성하는 중간 코드 없이 순수 Opcode로 실행
- •저수준 메모리 접근: Solidity로는 불가능한 정밀한 메모리 조작
- •특수 Opcode 사용: returndatacopy, extcodesize 등 고급 opcode 직접 활용
관련 개념
- •EVM — Opcode를 실행하는 가상 머신
- •바이트코드 — Opcode의 16진수 시퀀스
- •Gas — 각 Opcode 실행 비용
- •컴파일 — 소스코드 → 바이트코드(Opcode) 변환
- •ABI — Opcode 호출 규약을 정의하는 인터페이스