EVM

허정·2022년 3월 15일
0

블록체인

목록 보기
26/38

1. VM이란

Virtual Machine은 우리가 짠 코드와 우리 컴퓨터 사이에서 추상화 수준을 생성합니다. 컴퓨터라는 하드웨어마다 우리가 작성한 코드가 다르게 동작하면 곤란한 상황이 발생합니다. 그래서 보통은 하드웨어 위에 가짜 컴퓨터를 하나 만들어둡니다. 그렇게 어떤 컴퓨터에서라도 동일하게 동작하게 해주는 것이 VM입니다. 이 가상 머신은 프로그램과 하드웨어 사이에 존재하는 계층으로, 소프트웨어의 이식성을 향상시키고, 애플리케이션이 서로 분리되어 독립적으로 실행할 수 있도록 합니다.

2. EVM

Ethereum Virtual Machine은 우리가 짠 코드와 이더리움 블록체인 사이에 있는 가상 머신으로, 블록체인에서 코드가 실행될 수 있도록 합니다. 이더리움 스마트 컨트랙트에 기반한 dApp은 솔리디티라는 언어로 작성됩니다. 우리는 dApp을 이더리움 네트워크에 올려야 합니다.
그런데 솔리디티 언어는 고급 언어이기 때문에 EVM이 이해하기 어렵습니다. EVM은 솔리디티를 읽을 수 없기 때문에, 우리가 작성한 솔리디티 코드를 solc를 이용해 컴파일하여 EVM이 읽을 수 있는 바이트코드 형태로 만듭니다. 그리고 이 바이트코드를 Geth를 이용해 이더리움 네트워크에 올립니다. 즉, 솔리디티 -> 바이트코드 -> Opcode 흐름입니다.

블록체인에 저장된 바이트코드 형태의 dApp은 EVM에서 실행하게 되며, EVM에서는 바이트코드를 Opcode로 변환하여 실행합니다. 솔리디티로 작성된 스마트 컨트랙트는 EVM에서 동작하기 때문에 특정 운영체제나 하드웨어에 종속되지 않습니다.

3. 바이트코드 동작방식

Opcode를 효율적으로 저장하기 위해, Opcode는 바이트코드(Bytecode)로 인코딩됩니다. 모든 Opcode에는 1바이트가 할당됩니다.
(ex) STOP은 0x00 입니다.

예를 들어, 0x6001600101 이라는 바이트코드가 있다고 합시다.

코드가 실행되면 바이트코드는 바이트로 쪼개집니다. 1바이트는 2개의 16진수 문자입니다. 0x60~0x7f(opcode PUSH1~PUSH32) 사이의 바이트는 데이터를 스택에 넣기 때문에 다른 Opcode와는 다르게 처리됩니다.

첫번째 명령어의 첫번째 바이트 0x60는 PUSH1 연산입니다. PUSH1 연산 뒤에는 스택에 추가할 데이터가 옵니다. 따라서 명령어의 두번째 바이트 0x01을 스택에 추가합니다.
두번째 명령어는 첫번째 명령어와 같기 때문에 동일하게 스택에 0x01이 쌓입니다.
세번째 병령어 0x01은 ADD연산입니다. 이 연산은 스택에서 요소 두 개를 꺼내오고 두 요소의 합을 스택에 추가합니다. 스택에서 0x01, 0x01 두 개를 꺼내오고 더한 결괏값 0x02를 스택에 추가합니다.

0개의 댓글