이전글
EVM
이번 글에서는 이더리움의 핵심인 EVM에 대해 알아보겠습니다.
I. 컴퓨터 구조
EVM에 대해 알아보기 전에 먼저 일반적인 컴퓨터의 구조를 간단하게 알아보겠습니다.
컴퓨터에서 연산을 실행하기 위해서는 먼저 디스크에서 메모리로 데이터와 코드를 불러와야 합니다. 그다음 메모리의 데이터를 CPU 레지스터로 옮기고, 이 레지스터에서 데이터를 불러와 연산을 진행합니다. 물론 메모리와 레지스터 사이에 캐시도 존재하지만, 이 부분은 생략하겠습니다.
CPU는 크게 ALU, 레지스터, 제어 장치로 구성되어 있습니다. 제어 장치는 명령어 해석과 연산 순서 결정을 담당합니다. 제어 장치에서 해석된 명령어에 의해 레지스터에서 특정 값을 불러와 ALU에서 연산을 수행합니다. 핵심 연산을 수행하는 ALU와 레지스터 등을 데이터패스라고 부릅니다. 지금까지의 내용을 정리하면 다음과 같습니다.
이제 CPU 내부의 동작을 조금 더 자세히 들여다보겠습니다. CPU는 크게 다음과 같은 과정으로 연산을 수행합니다.
가장 먼저 등장하는 것은 PC입니다. PC는 Program Counter의 약자로, 현재 실행해야 할 명령어 위치를 가리키고 있습니다. 연산이 시작되면 PC가 가리키는 명령어를 불러온 후 PC를 증가시켜 다음 명령어를 가리키도록 합니다.
그다음 PC가 가리키고 있는 한 줄의 명령어를 메모리에서 불러옵니다. 각 명령어는 실제 어떤 동작을 할 것인지 나타내는 opcode와 사용할 레지스터 주소 등을 가지고 있습니다. 이 값을 이용하여 레지스터에서 값을 불러와 ALU에 전달합니다. ALU는 전달받은 값을 이용하여 opcode에서 요구하는 적절한 연산을 수행합니다. 이후 이 값을 opcode에 따라 레지스터에 저장하거나, 해당 값을 이용하여 메모리에 값을 저장하거나 불러옵니다.
참고로 위 내용은 CPU의 실제 연산 과정을 매우 간략하게 표현한 것으로, 브랜치 명령어 등이 생략되었습니다.
II. EVM
EVM은 Ethereum Virtual Machine의 약자로, 스마트 컨트랙트 코드를 통해 이더리움의 상태를 관리하기 위한 가상 머신입니다. EVM은 이더리움이 추구하는 월드 컴퓨터를 구현하려는 목적인 만큼, 실제 컴퓨터 구조를 모방하였습니다. EVM의 전체적인 구조는 다음과 같습니다.
만약 새로운 트랜잭션이 EVM에 들어온다면 먼저 스택과 메모리를 초기화 합니다. 그리고 컨트랙트 계정에 저장되어 있는 EVM 코드를 불러옵니다. 이후 PC가 실행할 코드를 가리키고, 하나의 opcode 씩 연산이 실행됩니다. 연산을 실행하는 과정에서는 비트코인과 동일하게 스택을 사용하며, opcode마다 할당되어 있는 가스가 사용됩니다. 연산 과정 중에는 일부 데이터를 메모리에 저장하고 불러올 수 있습니다. 또한 코드에 따라서 트랜잭션의 데이터 필드를 참조할 수 있습니다. 모든 과정이 정상적으로 진행된다면, 계정의 전역 상태가 변경될 것입니다.
예를 들어 다음과 같은 opcode들을 EVM에서 실행해 보겠습니다.
0x60036100046009910101602052
위는 아래처럼 표현할 수 있습니다.
PUSH1 0x03 PUSH2 0x0004 PUSH1 0x09 SWAP2 ADD ADD PUSH1 0x20 MSTORE
이제 스택과 메모리를 이용하여 연산을 진행해 보겠습니다. 먼저 PUSH1 opcode를 실행합니다. PUSHn opcode는 이어지는 n 바이트의 데이터를 스택에 담습니다.
이어서 PUSH2와 PUSH1을 같은 방식으로 실행합니다.
그다음 SWAP2를 실행합니다. SWAPn은 스택 가장 위의 값과 해당 값보다 n 만큼 아래 있는 값을 서로 바꿉니다.
이어서 나오는 ADD는 스택의 가장 위에 속한 2개의 값을 더합니다.
PUSH1 명령어를 실행한 후 MSTORE 명령어를 실행합니다. MSOTRE은 스택 가장 위의 값을 주소로, 그다음 값을 데이터로 간주하여 EVM 메모리에 저장합니다.
EVM은 이러한 방식으로 동작하여 연산을 처리합니다. 메모리는 EVM에서 임시 저장소 역할을 하며, PC는 브랜치 연산 등 실행해야 할 명령어의 순서가 바뀔 경우 이동하여 반복문이나 조건문 등의 수행을 돕습니다.
지금 소개한 opcode 이외에도 계정 저장소에 접근하는 등의 다양한 이더리움 opcode들이 존재합니다. 더 많은 opcode는 아래 사이트에서 확인할 수 있습니다.
지금까지 EVM에 대해 알아봤습니다. 이러한 EVM을 작동시키고 스마트 컨트랙트를 사용하기 위해서는, EOA가 아닌 컨트랙트 계정이 필요합니다. 다음글에서는 컨트랙트 계정에 대해 알아보겠습니다.
감사합니다.
다음글
'이더리움 > 이더리움과 월드 컴퓨터' 카테고리의 다른 글
[이더리움과 월드 컴퓨터] 2-5. 솔리디티 (0) | 2023.02.18 |
---|---|
[이더리움과 월드 컴퓨터] 2-4. 컨트랙트 계정 (0) | 2023.02.14 |
[이더리움과 월드 컴퓨터] 2-2. EOA (0) | 2023.02.07 |
[이더리움과 월드 컴퓨터] 2-1. 주소 (0) | 2023.02.06 |
[이더리움과 월드 컴퓨터] 1-4. 스마트 컨트랙트와 댑(DApp) (0) | 2023.02.05 |