無知

갈 길이 먼 공부 일기

기술 공부/블록체인

이더리움의 작동방식 (7) | EVM, 가상 머신

moozii 2022. 1. 5. 20:33

* 이 글은 How does Ethereum work, anyway? 라는 글을 읽어가며 이해한 바를 한국어로 번역하여 정리하는 글입니다. 시리즈의 형태로 끊어가며 업로드되었으니, 참고 부탁드립니다.

 

이더리움 블록체인의 구성 요소

 

이더리움 블록체인은, 

계정 / 상태 / 가스 및 수수료 / 상호작용 / 블록 / 상호작용의 집행 / 채굴 / 작업 증명 

등으로 구성된다. 

 

지난 글에 이어서 계속 설명한다.

 

7. 가상머신의 실행

실제 트랜잭션의 실행이 일어나는 가상 머신에 대해 알아보자. 

이 파트는 깊이 이해하지 않더라도 크게 무리가 없으니 가볍게 넘어가도록 하자.

 

https://ethereum.org/en/developers/docs/evm/

 

트랜잭션 실행을 진행하는 프로토콜의 일부에는 이더리움 가상 머신이 포함되어 있다.

이더리움 가상 머신은, 튜링 완전한 가상 머신이라 정의한 바 있다. 

이더리움 가상 머신은 튜링 완전 기계가 갖는 한계 외에도, 가스로 인해 제한된다는 특성이 있다.

예전에 튜링 완전 기계의 문제점으로 거론된 정지 문제 및 무한 반복 문제를 가스를 통해 해결됐다고 이야기한 바 있다.

 

나아가, 이더리움 가상 머신은 스택 기반의 구조를 지녔다. 

스택 기계는, LIFO, 마지막에 들어온 것이 먼저 나가는 구조로, 임시 값을 지닌다. 

스택 머신(stack machine)은 컴퓨터 과학에서 스택으로 알려진 FILO 메모리 버퍼의 푸시(push)와 리드오프(readoff), 팝(pop)을 통해서만 실행 제어가 전적으로 관리되는 계산 모형으로, 아주 적은 수의 프로세서 레지스터만을 요구한다.

https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D_%EB%A8%B8%EC%8B%A0

이더리움 가상 머신 속 스택 아이템의 크기는 256비트로, 스택의 최대 사이즈는 1024 아이템이다.

 

이더리움 가상 머신은 메모리를 지녀, 워드 주소 형태의 바이트 배열을 기반으로 아이템들을 저장한다. Volatile한 메모리, 휘발성 메모리이기 때문에, 정보를 영구히 저장하는 것은 아니다. 

In computer architecture, word addressing means that addresses of memory on a computer uniquely identify words of memory. It is usually used in contrast with byte addressing, where addresses uniquely identify bytes. Almost all modern computer architectures use byte addressing, and word addressing is largely only of historical interest. 

https://en.wikipedia.org/wiki/Word_addressing

 

이더리움 가상 머신은 스토리지도 보유한다. 메모리와 달리, 스토리지는 비휘발성이고, 시스템 상태의 일부로서 존재한다. 이더리움 가상머신은 프로그램 코드들을 가상의 ROM에 저장해두는데, 이는 특수한 방법에 따라서만 접근이 가능하다. 이러한 구조를 통해, 이더리움 가상머신은, 프로그램 코드를 메모리 혹은 스토리지에 저장해두는, 전형적인 폰노이만 구조와는 차별화된다. 

 

이더리움 가상 머신은 <이더리움 가상 머신 바이트코드>라는 고유 언어를 보유한다.

프로그래머가 스마트 계약을 작성하고자 할 때, 일반적으로 <솔리디티>라는 고레벨 언어로 작성한다.

그뒤 솔리디티 등의 고레벨 언어로 작성된 코드를 이더리움 가상 머신 바이트 코드로 컴파일하여, 

이더리움 가상 머신이 실행할 수 있도록 한다. 

 

가상 머신의 실제 연산 과정

연산을 하고자 할 때, 프로세서는 그 이전에 아래의 구성 요소들이 사용 가능하고 유효한 상태인지를 확인해야 한다.

  • 시스템 상태
  • 연산을 위한 잔여 가스
  • 실행 코드를 소유한 계정의 주소
  • 코드 실행이 시작된 트랜잭션의 전송자 계정 주소
  • 코드를 실행시킨 계정 주소 (원 전송자가 아닐 수 있음)
  • 코드 실행이 시작된 트랜잭션의 가스 가격
  • 코드 실행을 위한 입력 데이터
  • 현재 코드 실행 중에 포함된, 해당 계정으로의 전송 값(Wei)
  • 실행시킬 머신 코드
  • 현재 블록의 블록 헤더
  • 현재 메시지 콜 혹은 계약 생성 스택의 깊이

