이더리움 가상머신

용어심층

Ethereum Virtual Machine, EVM

EVM은 이더리움 블록체인 위에서 스마트 컨트랙트 코드를 실행하는 가상의 분산 연산 환경으로, 모든 노드가 동일하게 구동하며 여러 블록체인이 공유하는 사실상의 실행 표준으로 자리 잡았다.

1.개요

EVM(Ethereum Virtual Machine, 이더리움 가상머신)은 이더리움 블록체인 위에서 프로그램 코드를 실행하는 가상의 연산 환경이다. 물리적인 컴퓨터가 아니라 네트워크에 참여하는 모든 노드가 각자 소프트웨어로 구동하는 하나의 거대한 분산 상태 기계이며, 각 노드는 동일한 입력에 대해 항상 동일한 결과를 계산해 네트워크 전체가 같은 상태에 합의하도록 한다.

EVM의 핵심 역할은 스마트 컨트랙트를 실행하는 것이다. 개발자가 솔리디티 같은 고급 언어로 작성한 코드는 EVM이 이해하는 바이트코드(bytecode)로 컴파일된 뒤 블록체인에 배포되며, 이후 거래가 발생할 때마다 EVM이 이 바이트코드를 명령어 단위로 해석·실행한다. EVM은 튜링 완전성을 갖추고 있어 이론적으로 모든 종류의 연산을 처리할 수 있다.

EVM은 이더리움을 단순한 송금 네트워크가 아니라 누구나 프로그램을 올려 실행할 수 있는 '월드 컴퓨터'로 만든 핵심 요소로 평가된다. 나아가 그 실행 규격이 사실상의 산업 표준으로 자리 잡으면서, 이더리움 바깥의 수많은 블록체인이 같은 방식을 채택하는 기반이 되었다.

2.등장 배경과 형식 규격

이더리움은 비트코인이 화폐 거래에 특화된 것과 달리, 블록체인 위에서 임의의 프로그램을 실행할 수 있는 범용 연산 계층을 만들자는 문제의식에서 출발했다. 이를 위해 설계된 실행 엔진이 EVM이며, 그 동작 규칙은 개빈 우드(Gavin Wood)가 작성한 이더리움 옐로 페이퍼(Yellow Paper)에서 형식적으로 정의되었다. 옐로 페이퍼는 EVM의 상태 전이 규칙과 각 명령어의 의미를 수학적으로 기술해, 서로 다른 팀이 만든 여러 클라이언트 소프트웨어가 완전히 동일하게 동작할 수 있는 근거를 제공했다.

2015년 이더리움 메인넷이 가동되면서 EVM도 실제로 작동하기 시작했다. 이후 EVM은 여러 차례의 하드 포크를 거치며 새로운 명령어(오퍼코드)를 추가하거나 기존 연산의 비용을 조정하는 방식으로 꾸준히 개선되어 왔다. 2016년의 하드 포크로 이더리움과 이더리움클래식이 갈라섰지만, 두 체인 모두 동일한 EVM 사양을 이어받아 실행 환경 자체는 공유했다. 이처럼 규격이 명문화되어 있다는 점은 EVM이 다른 블록체인으로 손쉽게 복제·채택되는 밑바탕이 되었다.

3.상태 기계로서의 작동 원리

EVM은 계정과 잔액, 컨트랙트 코드와 저장값 등 네트워크의 모든 정보를 하나의 전역 상태(world state)로 관리하는 상태 기계다. 트랜잭션이 들어오면 EVM은 현재 상태에 그 트랜잭션을 적용해 새로운 상태를 계산하며, 이 계산은 결정론적이어서 같은 상태와 같은 트랜잭션에서는 어떤 노드가 실행하든 결과가 일치한다. 모든 풀 노드가 같은 연산을 반복 수행함으로써 별도의 신뢰 기관 없이도 결과의 정당성이 검증된다.

내부적으로 EVM은 스택 기반(stack-based) 구조로 동작한다. 연산에 필요한 값은 256비트(32바이트) 단위의 워드로 다루어지며, 임시 계산은 스택에서 이뤄진다. 데이터 영역은 성격에 따라 셋으로 나뉜다.

  • 스택(stack): 연산의 피연산자를 쌓고 꺼내는 임시 공간으로, 대부분의 명령어가 여기서 값을 주고받는다.
  • 메모리(memory): 실행 중에만 유지되는 휘발성 공간으로, 트랜잭션이 끝나면 사라진다.
  • 스토리지(storage): 컨트랙트별로 블록체인에 영구 보관되는 저장 공간으로, 값을 쓰거나 유지하는 데 상대적으로 큰 비용이 든다.

해시 연산에는 케차크(Keccak-256)가 쓰이며, 이는 주소 생성과 데이터 무결성 확인 등 여러 곳에서 핵심적으로 활용된다.

