Blockchain 개발

Ethereum Virtual Machine (EVM) 개요

이타인클럽입니다. 스마트 컨트랙트 개발 포스팅 네번째입니다.

이전글 - Smart Contract 개발 #3 Mist Browser를 이용한 컨트랙트 Deploy


이번에는 이더리움의 핵심인 이더리움 가상 머신 (EVM, Ethereum Vritual Machine)의 개념을 짚어 보겠습니다.

이미 EVM에 대해서 상세히 내용이 정리 되어 있습니다.
[[모두의 연구소] Introducing Ethereum and Solidity 3장 요약본] (https://steemkr.com/kr/@tenihil/introducing-ethereum-and-solidity-3)

저도 Introducing Ethereum and Solidity란 책으로 스터디를 진행하는데, 다른 내용은 빼고 EVM의 개념을 잡을 수 있는 것으로 설명해 보겠습니다.

솔리디티로 짠 스마튼 컨트랙트는 그 자체로는 실행이 안됩니다. 왜냐면 솔리디티는 사람들이 이해하기 위해 만든 언어니까요. 대부분의 언어들이 다 똑같습니다. 사람들이 이해하는 언어라고 해서 '고급언어'라고 하지요. Java, C, C++ 등을 고급 언어라고 합니다. 솔리디티도 마찬가지고요. 그래서 이런 고급언어로 만들어진 코드(code)는 기계가 이해할 수 있는 언어로 변경되어야만 합니다. 기계가 이해한다고 해서 기계어라고도 합니다. 정말 기계인 컴퓨터가 알아들을 수 있는 명령으로 바뀌는 것이지요. 예를 들면 이렇죠.

LOAD ADDR, X #컴퓨터 램의 주소 ADDR의 값을 X라는 변수에 저장하라.

솔리디티로 짠 코드는 솔리디티 컴파일러에 의해 기계어가 만들어집니다. 이 경우는 Ethereum Bytecode라고 불립니다. 이 바이트 코드가 바로 EVM에서 실행되는 것입니다. EVM은 하나의 기계, Machine입니다. 그런데 가상이죠. 가상머신이란 말은 많이 들어보셨죠? 윈도우즈 운영체제에서 리눅스 운영체제를 쓰고 싶을 때, VMWare같은 프로그램을 써서 리눅스 가상 머신을 만들어서 사용하듯이, 보통 하드웨어나 소프트웨어 구조가 다른 것을 가상으로 만들어서 사용하는 것이 가상 머신입니다.

아래 그림을 보시면 단순하죠?

솔리티디 코드가 컴파일되어 바이트 코드가 만들어지고, 이 바이트 코드는 EVM이 실행합니다.



그럼 EVM은 뭘까요?
EVM은 Ethereum 블락체인 네트워크의 노드들이 공유하는 하나의 가상 머신입니다. 매우 거대한 하나의 분산 컴퓨터라고 보시면 됩니다. 블락체인 네크워크상의 노드들은 이 거대한 컴퓨터에 접근할 수가 있습니다. 컴퓨터가 저장하고 있는 상태도 즉시 바꿀 수도 있고요. 그런데 말입니다. 전세계 많은 사람들이 동시에 EVM의 동일한 상태를 변경하면 어떻게 될까요? 분명 데이터의 충돌이 일어날 것입니다. 우리가 다른 사람들과 공유 문서를 사용할 때도 동일한 부분을 서로 다르게 고치면 충돌이 일어나듯이 EVM 데이터도 충돌이 일어날 수 밖에 없습니다. 이것을 중재하는 것이 EVM의 중요 역할이 됩니다. 이 역할이 마이닝과 합의 알고리듬으로 해결되는 것이고요.

EVM은 누구나 접근할 수 있는 거대 컴퓨터이며, 수많은 사용자가 변경하는 데이터의 충돌, 보안을 담당합니다.

 

누구나 사용할 수 있는 EVM은 공짜가 아닙니다. 공짜라면 무수히 많은 사적인? 쓸모없는? 스팸성의 코드들이 넘쳐날 것입니다. EVM을 사용하려면 비용을 지불해야 합니다. 그 비용은 단순히 트랜잭션의 크기에 비례하는 것이 아니라, 실제로 트랜잭션을 실행하는데 필요한 비용입니다. 이 때 사용되는 개념이 까스 까스 까스 Gas입니다. 한가지 분명히 할 것은 Gas는 화폐가 아닙니다. 즉 트랜잭션 처리하기 위한 Gas가 100이라면 이것을 바로 화폐가치를 가지는 Ether로 환산할 수 없습니다. 왜냐하면 Gas는 일의 양을 나타내는 단위 같은 것입니다. 값어치를 갖지 않는 것이지요. 아주 단순히 예를 들면 트랜잭션을 수행하기 위해 Loop를 100번 돌려야한 한다라는 것을 의미한다고 할 수 있겠습니다. 그럼 EVM이 트랜잭션을 실행하기 위해 필요한 비용은 이렇게 계산됩니다.

트랜잭션에 실행에 필요한 Gas 곱하기 1 Gas 비용 (ether)

Gas의비용 (Gas Price)은 Ether 가격 변동에 따라 바뀝니다. 그렇게 되어야만 일의 양이 비슷하면 비슷한 비용이 책정될 수 있는 것이죠. 아래의 예를 보면 일의 양은 좀 차이가 나지만 변동된 ether가격이 고려되어 Gas 비용이 비슷하게 계산되는 걸 볼 수 있습니다.

Date ETH PRICE Transferred ETH Gas Llimit Used Gas Gas Price Total Cost
6/29/2017 190$ 200 ETH 35414 35414 0.00000005 Eth 0.0017707 Ether ($0.40)
8/3/2017 220$ 100 ETH 100000 21000 0.0000001 Eth 0.0021 Ether ($0.47)

출처

Gas에서 중요한 또 한가지는 바로 트랜잭션을 생성한 주체가 트랙잰션 실행에 필요한 최대 Gas (Gas Limit)를 설정한다는 것입니다. 위 표에서도 Gas Limit이라고 표시되어 있습니다. 자신의 트랜잭션이 실행되기 위해서 필요한 Gas의 양을 사전에 예상을 통해서 입력해야만 합니다. 실제 필요한 Gas양은 EVM이 실행되면서 결정되기 때문에 정확히 알 수가 없으므로, 좀 넉넉히 설정해야 합니다. Gas 비용은 채굴자들이 가져가는 것이기 때문에 Gas Limit을 크게 설정하면 채굴자들이 많은 수수료를 얻기 위해 우선적으로 트랜잭션을 처리하기도 합니다. 그러나 '뻥카'로 Gas Limit을 너무 크게 잡아도 오히려 채굴자들로부터 의심받을 수 있어 트랜잭션이 블락화되지 않을 수 있다고 합니다.

Gas는 일의 양을 나타내는 단위입니다. 트랜잭션 생성 주체가 트랜잭션 실행에 필요한 Gas limit을 설정합니다.

 

EVM이 동작하는 순서는 다음과 같습니다.

  1. 트랜잭션이 올바른 형식인지 확인
  2. 트랜잭션 수수료 계산(Gas limit x Gas Price)
  3. Gas 지불 초기화. 이 시점부터 트랜잭션에서 처리된 바이트만큼 특정 양의 가스를 차감
  4. 트랜잭션 금액을 수신 계정으로 보냄 (Smart Contract도 이 단계에서 실행됨)
  5. 송신 계정에 트랜잭션을 완료할 수 있을 만큼 Gas Price가 충분하지 않으면 트랜잭션의 모든 변경 사항이 되돌려짐. 그러나, 트랙잰션 수수료는 채굴자에게 지불되고 환불되지 않음.
  6. 5번의 경우와 다른 이유로 트랜잭션이 실패한 경우, 송신 계정에 Gas price를 환불하고, 채굴자가 사용된 Gas와 관련된 비용은 채굴자에게 전달됨

EVM은 프로그램을 실행시키는 프로그램입니다. 또 누구나 접속할 수 있는 컴퓨터입니다. 따라서 이 컴퓨터를 특정 프로그램이 독접하면 안됩니다. 따라서 이것을 방지하기 위해 Gas가 도입되었습니다. 앞에서 얘기했듯이 트랜잭션을 생성할 때, Gas Limit을 정하고, EVM은 트랜잭션을 처리하면서 Gas를 소모합니다. Gas Limit으로 설정한 Gas가 모두 소모되면 EVM은 해당 트랜잭션을 종료시킵니다. 따라서 무한정 도는 Loop는 존재할 수가 없는 것이죠.


출처

EVM은 Gas 개념 도입으로 악덕 스패머도 방지하고, EVM이 무한루프 도는 것을 방지합니다.

댓글

댓글 본문
  1. 박준서
    깊이 있는 EVM에 대한 글 잘 봤습니다. 쉽고 확실하네요. 감사합니다.
  2. 한량관
    너무 감사합니다. 대학교 졸업프로젝트로 과제중인데, 굉장히 많은 도움 받고 있습니다!
  3. 이타인
    계속 만들고 있습니다. 만들어지는대로 올릴께요~
    고맙습니다~
    대화보기
    • 김길운
      어우 설마 강좌 여기서 끝인건가요 ㅠㅠ
      오늘 보고 어디까지 되어있나 보는중인데...
      많은사람들이 기술에는 관심이 없어서 그런지 모르겠지만
      저는 열심히 보겠습니다.
      구글링으로 여러가지보긴하는데 자세히 설명해주시니 좋네요
    graphittie 자세히 보기