본문 바로가기
블록체인

EVM (Ethereum Virtual Machine)

by 제이제이_은재 2022. 7. 7.
728x90

 

 

💡EVM (Ethereum Virtual Machine)

 

✓ VM 이란?

 

VM은 우리가 짠 코드와 우리 컴퓨터(하드웨어) 사이에서 추상화 수준을 생성한다. 만약, 우리가 작성한 코드가 맥북과 LG 그램에서 각기 다르게 동작하면 어떻게 될까? 우리는 각 하드웨어에 맞게 코드를 수정해야 한다. 세상에는 너무 많은 종류의 컴퓨터가 있기 때문에 이러한 작업은 너무 번거롭다. 또 내가 짠 프로그램 A와 프로그램 B가 동시에 실행되다가 서로 충돌될 수도 있다. 그래서 보통은 하드웨어 위에 가짜 컴퓨터를 하나 만들어둔다. 우리가 맥북을 쓰든 그램을 쓰든 동일하게 동작할 수 있도록 가짜로 컴퓨터를 만들어 실행한다. 이 가짜 컴퓨터는 맥북에서나 그램에서 동일하게 동작한다. 실제 실행은 하드웨어에서 일어나는 것이지만, 중간에 있는 가짜 컴퓨터 때문에 어떤 하드웨어이든 동일하게 동작하는 것이다. 이 가짜 컴퓨터는 실제로는 존재하지 않기 때문에 가상 머신이라고 한다. 이 가상 머신은 프로그램과 하드웨어 사이에 존재하는 계층으로, 소프트웨어의 이식성을 향상시키고 애플리케이션이 서로 분리되어 독립적으로 실행할 수 있도록 한다.

 

✓ EVM 이란?

 

EVM은 우리가 짠 코드와 이더리움 블록체인 사이에 있는 가상 머신으로, 블록체인에서 코드가 실행될 수 있도록 한다. 이더리움 스마트 컨트랙트에 기반한 dApp은 솔리디티라는 언어로 작성되고, 우리는 솔리디티로 작성된 dApp을 이더리움 네트워크에 올려야 한다.

 

 

하지만, 솔리디티 언어는 고급 언어이기 때문에 EVM이 바로 해석하기 어렵다. 말 그대로 EVM은 가상 머신, 기계이기 때문에 언어를 바이트코드(bytecode) 로 변환해주어야 한다. 이후 바이트 코드를, EVM이 해석할 수 있는 OP 코드로 변환하고, 그 이후 실행할 수 있다.

먼저, 우리가 작성한 솔리디티 코드를 solc를 이용해 컴파일하여 EVM이 읽을 수 있는 바이트코드 형태로 만든다. 그리고 이 바이트코드를 Geth를 이용해 이더리움 네트워크에 올린다. 즉, 솔리디티 코드 -> 바이트코드 -> Opcode 의 흐름을 갖게 된다.

 

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

 

 

✓ 바이트코드 동작방식

 

내부적으로 EVM은 명령어 집합(Opcode)을 사용하여 특정한 작업을 실행한다. Opcode를 효율적으로 저장하기 위해, Opcode는 바이트코드로 인코딩된다. 모든 Opcode에는 1바이트가 할당된다. 100개가 넘는 고유한 Opcode가 있으며, 이는 충분한 리소스만 있다면 무엇이든 계산할 수 있다. Opcode를 크게 7가지로 나눈다면 아래와 같다.

 

* Opcode란?

Opcode는 로우 레벨 기계 언어로, 약 140 종류의 연산이 있다. Opcode의 연산 종류는 다음과 간다.

스택 조작 연산: POP, PUSH, DUP, SWAP

산술/비교/비트연산: ADD, SUB, GT, LT, OR

환경 연산: CALLER, CALLVE, NUMBER

메모리 조작 연산: MLOAD, MSTORE, MSTORE8, MSIZE

스토리지 조작 연산: SLOAD, SSTORE

프로그램 카운터 관련 연산: JUMP, JUMPI, PC, JUMPDEST

작업 중지 연산: STOP, RETURN, REVERT, INVALID, SELEDESTRUCT

 

STOP운 0x00 이다.

 

 

예를 들어 0x6001600101 이라는 바이트코드가 있다고 하자. 코드가 실행되면 바이트코드는 바이트로 쪼개진다. 0x60 ~ 0x7f 사이의 바이트는 데이터를 스택에 넣기 때문에 다른 Opcode와는 다르게 처리된다. 첫 번째 명령어의 첫 번째 바이트 0x60은 PUSH1 연산이다. PUSH1 연산 뒤에는 스택에 추가할 데이터가 온다. 따라서 명령어의 두 번째 바이트 0x01을 스택에 추가한다. 두 번째 명령어는 첫 번째 명령어와 같기 때문에 동일하게 스택에 0x01이 쌓인다. 세 번째 명령어 0x01은 ADD 연산이다. 이 연산은 스택에서 요소 두 개를 꺼내고오고 두 요소의 합을 스택에 추가한다. 스택에서 0x01, 0x01 두 개를 꺼내오고 더한 결괏값 0x02를 스택에 추가한다.

'블록체인' 카테고리의 다른 글

이중지불 문제  (0) 2022.08.04
이더리움 스마트 컨트랙트의 실행 비용  (1) 2022.07.11
솔리디티(Solidity)란?  (0) 2022.07.07
이더리움에서의 스마트 컨트랙트란?  (0) 2022.07.07

댓글