[Blockchain] 스마트 컨트랙트 EVM Opcode 분석
EVM / Opcode / 바이트코드 / solc
EVM (Ethereum Virtual machine)
-
EVM은 ‘스마트 컨트랙트의 Byte Code’를 실행하는
32Byte Stack 기반의 실행 환경으로 최대 크기는 1024Byte이다 -
EVM은 솔리디티를 읽을 수 없다
-
그래서 작성한 솔리디티 코드를 ‘solc’를 이용해 컴파일하여
EVM이 읽을 수 있는 '바이트코드 형태'로 만든다 -
이더리움의 각 노드는 EVM을 포함하고 있으며,
EVM을 통해 컨트랙트의 Byte Code를 👉 Op code로 변환 후 내부에서 실행한다
EVM 에서 사용되는 Opcode 바이트코드
0x00 👉 STOP 👉 실행중지 (Halts execution)
0x01 👉 ADD 👉 더하기 (Addition operation)
0x02 👉 MUL 👉 곱하기 (Subtraction operation)
0x03 👉 SUB 👉 빼기 (Multiplication operation)
0x04 👉 DIV 👉 나누기 (Integer division operation)
0x05 👉 SDIV 👉 부호가 있는 정수 (Signed integer)
0x06 👉 MOD 👉 Modulo
0x07 👉 SMOD 👉 Signed modulo
0x08 👉 ADDMOD 👉 Modulo
0x09 👉 MULMOD 👉 Modulo
‘Opcode’ 를 효율적으로 저장하기 위해,
‘Opcode’ 는 바이트코드(Bytecode)로 인코딩된다
모든 Opcode에는 1바이트가 할당된다
예제 1)
바이트 코드 0x6008600101600304 의 동작 결과 값은 👉 3
예제 2)
바이트 코드 0x6003600502 의 동작 결과 값은 👉 15
예제 3)
바이트 코드 0x6002600303 의 동작 결과 값은 👉 -1
-
EVM은 Opcode의 program counter를 0부터 증가시키면서 연산을 수행한다
-
최종적으로 error가 나거나 STOP / RETURN 명령어 또는
실행이 완료될 때까지 Op코드를 계속 실행하면서 Gas를 소비한다 -
만약 Gas가 충부하지 않거나 / 잘못된 명령어이거나 /
스택의 항목이 1024를 넘어 overflow가 발생하는 등의 예외 상황이 발생하면
👉 실행이 중단되고 모늗 상태변화 내용은 취소된다 -
이미 소비된 Gas는 돌려받지 못한다