4.바이트코드와 오퍼코드

EVM이 직접 실행하는 것은 사람이 읽는 소스 코드가 아니라, 한 바이트 단위의 명령어들로 이루어진 바이트코드다. 각 명령어는 오퍼코드(opcode)라 불리며, 값을 더하는 산술 연산부터 스토리지 읽기·쓰기, 다른 컨트랙트 호출, 조건 분기에 이르기까지 저마다 정해진 기능과 가스 비용을 가진다.

개발자가 작성한 솔리디티 코드는 컴파일러를 거쳐 이 바이트코드로 변환된 뒤 트랜잭션을 통해 블록체인에 배포된다. 한번 배포된 컨트랙트 코드는 원칙적으로 변경할 수 없으며, 배포 이후에는 지정된 주소로 호출이 들어올 때마다 EVM이 저장된 바이트코드를 불러와 실행한다. 컴파일 결과가 표준화된 바이트코드이기 때문에, 소스 언어가 무엇이든 같은 오퍼코드 집합으로 환원되면 동일한 EVM 사양을 채택한 어느 체인에서든 그대로 실행될 수 있다.

5.가스와 실행 비용

EVM은 무한 반복 같은 오류나 악의적인 코드가 네트워크 자원을 고갈시키는 것을 막기 위해 모든 연산에 비용을 부과한다. 이 비용의 단위를 가스(gas)라고 하며, 명령어마다 소모되는 가스량이 미리 정해져 있다. 스토리지에 값을 쓰는 것처럼 네트워크에 부담이 큰 연산일수록 더 많은 가스를 요구한다.

사용자가 지불하는 가스 가격은 보통 그웨이(gwei) 단위로 표시되며, 최종 수수료는 소모된 가스량과 가스 가격의 곱으로 결정된다. 트랜잭션을 보낼 때는 소비를 허용할 가스 상한을 함께 지정하는데, 실행 도중 이 한도가 소진되면 트랜잭션은 실패로 처리되고 그때까지의 상태 변경은 모두 되돌려진다(revert). 다만 이 경우에도 이미 수행된 연산에 대한 수수료는 회수되지 않는다.

2021년의 하드 포크에서는 수수료 산정 방식이 개편되어, 네트워크 혼잡도에 따라 조정되는 기본 수수료(base fee)와 블록을 생성하는 주체에게 지급되는 우선 수수료(priority fee, 팁)로 나뉘게 되었다. 이때 기본 수수료 부분은 소각되어 유통량에서 사라지는 구조가 도입되었다.

6.튜링 완전성과 가스에 의한 제약

EVM은 반복과 조건 분기를 포함한 임의의 연산을 표현할 수 있는 튜링 완전 실행 환경이다. 덕분에 단순한 송금을 넘어 복잡한 금융 로직이나 게임, 조직 운영 규칙까지 프로그램으로 구현할 수 있다.

튜링 완전한 시스템에는 특정 프로그램이 언제 끝날지 미리 판정할 수 없다는 근본적 한계(정지 문제)가 존재한다. EVM은 이를 가스라는 경제적 장치로 우회한다. 즉, 연산이 진행될수록 가스가 소모되고 한도에 도달하면 강제로 실행이 중단되므로, 무한히 도는 코드라도 네트워크를 영원히 붙잡아 둘 수 없다. 이처럼 EVM의 튜링 완전성과 가스 모델은 표현력과 안전성을 동시에 확보하기 위한 짝을 이룬다.

7.EVM 호환성과 멀티체인 확산

EVM의 규격을 그대로 따르는 블록체인을 흔히 'EVM 호환 체인'이라고 부른다. 이런 체인에서는 이더리움용으로 작성된 스마트 컨트랙트와 개발 도구, 지갑 등을 큰 수정 없이 재사용할 수 있어, 개발자 생태계가 빠르게 확산되는 데 크게 기여했다. 이미 이더리움에서 검증된 코드와 인프라를 옮겨올 수 있다는 점은 신생 네트워크가 초기 사용자와 애플리케이션을 확보하는 데 강력한 유인이 되었다.

많은 사이드체인레이어 2 네트워크가 EVM 호환성을 채택하고 있으며, 이 덕분에 개발자는 이더리움 메인넷에서 쌓은 경험을 다른 네트워크로 손쉽게 옮길 수 있다. 레이어 1 수준에서도 아발란체, 크로노스, 셀로 등 다양한 체인이 EVM 실행 환경을 도입해, 사실상 EVM은 여러 블록체인이 공유하는 공통 실행 표준으로 자리 잡았다. 기업 환경을 겨냥한 표준화 노력은 기업 이더리움 연합 같은 조직을 통해서도 이어져 왔다.

8.개발 언어와 도구

