Ethereum Virtual Machine

in evm •  2 years ago 

EVM(Ethereum Virtual Machine)이란?

Ethereum은 분산화된 State Machine으로 설명할 수 있다.

image.png

State Machine이란 어떤 상태를 가지는 시스템을 의미하는 것으로, 위 그림은 지하철 개찰구를 State machine형태로 나타낸 것이다. 잠겨있는 개찰구에 표를 넣으면 개찰구가 열리고, 한 명이 지나가면 다시 개찰구는 잠기게 된다. 이를 위 그림과 비교했을 때, State machine에서 원은 State를 의미하고, 화살표는 한 State에서 다른 State로 가는 조건을 의미한다는 것을 알 수 있다.

이더리움에서의 transaction은 이더리움의 State를 변경시키는 일이다. 이 부분에 대해서는 learnweb3에서 정확한 개념을 다루지 않고 있다.

image.png
간단하게 개념을 짚고 넘어가면, 이더리움은 최초에 Genesis라는 State에서 시작하며, transaction이 일어나면 State는 변하게 된다. 이더리움의 현재 State는 이런 수백만개의 transcation에 의해 결정된다.

  • Transaction은 다음과 같은 요소를 충족해야 올바른 transaction으로 인정된다.
    1. 올바르게 formating된 RLP를 포함해야 한다.

    2. transaction서명이 유효해야 한다.

    3. transcation논스가 유효해야 한다.

    4. 가스 한계량이 transaction실행 시 사용되는 내부 가스량보다 크거나 같아야 한다.
      (transaction 실행을 위한 가스량+가스 수수료+계약 생성 trasaction일 경우 계약 생성에 필요한 가스량을 합한 것보다 커야 함)

    5. 전송자 계정 잔고가 ‘선 결제 가스비’ 이상이어야 한다.

image.png

그리고 이런 여러 개의 transcations들이 모여 하나의 블록을 형성한다. 이더리움에서의 채굴이란 유효한 transaction들에 대해, 이들의 블록을 형성하는 것을 의미한다.

EVM이란 이더리움 블록체인 네트워크의 노드들이 공유하는 하나의, 거대한 가상머신이다. 하나의 거대한 컴퓨터를 모든 노드들이 함께 사용하고 있다고 생각하면 된다.

블록체인 네트워크에 포함된 모든 노드들은 이 가상머신에 접근할 수 있고 이 가상머신의 State를 바꿀 수 있다.

image.png

EVM의 구조는 위와 같다. 위와 같은 가상머신에서 코드가 실행되는 과정은 아래 그림과 같다.

image.png

Program counter는 현재 실행해야 하는 현재 실행해야 하는 코드의 주소 값을 알려주고, 이 주소 값을 기반으로 EVM코드가 실행된다. 그런데 이더리움 가상머신은 모든 컴퓨터가 공유하는 자원이라 사용량에 제한이 필요하며, 동시에 튜링 머신이 가지고 있는 정지 문제 및 무한반복 문제를 가지고 있다.

이를 해결하기 위해 이더리움은 gas라는 개념을 도입하였다. 이더리움 가상머신에서 코드를 실행시키기 위해선 실행되는 코드의 양에 비례해 이 gas를 비용으로 지불해야 한다. 이 비용은 네트워크 참여자들이 EVM을 남용하지 못하게 하는 역할을 한다.

EVM Layer

image.png

이 그림은 EVM의 Layer를 나타낸 것이다. 가장 아랫 단계의 hardware란 사용자의 컴퓨터를 의미한다. Physical Processor란 사용자의 컴퓨터에 들어있는 CPU를 의미한다. 이더리움 노드로 참여하는 사용자들은 자신들의 컴퓨터에서 노드 프로그램을 실행한다. 이 노드들 기반으로 모든 노드들이 공유하는 하나의 큰 가상머신인 EVM이 동작하고, 이 EVM은 EVM사용자들이 작성한 code를 실행하는 역할을 한다.

EVM Code Generation

image.png

EVM에서 돌아갈 수 있는 코드를 작성하기 위해선, Solidity, Viper, LLL 등의 언어로 소스 코드를 작성해야 한다. Solidity는 이더리움 Smart Contract를 작성하기 위한 대표적인 언어이며 Viper의 경우 보안 강화 등의 목적으로 하는 언어이다. 이런 언어들은 그 문법이 다르지만 기본적을 bytecode를 공유하기 때문에 EVM에서 함께 실행될 수 있으며, EVM은 이들을 바로 이해하지 못하기 때문에 각 언어에 맞는 Compiler를 거친 bytecode결과가 EVM으로 전달된다.

image.png

Assembly language는 최소 동작 단위의 프로그래밍 언어로 로직을 나타낸 것이며, Bytecode는 말 그대로 기계가 이해할 수 있는 언어로 이를 나타낸 것이다. EVM에서 실행되는 코드는 이 중 bytecode가 실행되고 이는 EVM이 바로 실행할 수 있는 언어이다.

EVM Instructions

이더리움 가상머신은 일종의 stack machine이다. Stack은 LIFO 형태의 기초적인 자료구조이다.
최대 depth가 1024이고 stack내부의 각 item의 크기는 256bit인 stack으로 볼 수 있다.

이더리움 가상 머신은 메모리를 지녀 워드 주소 형태의 바이트 배열을 기반으로 아이템을 저장한다.

이는 휘발성 메모리이기 때문에 정보를 영원히 저장하는 것은 아니다.

또한 이더리움 가상머신은 시스템의 일부로 비휘발성 스토리지를 보유한다.

이더리움의 프로그램 코드들은 가상의 ROM에 저장되는데 이는 일반적인 폰 노이만 구조의 컴퓨터가 코드를 메모리나 스토리이제 저장해두는 것과 차별화된다.

이더리움은 Stack에서 사용되는 기본 연산자인 XOR, ADD, AND, SUB, MUL 등을 수행하는 Opcode들을 가지고 있다. 이더리움 코드가 Bytecode로 바뀌면 이들은 EVM에서 동작하는 Opcode로써 실행되게 된다.

Steemit후기: 마크다운을 지원하는 점은 좋은데 UI가 별로라 글쓰기가 상당히 불편한 것 같다

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

안녕하세요 스팀잇 세계에 오신것을 환영합니다.
저는 여러분이 스팀잇에 잘 적응 할 수 있도록 응원하고 있습니다.
이 포스팅을 한번 끝까지 읽어보시고 STEEMIT-초보자를위한 가이드
혹시나 궁금하신 내용이 있으면 언제든
@ayogom, @jungjunghoon, @powerego, @tworld, @dorian-lee, @bitai, @kinghyunn, @maikuraki, @hiyosbi, @nasoe, @angma, @raah 님께 댓글 주시면 친절하게 알려드리겠습니다.

카카오톡 방에서 궁금한 점도 한번 해결해 보세요. 많은 스팀잇 경험자 분들께서 언제나 궁금한 부분을 즉시 해결해 주실 것입니다. 카카오톡 대화방 바로가기 패스워드(1004)