EVM이란 스마트 컨트랙트 배포와 실행을 담당하는 이더리움의 부분이다. 크게 보면 이더리움 체인 위의 EVM은 수백만 개의 실행가능한 객체가 포함된 거대한 탈중앙화 컴퓨터라고 할 수 있다.
EVM은 유사-튜링 완전한 상태 기계이다(quasi-Turing complete state machine). 그 이유는 실행 과정에서 사용할 수 있는 가스의 양이 제한되어있기 때문이다. 가스의 양을 제한함으로 멈추지 않는 프로그램이 발생할 가능성이 없다.
EVM은 스택 기반의 구조로 모든 인 메모리 갑슨 스택구조로 저장한다.
EVM의 역할은 이더리움 프로토콜에 정의된대로 스마트 컨트랙트 코드를 실행하여 상태 변화를 계산하여 이더리움 상태에 반영하는 것이다. 이는 이더리움의 특성인 트랜잭션-기반 기계라는 것과 이어진다. 이더리움에서 상태 변화는 모두 외부의 사용자(계정 소유자, 채굴자)가 보낸 트랜잭션에 의한 것이다.
이더리움 상태에서 가장 큰 단계로는 Ethereum world state가 있다. world state는 이더리움 주소와 계정의 매핑이다.
작은 단계로는 각각의 이더리움 주소는 계정을 보여주고 그 계정은 이더 잔고, 논스, 데이터 저장고, 프로그램 코드로 이루어져있다.
트랜잭션이 스마트 컨트랙트 코드 실행으로 이어진다면 EVM이 실행된다. EVM은 이때 해당 블록의 실행과 트랜잭션의 실행에 필요한 정보로 실행된다.
EVM의 코드 ROM이 불러진 컨트랙트의 코드로 로드되고 메모리는 0으로 설정된다. 중요한 변수는 송신자가 트랜잭션에 같이 보낸 가스량이다. 코드 실행이 지속되면서 가스량은 사용된 만큼 줄어들고 그 값이 0이 된다면 'Out of Gas' exception이 발동되어 execution이 멈춘다.
여기까지는 이더리움 상태에서는 큰 변화가 발생하지 않았다. 발생한 변화는 송신자의 넌스가 증가하고 block's beneficiary에게 지불함에 따라 낮아진 이더 잔고이다.
이때까지 EVM은 실제 이더리움 상태가 아닌 가상의 상태에서 실행되었다고 생각할 수 있다. 그리고 가상의 상태에서 실행이 성공적으로 일어난다면 실제 이더리움 상태를 업데이트한다.
유의할 점은 스마트 컨트랙트가 다른 트랜잭션을 실행할 수 있기 때문에 코드 실행은 재귀적인 과정이라는 것이다. 컨트랙트는 다른 컨트랙트를 call 할 수 있고 그 각각의 컨트랙트는 모두 각자의 EVM을 실행하고 위의 과정을 거치게 된다.