코드 실행을 시작할 때, 메모리와 스택은 비워져 있고 프로그램 카운터는 0을 가리킨다.

그뒤, 이더리움 가상 머신이 반복적으로 트랜잭션을 실행하면, 

시스템 상태와 머신 상태를 각 루프마다 연산하고,

이때의 시스템 상태는 곧 이더리움의 글로벌 상태를 의미한다.

머신 상태는 아래의 구성요소로 이루어진다.

  • 사용 가능한 가스량
  • 프로그램 카운터
  • 메모리 내용
  • 메모리 내 유효한/활성화된 워드의 수
  • 스택 내용

스택 항목들은 항목들의 가장 왼쪽에서 추가되거나 제거되는 형식이다.

 

매 사이클마다, 잔여 가스량에서 적정 가스량이 제거되고, 프로그램 카운터는 증가시킨다.

각 사이클의 마지막에는 크게 3가지 경우의 수가 존재한다.

 

1. 머신 실행 중 예외가 발생해 정지되고 실행 중의 변화가 모두 삭제되는 경우 :
가스 부족 / 잘못된 명령문 / 스택 아이템 부족 / 스택 항목 오버플로우 / 유효하지 않은 JUMP 목적지 등

2. 다음 루프로 넘어가서 계속 실행되는 경우

3. 프로세스가 종료되어 머신이 의도적으로 중지하는 경우

 

정상적으로 실행되었다고 가정하면, 

머신은 결과 상태, 실행 후의 잔여 가스량, 증가된 서브 상태, 결과값 등을 생성한다.

 

블록의 완성

앞서서 살펴본 트랜잭션 연산 과정을 거쳐, 수많은 트랜잭션이 발생했다면, 

이제는 그 트랜잭션들이 모여 하나의 블록을 이룰 차례이다.

 

블록이 완성되었다는 의미는 크게 2가지로 볼 수 있다. 

 

1. 신규 블록일 경우

블록을 채굴했다는 의미이다.

 

2. 기존에 존재하던 블록일 경우

블록의 유효성 검증을 의미한다.

 

블록을 <완성>하려면, 크게 4가지를 충족해야 한다.

 

1. Ommer 블록의 검증 

앞서서 살펴본 블록헤더에서 확인했듯이, 채굴자들의 인센티브를 마련하기 위한 방편 중 하나로, 6세대 이내의 친척/삼촌 블록들을 Ommer라 하고, 채굴 보상의 일부를 지급한다. 완성시킬 블록의 블록헤더에 들어있는 Ommer 블록들이 유효하다는 것을 확인하고, 현재 블록과의 세대 차이가 6세대 이내임을 확인해야 한다.

 

2. 트랜잭션의 검증 

트랜잭션이 유효하고 옳다는 것을 확인하려면, 블록 내 가스 사용량 수치와, 블록 내 트랜잭션의 가스 사용량 총합이 일치해야 한다. (트랜잭션 시행 때마다, 블록 가스 카운터가 가스 사용량을 추적한다)

 

3. 채굴일 경우 보상 지정

채굴자(수혜자)의 계정으로, 채굴 시 5 이더리움을 지급했었다.

(EIP-649에 따라, 이더리움 보상은 3이더리움으로 감소했다)

(2019년에 콘스탄티노플 하드포크를 진행하며 채굴 보상은 또 2이더리움으로 감소했다.)

(2021년 런던 하드포크로 채굴 수익성이 한차례 더 감소했다.)

Block rewards will reduce from 3 ETH to 2 ETH after the Constantinople hard fork on February 27th. Here’s what’s happening and what it means. Constantinople will implement five Ethereum Improvement Proposals (EIP). One of those proposals is EIP 1234, which includes an adjustment to block rewards. Currently, when a block is successfully mined on the Ethereum blockchain, the miner receives 3 ETH as a reward. After Constantinople, miners will receive 2 ETH per block as a reward. This reduction from 3 ETH to 2 ETH is a reward adjustment of -33%, hence the “Thirdening.”

https://media.consensys.net/the-thirdening-what-you-need-to-know-df96599ad857

 

4. 상태와 논스에 대한 유효성 검증

모든 트랜잭션과 상태 변화가 적용되었음을 확인하고, 보상 지급 및 마지막 트랜잭션으로 인한 상태 변화를 적용한 상태로 새로운 블록을 규정한다. 이 최종 상태를 블록 헤더에 저장된 상태 트리와 비교하여 유효한지를 검증하면 완성 작업을 마무리한다.