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는 돌려받지 못한다


참고 했던 사이트 🖥