EVM용 스마트 컨트랙트를 작성하는 대표적인 언어는 솔리디티다. 자바스크립트와 유사한 문법을 지향해 진입 장벽을 낮췄고, 오늘날 배포된 EVM 컨트랙트의 상당수가 이 언어로 작성된다. 이 밖에 파이썬과 닮은 문법을 가진 바이퍼(Vyper) 등 다른 언어도 같은 바이트코드로 컴파일되어 EVM에서 실행된다.

컨트랙트는 한번 배포되면 수정이 어렵고 자금을 직접 다루는 경우가 많기 때문에, 코드의 안전성 검증이 특히 중요하다. 이를 위해 코드의 동작을 수학적으로 증명하는 정형 검증이나 외부 감사가 널리 활용된다. 배포된 컨트랙트의 코드와 트랜잭션 실행 내역은 블록 익스플로러를 통해 누구나 조회할 수 있어, 투명성 또한 EVM 기반 애플리케이션의 특징으로 꼽힌다.

9.레이어 2와 확장

EVM은 모든 노드가 같은 연산을 반복 실행하는 구조여서 처리량에 한계가 있고, 네트워크가 붐비면 가스 가격이 치솟는 문제가 있다. 이를 완화하기 위해 등장한 것이 레이어 2 확장 기술이다. 레이어 2는 다수의 거래를 이더리움 바깥에서 처리한 뒤 그 결과만 메인넷에 기록하는 방식으로 부담을 덜어낸다.

대표적인 레이어 2인 아비트럼, 블라스트, 리네아, 맨틀 등은 대부분 EVM과 호환되거나 이를 거의 그대로 재현하는 실행 환경을 제공한다. 이 덕분에 개발자는 기존 EVM 컨트랙트를 큰 변경 없이 레이어 2로 옮길 수 있고, 사용자는 더 낮은 수수료로 같은 애플리케이션을 이용할 수 있다. EVM 호환성은 이렇게 확장 생태계 전반이 공통의 기반 위에서 성장하도록 묶어 주는 역할을 한다.

10.경쟁 실행 환경과 대안

EVM이 사실상 표준으로 자리 잡았지만, 그 설계상의 한계를 겨냥한 대안적 실행 환경도 여럿 등장했다. 256비트 워드 중심의 구조나 순차 실행 방식이 성능 면에서 불리하다는 지적이 있어, 일부 프로젝트는 병렬 처리나 다른 명령어 체계를 앞세운다.

예컨대 앱토스 등은 자산을 안전하게 다루도록 설계된 무브(Move) 계열 언어와 실행 환경을 채택했고, 인터넷컴퓨터코스모스 계열은 웹어셈블리(WASM) 기반 실행을 활용하기도 한다. 한편 모나드, 메가이더처럼 EVM 호환성은 유지하면서 내부적으로 병렬 실행 등을 도입해 성능을 끌어올리려는 시도도 이어지고 있다. 이는 EVM 생태계와의 호환성이라는 자산을 포기하지 않으면서 그 한계를 넘어서려는 흐름을 보여 준다.

11.앞으로의 과제

EVM은 이더리움 생태계의 중심 실행 계층으로서 지금도 계속 진화하고 있다. 하드 포크를 통해 새로운 오퍼코드를 추가하고, 자주 쓰이는 연산의 가스 비용을 현실에 맞게 조정하며, 바이트코드의 구조 자체를 개선하려는 논의도 진행 중이다.

동시에 레이어 2 확장과 다른 실행 환경의 부상 속에서, EVM이 어떻게 성능 한계를 넘어서면서도 그동안 쌓아 온 호환성과 개발자 생태계라는 강점을 지켜 갈 것인지가 핵심 과제로 남아 있다. 수많은 관련 개념이 EVM을 참조하는 데서 드러나듯, 이 실행 환경은 이더리움과 그 주변 레이어 2·사이드체인 생태계 전반을 떠받치는 공통 토대로 기능하고 있다.

12.연표7

  1. 2014이정표개빈 우드의 옐로 페이퍼가 EVM의 형식 규격을 정의
  2. 2015설립이더리움 메인넷(프론티어) 출시로 EVM 가동 시작
  3. 2016사건하드 포크로 이더리움과 이더리움클래식이 분리되었으나 두 체인이 동일한 EVM 사양을 공유
  4. 2019이정표이스탄불 하드 포크로 일부 오퍼코드의 가스 비용 조정
  5. 2021이정표베를린 하드 포크로 상태 접근 오퍼코드의 가스 비용 재산정
  6. 2021이정표런던 하드 포크에서 EIP-1559로 수수료 체계 개편, 기본 수수료 소각 도입
  7. 2022이정표더 머지로 지분증명 전환, EVM 실행 계층은 그대로 유지
이 문서 인용하기
토큰포스트 위키, “이더리움 가상머신”, 2026-07-31 수정, https://wiki.tokenpost.kr/w/evm

문단 11개 · 연표 7건 · 각주 0