상세 컨텐츠

본문 제목

EVM(Ethereum Virtual Machine)의 내부 동작 구조

Blockchain/Ethereum

by Yongari 2023. 2. 8. 19:26

본문

개요

 

EVM은 Ethereum 클라이언트를 실행하는 수 천개의 컴퓨터가 유지관리하는 단일 엔티티입니다.

이더리움 프로토콜은 이 특수 시스템의 지속적이면서 중단없는 작동을 유지하기 위한 목적으로 존재합니다.

EVM에는 모든 이더리움 계정과 스마트 계약이 존재하는 환경입니다. 체인의 특정 블록에서 Ethereum은 하나의 "표준" 상태를 

가지며 EVM은 블록마다 새로운 유효한 상태를 계산하는 규칙을 정의함.

 

 

사전 지식 필요

 

Byte : https://ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8 

주기억장치(computer memory) : https://ko.wikipedia.org/wiki/%EC%A3%BC%EA%B8%B0%EC%96%B5%EC%9E%A5%EC%B9%98 

스택(stack) : https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D  

암호화 해시 함수(cryptographic hash function) : https://ko.wikipedia.org/wiki/%EC%95%94%ED%98%B8%ED%99%94_%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98

머클트리 : https://ko.wikipedia.org/wiki/%ED%95%B4%EC%8B%9C_%ED%8A%B8%EB%A6%AC 

프로그램 카운터(Program counter) : https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8_%EC%B9%B4%EC%9A%B4%ED%84%B0 




원장(Ledger)에서 상태 기계(State Machine)로

 

 

 

분산원장의 비유는 비트코인과 같은 블록체인을 설명할 때 주로 사용했으며 이더리움에서는 비트코인과 거의 동일한 규칙을 따르는 고유한 암호화폐 Ether가 있지만 더 강력한 기능이 있습니다. 바로 스마트 컨트랙트(똑똑한 계약)인데요. 튜링완전성이 있는 언어인 솔리디티를 이용해서 탈중앙화 애플리케이션을 만들 수도 있죠 이더리움은 분산원장 개념에서 더 나아간 상태 기계 (State Machine)으로 동작합니다. 

 

그렇다면 상태 기계? 상태 머신은 무슨 뜻일까요?? 상태머신이란 쉬운말로 입력을 읽고 그 입력을 기반으로 새로운 상태로 전환하는 것을 말합니다   이더리움은 처음에는 Genesis State에서 시작했다가 트랜잭션이 실행되면  다음 상태로 전환하게 됩니다. 

 

 

 

이더리움 상태 변환 함수(THE ETHEREUM STATE TRANSITION FUNCTION)

 

EVM은 다음 수학적 함수로 작동합니다. 
Y( S, T) = S'

 

S = 오래된 유효상태 -> (Old state)
T = 유효한 거래의 새로운 집합(T) -> (Transaction)
Y = 이더리움 상태 변환 함수Y(S, T) 
S' = 새 유효 출력 상태 S' -> (New state)

 

 

상태(State)

이더리움의 맥락에서 상태는 수정된 머클 패트리샤 트리(Merkle Patricia Trie)라는 거대한 데이터 구조로, 모든 계정을 해시로 연결하고 블록체인에 저장된 단일 루트 해시로 축소할 수 있다.

 

 

 

거래(Transactions)

기본적으로 트랜잭션은 EOA에서 생성된다.(하단에 있다. 참고)  트랜잭션은 이더리움 계정의 암호화 서명된 명령어 집합이다. 트랜잭션에는 두 가지 유형이 있다. 메세지를 호출하는 트랜잭션과  컨트랙트를 생성하는 트랜잭션이 있다. 
이더리움의 모든 트랜잭션은 항상 EOA에서 만들어지고 블록체인에 업로드되며 CA는 외부세계와 이더리움 내부세계를 이어주는 소통창구다. 

 

 

 

 

 

