스마트 컨트랙트 개발자라면 반드시 이해하고 있어야 할 EVM에 대하여.
'EVM은 스마트 컨트랙트의 배포와 실행을 담당하는 이더리움의 부품이다.'
이더리움은 프로그래밍이 가능한 블록체인이다. 사용자에게 미리 정의된 일련의 작업을 제공하기보다는, 사용자가 원하는 만큼 복잡한 작업이 가능하도록 한다. 이를 위해 이더리움은 이더리움 가상머신(EVM, Ethereum Virtual Machine) 을 도입했다. 좁은 의미에서 이더리움은 디앱을 위한 플랫폼을 정의하는 일련의 규약을 의미한다. 그리고 그 중심에는 EVM이 있다.
EVM의 역할은 이더리움 프로토콜에 정의된대로 스마트 컨트랙트 코드를 실행하여 상태 변화를 계산하여, 이더리움 상태(state)에 반영하는 것이다.
EVM은 임의의 복잡한 알고리즘을 실행할 수 있다. C++, Solidity 등의 고급 언어를 사용하여 EVM 상에서 실행되는 응용 프로그램을 만들 수 있다. 즉, 이더리움은 EVM이라고 하는 블록체인에서 실행 환경을 구현한다. 블록체인 네트워크에 참여하는 모든 노드는 블록을 검증 프로토콜의 과정으로 EVM을 실행한다. 네트워크 내 모든 노드는 EVM을 실행하는 것이다.
모든 노드는 EVM을 사용하여 스마트 컨트랙트를 포함한 모든 트랜잭션을 실행한다. 따라서 모든 노드는 동일한 계산을 수행하며 같은 값을 저장한다. 이렇게 EVM을 통해 모든 노드들의 컴퓨터에서 동일한 연산을 수행함으로써 동일한 상태(state) 에 합의한다.
이더리움은 전 세계 모든 참가자가 동일한 하나의 컴퓨터를 사용하는 것과 같기 때문에 '세계 컴퓨터(world computer)'라고 불리기도 한다. 그리고 이러한 상태(state)를 Ethereum world state 라고 한다.
Ethereum world state에 대해서는 아래에서 조금 더 다뤄보겠다.
'EVM은 유사-튜링 완전한 상태 머신이다(quasi-Turing complete state machine). '
여기서 상태(state)란, '전환'을 실행하기 위해 대기 중인 시스템의 상태에 대한 설명이다. 전환은 조건이 충족되거나 이벤트가 수신될 때 실행되는 일련의 작업이다. 그렇다면, 상태 머신(state machine)는 조건을 충족하거나 이벤트를 수신하여 전환을 실행하는 시스템이라고 할 수 있다.
대표적인 예시로, 개찰구를 들 수 있다. 상태 기계로 간주되는 개찰구에는 '잠금' 및 '잠금 해제' 의 두 가지 가능한 상태가 있습니다. '동전의 삽입' 이라는 행위로 '잠금' 및 '잠금 해제' 상태를 전환할 수 있다.
이와 마찬가지로, EVM 또한 상태 머신이라고 할 수 있다.
EVM은 이더리움의 상태를 전환하는 기능을 갖고 있다.
이더리움의 상태는 모든 계정과 잔액뿐만 아니라 미리 정의된 규칙 집합에 따라 블록에서 블록으로 변경할 수 있다. 블록에서 블록으로 상태를 변경하는 특정 규칙은 EVM에 의해 정의된다.
EVM은 수학 함수처럼 작동한다. 입력이 주어지면 결정론적 출력을 생성한다.
Y(S, T)= S'
이전 유효한 상태 (S)와 새롭고 유효한 트랜잭션 세트가 주어지면 (T)Ethereum 상태 전환 기능 Y(S, T)은 새로운 유효한 출력 상태(S')를 생성한다.
이제, EVM은 위에서 얘기한 Ethereum world state에 적용될 수 있다. 'world state'는 이더리움 주소와 계정의 매핑이다. 그보다 작은 단계로는 각각의 이더리움 주소가 있다. 이들은 계정을 보여주고 그 계정은 이더 잔고, 논스, 데이터 저장고, 프로그램 코드로 이루어져있다.
Ethereum world state가 상태머신인 EVM에 의하여 전환되는 모습은 다음과 같다.
world state가 input data(개찰구의 동전)을 받은 EVM에 의하여 상태가 전환되는 것이다.
코드의 컴파일부터, world state update까지 차례로 살펴보자.
솔리디티로 작성한 스마트 컨트랙트는 사람이 이해하기 위해 만든 고급언어다.
그렇기에 기계가 이해할 수 있는 기계어로 변경되어야만 한다.
솔리디티로 짠 코드는 솔리디티 컴파일러에 의해 기계어가 만들어진다.
이것을 Ethereum Bytecode라고 부른다. 이 바이트 코드가 바로 EVM에서 실행되는 것이다. 다음과 같은 순서로 말이다.
스마트 컨트랙트 실행으로 인한 트랜잭션이, EVM은 현재 블록이 생성되고 처리되는 특정 트랜잭션과 관련하여 필요한 모든 정보로 실행된다. 특히 EVM의 프로그램 코드 'ROM'과 호출 중인 컨트랙트 계정의 코드가 로드되고, 프로그램 카운터가 0으로 설정된다. 또한 컨트랙트 계정의 저장소에서 스토리지가 로드되고, 메모리가 모두 0으로 설정되며, 블록 및 환경 변수가 모두 설정된다.
여기서 주요 변수는 이 실행을 위한 가스비이다. 이는 컨트랙트 실행 시 'sender'가 지불하는 가스 양으로 설정된다. 코드 실행이 진행됨에 따라 수행된 작업의 가스 비용에 의해 가스가 감소한다. 어느 시점에서든 가스가 0에 도달하면 가스 전소, Out of Gas(OOG) exception이 발생한다. 이때 실행이 즉시 중지되고 트랜잭션이 취소된다.
여기서 'EVM은 유사-튜링 완전한 상태 머신(quasi-Turing complete state machine)' 이라는 문장이 의미를 갖는다. 모든 실행 프로세스는 주어진 스마트 컨트랙트 실행에 사용할 수 있는 가스의 양에 의해 유한한 수의 계산 단계로 제한되기 때문이다. 완전한 튜링 상태 머신과는 다르게 제한된 횟수로 실행되는 것이다.
여기까지는 이더리움 상태에서는 큰 변화가 발생하지 않았다. 발생한 변화는 송신자의 넌스가 증가하고 블록의 수혜자에게 지불함에 따라 낮아진 이더 잔고이다. 이때까지 EVM은 실제 이더리움 상태가 아닌 가상의 상태에서 실행되었다고 생각할 수 있다. 그리고 가상의 상태에서 실행이 성공적으로 일어난다면 실제 이더리움 상태를 업데이트한다.
그러나 실행이 성공적으로 완료되면 실제 상태는 가상의 상태와 일치하도록 업데이트된다. 여기에는 호출된 컨트랙트의 스토리지 데이터에 대한 변경 사항, 새로 생성된 계약 및 초기화된 잔액 전송이 포함된다.
이와 같은 과정을 모식도로 나타낸다면 다음과 같다.
“EVM은 처음부터 설계를 크게 고려해서 개발된 것이 아니라는 점을 강조하고 싶습니다. EVM은 그냥 툴이었습니다. 말하자면 스위스 아미 나이프 같은 거죠. 이것저것 할 수 있는 건 많지만 아주 정밀하지는 않아요.” - 이더리움 개발자 레인 레티그
EVM은 최초로 공격을 예방하는 기능을 갖춘 분산형 컴퓨팅 솔루션을 제공한다는 측면에서 혁신적인 기술이다. 그러나 그렇다고 결코 흠이 없는 것은 아니다. 이러한 자각이 eWASM으로 전환하는 계기가 되었다.
예를 들어 댑 개발자 대부분은 이더리움의 솔리디티로 프로그램을 작성한다. 솔리디티는 EVM 바이트코드로 호환 가능하며 자동으로 EVM 코드로 적용되는 높은 수준의 프로그래밍 언어이다.
레티그의 설명에 따르면, EVM은 “대단히 광범위한 명령어”를 사용하기 때문에 간단한 연산과 같은 사소한 작업을 할 때도 복잡한 256비트 문자열로 변환하는 번거로운 과정을 거쳐야 한다. 이렇게 불필요하게 시스템 코드에 포함된 작업이 더 많은데, 잘 알려진 해시 함수 SHA-3도 그중 하나다. 레티그는 EVM을 이런 이유로 “혹투성이”라고 묘사한다.
이더리움의 핵심 개발자인 닉 존슨도 이에 동의하며, 자신도 이더리움에 처음 합류했을 때 EVM 개발자들이 컴퓨터 공학에는 능통했을지언정 편리하게 사용할 수 있는 제품을 개발하는 데 필요한 경험과 통찰이 부족했음을 바로 알아보았다고 말했다.
존슨은 도구로서의 EVM이 “상용화보다 순수 이론에 적합”하다고 강조했다.
“EVM의 레지스터는 거대하지만 모두 일치하고, 또 내부적 일관성을 유지하고 있습니다. 하지만 현실 세계에서 구현할 목적으로 개발된 것은 아니에요.”
현재의 EVM을 eWASM이라는 이름의 새로운 가상머신으로 교체하려는 이유가 바로 여기에 있다. eWASM은 WASM 코드의 이더리움 버전이다.
반면에 WASM 코드는 처음부터 대량 생산을 염두에 두고 개발됐다. 우선 WASM은 하드웨어에 더 가깝다. 다시 말해 WASM의 코드는 실제 하드웨어 명령어와 유사하며, 서로 다른 코딩 로직을 번역하는 단계를 거치지 않아도 된다.
“WASM 명령어는 실제 하드웨어 명령어를 굉장히 정교하게 모방하고 있습니다. WASM 명령어와 실제 장치 운영 명령어를 일대일로 대응시킬 수도 있습니다. 그래서 적어도 이론상으로는 굉장한 성능 개선을 기대할 수 있습니다.”
레티그의 설명이다.
eWASM을 사용하면 개발자들은 이더리움 전용 언어인 솔리디티(Solidity) 외에도 여러 종류의 프로그래밍 언어로 코딩할 수 있게 되며, 성능 향상도 기대할 수 있다. 또 EOS, 트론, 카르다노 등 이더리움의 경쟁 화폐 일부가 이미 WASM 코드를 사용하여 프로젝트별 가상머신을 도입하였거나 혹은 도입할 계획이라는 사실은 이더리움의 결정을 더욱 부추기고 있다.
*p.s. 가상환경
가상환경이란 오락실 게임을 컴퓨터에서 하기위해 설치하는 프로그램이라고 할 수 있다. 해당 프로그램을 설치하고 그 환경에서 오락실 전용으로 프로그래밍 된 게임을 실행하는 것.
흥미로운 내용입니다. 다음에는 이더리움 생태계와 클레이튼 생태계를 비교하는 내용도 한번 다뤄주세요~