사진출처 : 이더리움 공식홈페이지(https://ethereum.org/en/developers/docs/evm/)

EVM 구성 요소

 

1. 스택 : EVM은 스택기반 아키텍쳐를 가지고 있고  하나의 빈 스택이 있으며 스택에 들어가는 요소의 크기는

256 bits고 스택의 최대 크기는 1,024 개수다.

 

2. 메모리 : EVM은 메모리를 가지고 있고 Word-Address 형식의 바이트 배열로 데이터를 저장함, 메모리는 휘발성이라서 프로그램이 종료하면 메모리내에 데이터는 사라짐

3. 스토리지 : 비휘발성이고 시스템 상태에 따라 유지됨 특정한 명령어로만 접근 가능한 Virtual ROM이라는 공간에 프로그램 코드를 분리해서 저장함

 


 

EVM의 초기상태는 하단의 코드블럭과 같다.
EVM은 트랜잭션을 반복 실행하며 각 사이클에서 시스템 상태(이더리움의 전역 상태)와 머신상태(Machine State)를 계산함

PC(Program Counter, 명령어 포인터) : 0 
Stack : [] 
Memory : []
Storage : {}

 

 

EVM 동작 시뮬레이션

  1. 프로그램 카운터(명령어 포인터)가 EVM code를 해석하고 operations를 실행합니다. (동시에 가스가 사용됩니다.)
  2. operations(연산처리)를 하면서 메세지 콜을 동작합니다. (많은 가스 사용)
  3. 스택에 opcode(XOR, AND, SUB, etc)등을 삽입하고 제거하는 등의 처리를 하면서 메모리를 사용합니다. 
  4. 그러면서 account를 storage에 저장하는데요 이것은 가스가 많이 듭니다. (많은 가스 사용) 
  5. gas available이 있는 이유는 사용가능한 가스가 있어야 EVM이 동작하므로 "gas available"이 있는 것 같습니다.

 


EOA(External Owned Account)와 CA(Contract Account)

 

EOA(External Owned Account)

  • 상응하는 비밀 키가 있다.
  • 160비트 길이의 주소로 식별되며 동일한 주소 공간을 가짐
  • 이더리움 블록체인에서 일어나는 모든 액션은 항상 EOA에서 만든 트랜잭션에서 시작함

    다음 속성을 가지고 있음
  • Balance : 계정의 현재 이더 잔고
  • Nonce : 해당 EOA로부터 보내진 트랜잭션의 숫자 
  • StorageRoot : 머클 패트리샤 트리의 루트 노드를 해싱한 값
  • Contract Code : EVM이 실행할 코드의 해싱된 값 EOA는 코드를 저장할 수 없어서 비어 있음 

CA(Contract Account)

  • 상응하는 비밀 키가 없다.
  • 160비트 길이의 주소로 식별되며 동일한 주소 공간을 가짐
  • CA는 스스로 새로운 트랜잭션을 만들 수 없고 EOA나 다른 CA에서 받은 트랜잭션에 대한 응답에 대해서만
    트랜잭션을 만들 수 있음.  
  • CA는 메시지(Message)나 내부 트랜잭션(Internal Transaction)을 통해 다른 CA와 상호 작용할 수 있음


    다음 속성을 가지고 있음
  • Balance : 계정의 현재 이더 잔고
  • Nonce : 해당 CA로부터 생성된 컨트랙트의 숫자
  • StorageRoot : 머클 패트리샤 트리의 루트 노드를 해싱한 값
  • Contract Code : CA는 코드를 저장할 수 있어서 코드를 가지고 있음

 

첫 번째 트랜잭션 : CA(Contract-Creating, 컨트랙트 생성) 트랜잭션

 

1. 새로운 CA를 만들기 위해서 새로운 계쩡의 주소를 정의해야함 
2. 논스를 0으로 설정

3. 송신자가 CA 생성 트랜잭션 이더를 함께 보낸 경우, 이를 CA의 잔금(Balance)로 설정

4. EOA 계정의 잔금에서 Value만큼 제외
5. CA의 스토리지를 빈 값으로 초기화 
6. CA의 코드를 빈 문자열의 해시값으로 초기화  

 

두 번째 트랜잭션 : 메세지 호출(Message Call)
입력 데이터를 가지고 있을 수 있음
메세지 호출은 한번 실행되면 출력 데이터를 포함한 추가적인 요소를 가질 수 있음

 

전역 상태 

 

머클트리는 이진 트리의 한 종류로  다음 특징을 가지고 있음

  • 트리 맨 아래에 있는 노드들은 데이터를 가지고 있다.
  • 부모 노드는 두 자식 노드르 모아 해싱한 값을 가진다. 맨 위 루트노드도 자신 노드의 해싱한 값이다. 

따라서 한 자식 노드값만 바꿔도 전체 노드의 해싱 값이 변한다.

 

 

이더리움 블록헤더는 세 개의 머클 트리 구조 루트 노드의 해시값이 저장되어 있음

 

1. 상태 트리(State Tree) : 트랜잭션과 연관된 계정의 상태정보 저장

2. 트랜잭션 트리(Transaction Tree) : 현재 블록 트랜잭션 정보 저장
3. 영수증 트리(Receipt Tree) : 현재 블록의 거래 영수증 정보 저장

 

 

 

 

 

 

persistent : 1.지속하는 / 2.끈기 있는 / 3.끊임없는

immutable : 1.불변의 / 2.바꿀 수 없는 / 3.변경할 수 없는
enormous: 막대한, 거대한, 악독한
reducible: 환원 가능, 줄이할 수 있는

 

 

 

 

 

 

 

참고하면 좋은 링크

이더리움 계정 : https://ethereum.org/en/developers/docs/accounts/ 

 

Home | ethereum.org

Ethereum is a global, decentralized platform for money and new kinds of applications. On Ethereum, you can write code that controls money, and build applications accessible anywhere in the world.

ethereum.org

패트리샤 머클트리 : https://ethereum.org/en/developers/docs/data-structures-and-encoding/patricia-merkle-trie/ 

 

Home | ethereum.org

Ethereum is a global, decentralized platform for money and new kinds of applications. On Ethereum, you can write code that controls money, and build applications accessible anywhere in the world.

ethereum.org

 

관련글 더보기