블록체인의 심장, EVM은 왜 외부 세계와 단절되어야 하는가 morgan021 2025. 11. 7.
> _
세상에는 두 종류의 기계가 있다. 하나는 세상을 받아들이는 기계, 다른 하나는 세상을 창조하는 기계다. 우리가 매일 만지는 스마트폰, 날씨를 예측하는 슈퍼컴퓨터는 전자에 속한다. 그들은 외부의 혼란스러운 데이터—온도, 주가, 사용자의 변덕스러운 터치—를 끊임없이 받아들이고 반응한다. 그들의 가치는 얼마나 현실을 잘 반영하느냐에 달려있다.
하지만 블록체인, 특히 그 심장부에 자리한 이더리움 가상 머신(EVM)이라 불리는 존재는 완벽하게 후자에 속한다. 그것은 외부 세계를 반영하는 거울이 아니라, 그 자체로 완벽히 격리된 세계를 창조하는 엔진이다. 이 기계는 외부의 현실을 궁금해하지 않는다. 오직 자신의 내부 논리만을 따른다. 그래서 우리는 이 기계를 '결정론적 상태 머신'이라는, 지독히도 매력 없고 건조한 이름으로 부른다.
이것이 무슨 의미일까. '결정론적'이라는 말은 모든 결과가 이미 정해져 있다는 뜻이다. 이 기계에게 '1 더하기 1'을 묻는다면, 그 답은 서울에서도, 뉴욕에서도, 100년 뒤에도 정확히 '2'여야 한다. 여기에는 어떤 오차나 해석의 여지도, 확률도 끼어들 틈이 없다. '상태 머신'이란 이 기계가 '이전 상태'와 '새로운 입력(트랜잭션)'을 받아 언제나 동일한 '다음 상태'를 계산해낸다는 의미다. 은행의 중앙 서버가 모든 고객의 잔액이라는 '상태'를 관리하듯, EVM은 전 세계에 흩어진 수만 대의 컴퓨터(노드)에 동일한 '상태'—모든 지갑의 잔액, 모든 스마트 컨트랙트의 저장 값—를 복제하고 유지한다.
이것이 바로 블록체인의 '합의(Consensus)'라는 개념의 본질이다. 만약 서울의 노드가 1+1=2라고 계산하고 뉴욕의 노드가 1+1=2.0001이라고 계산한다면, 두 노드가 공유하던 장부는 그 순간 두 개로 찢어진다. '단 하나의 진실'이라는 블록체인의 존재 이유가 사라지고, 그 위에서 움직이던 모든 디지털 자산은 근거를 잃고 먼지처럼 흩어진다. 이 재앙을 막기 위해, EVM은 스스로를 '신성한 감옥' 안에 가두는 극단적인 선택을 했다.
'결정론적 상태 머신'이란 무엇인가?
'결정론적 상태 머신'이라는 용어는 이 시스템의 존재 이유를 설명한다. '상태 머신'은 현재의 '상태'를 기억하고, 새로운 '입력'을 받았을 때 정해진 규칙에 따라 '다음 상태'로 이동하는 기계를 의미한다. 우리의 은행 잔고가 정확히 그렇다. 현재 잔액 10,000원이라는 '상태'는, '5,000원 인출'이라는 '입력'을 받으면, '잔액 5,000원'이라는 '다음 상태'로 이동한다. 이 과정은 예측 가능해야 하며, 중간에 변수가 끼어들어서는 안 된다.
블록체인에서 이 '상태'는 네트워크에 참여하는 모든 계정의 잔액, 모든 스마트 컨트랙트의 저장된 데이터(스토리지)의 총합이다. 그리고 '입력'은 사용자들이 보내는 트랜잭션이다. EVM의 역할은, 현재의 블록 상태와 한 묶음의 트랜잭션들을 입력받아, 다음 블록의 상태를 계산해내는 거대한 함수다.
여기서 '결정론적'이라는 단어가 모든 것을 결정한다. 분산 시스템에서 '합의'는 가장 중요하고도 어려운 과제다. 중앙 서버가 없는 환경에서, 전 세계에 흩어진 수천, 수만 대의 독립적인 컴퓨터(노드)가 동일한 거래 내역을 실행하고, 그 결과로 완전히 동일한 '다음 상태'에 도달해야만 한다.
만약 서울의 노드가 A의 잔액을 100원으로 계산하고, 뉴욕의 노드가 99원으로 계산한다면, 'A의 잔액'이라는 단 하나의 진실은 존재하지 않게 된다. 두 노드의 장부는 그 즉시 갈라지며(포크), 네트워크는 신뢰를 잃고 붕괴한다. 따라서 EVM은 설계 단계부터, 동일한 입력을 받았을 때 그 어떤 상황에서도 100% 동일한 출력을 보장하도록 만들어졌다. 1 더하기 1은 지구상의 모든 노드에서, 언제나 정확히 2여야 한다. 이 절대적인 원칙을 지키기 위해, EVM은 수많은 기능을 포기해야 했다.
EVM이 금지한 것들: 실시간, 난수, 그리고 API 호출
결정론이라는 엄격한 규칙을 지키기 위해, EVM은 합의를 위협하는 모든 '변수'를 시스템에서 제거했다. 이 변수들을 우리는 '비결정론적(Non-deterministic)' 요소라고 부른다.
가장 대표적인 것이 바로 '인터넷 접근', 즉 외부 API 호출이다. 이것이 블록체인이 인터넷을 할 수 없는 이유다. 만약 스마트 컨트랙트가 외부 API를 호출해 현재의 주식 가격이나 날씨 정보를 가져올 수 있다고 상상해 보자. A 노드가 트랜잭션을 실행하며 API를 호출한 순간의 주가는 100달러였다. 하지만 0.5초 뒤, 네트워크 지연으로 인해 B 노드가 같은 트랜잭션을 실행하며 API를 호출했을 때, 그사이 주가는 101달러로 변동했다.
두 노드는 동일한 트랜잭션을 실행했지만, 서로 다른 입력값(100달러 vs 101달러)을 기반으로 연산을 수행하게 된다. 그 결과, 두 노드가 계산한 '다음 상태'는 달라지게 되며 합의는 즉각 깨진다. 따라서 EVM은 네트워크 I/O(Input/Output)를 원천적으로 금지한다.
둘째, EVM은 진정한 '난수(Random Number)'를 생성할 수 없다. 예측 불가능한 값이야말로 비결정론의 정수이기 때문이다. 만약 EVM이 rand() 같은 함수를 제공한다면, A 노드와 B 노드는 각각 다른 난수를 생성할 것이고, 이는 즉각적인 합의 실패로 이어진다. 개발자들이 종종 블록이 생성된 시간(timestamp)이나 블록의 고유 해시(hash) 값을 조합해 무작위처럼 보이게 하는 기법을 사용하지만, 이 값들조차 이미 블록에 확정되어 모든 노드가 공유하는 '결정된' 정보다. 진정한 의미의 예측 불가능성은 이 감옥 안에서 불가능하다.
셋째, EVM은 '실시간 시계'에 의존할 수 없다. 컨트랙트가 now() 같은 함수로 현재 시간을 확인하는 순간, 각 노드의 컴퓨터에 설정된 미세하게 다른 로컬 시간(밀리초 단위의 차이)이 개입되어 계산 결과가 달라질 수 있다. EVM이 아는 유일한 시간은 '블록 타임스탬프'라는, 이미 과거에 생성되어 모든 노드가 합의한 '기록된 시간'뿐이다.
이처럼 EVM은 스스로를 완벽히 격리된 샌드박스, 즉 신성한 감옥 안에 가두었다. 오직 트랜잭션이라는 정제된 입력값만을 받아, 내부의 엄격한 규칙(옵코드)만으로 다음 상태를 계산한다. 이 완벽한 격리와 통제, 이것이 바로 EVM이 신뢰를 얻는 방식이다.
'정지 문제'와 가스(Gas)
결정론을 확보한 EVM 앞에는 또 다른 거대한 난제가 버티고 있었다. 바로 컴퓨터 과학의 가장 유명한 이론 중 하나인 '정지 문제(Halting Problem)'다. 앨런 튜링이 증명한 이 문제는, 어떤 프로그램이 유한한 시간 안에 끝날지, 아니면 무한 루프에 빠져 영원히 멈추지 않을지를 미리 판별할 완벽한 방법이 없다는 것을 의미한다.
이것이 블록체인 네트워크에 치명적인 이유다. 만약 누군가 악의적으로 while(true)라는 무한 루프가 담긴 스마트 컨트랙트를 배포하고 실행시킨다면 어떻게 될까. 전 세계 모든 노드는 이 트랜잭션을 실행하다가 영원히 멈춰버리고 네트워크는 즉시 마비될 것이다. 결정론적 기계가 영원히 답을 내놓지 못하는 상황이다.
EVM은 이 문제를 기술이 아닌, 지극히 자본주의적인 방식으로 해결했다. 바로 '가스(Gas)'다. 이 감옥 안에서 시계태엽을 한 칸 움직이는 것, 즉 ADD(더하기)나 SSTORE(저장) 같은 기본 명령어(Opcode) 하나를 실행하는 데는 비용이 든다. 이 비용이 가스다. 모든 연산에는 정해진 가스비가 책정되어 있다. 사용자는 트랜잭션을 보낼 때 "나는 이 작업을 위해 최대 100만 가스만큼의 비용을 지불하겠다"고 '가스 한도(Gas Limit)'를 명시해야 한다.
만약 프로그램이 무한 루프에 빠지더라도, EVM은 정해진 가스 한도를 모두 소진하는 순간, 기계적으로 실행을 중단시킨다. 그리고 'Out of Gas'라는 예외를 던지며, 지금까지의 모든 작업을 없었던 일로 되돌린다(Revert).
물론, 실행에 소모된 가스비는 자비 없이 청구된다. 무한 루프를 돌리려던 시도는 비싼 대가를 치르고 실패한다. 가스는 이 결정론적 기계가 악의적인 공격에 의해 멈추지 않도록 보장하는 강력하고 우아한 경제적 브레이크다.
외부 세계와의 유일한 창구, '오라클'
이 완벽하게 고립된 감옥에도 창문은 필요했다. 컨트랙트가 외부 세계의 데이터(예: 오늘의 날씨, 달러 환율)를 정말로 알아야만 하는 디파이(DeFi) 서비스 같은 경우는 어떻게 할까.
EVM은 스스로 인터넷을 호출할 수 없지만, '오라클(Oracle)'이라 불리는 특별한 메신저를 통해 데이터를 '전달'받을 수는 있다.
오라클의 작동 방식은 EVM의 결정론을 위배하지 않는다. 오라클은 두 단계로 작동한다.
- 외부 실행 (Off-chain): 오라클 서비스(신뢰받는 제3자)가 외부 API를 호출해 '뉴욕 증시 마감가 100달러'라는 정보를 가져온다.
- 내부 주입 (On-chain): 오라클이 이 100달러라는 데이터를 포함한 트랜잭션을 생성하여 EVM에 '주입'한다.
모든 노드가 실행하는 것은 1번(API 호출)이 아니라 2번(데이터 주입 트랜잭션)이다. 모든 노드에게 100달러라는 값은 외부의 변수가 아니라, 트랜잭션에 명시된 '결정론적인 입력값(상수)'이다. 모든 노드는 "오라클이 100달러라고 보고했다"는 동일한 사실을 기반으로 연산을 수행하므로 합의가 유지된다.
중요한 것은 이 데이터가 주입되는 순간, 그것은 더 이상 외부의 변수가 아니라 모든 노드가 동일하게 복제하고 합의해야 할 내부의 상수가 된다는 점이다. 오라클은 감옥의 규칙을 깨는 것이 아니라, 규칙 안에서 외부 정보를 장부의 일부로 변환하는 신뢰받는 번역가 역할을 한다.
프리컴파일(Precompile)
그렇다면 외부 데이터가 아니라, 감옥 내부의 연산 자체가 너무 복잡하면 어떨까. 예를 들어, EVM의 기본 옵코드만으로 복잡한 암호학적 서명(예: ecrecover)을 검증하거나 해시(SHA-256)를 계산하는 것은 엄청난 가스를 소모하는 비효율적인 작업이다.
이 문제를 해결하기 위해 설계자들은 '프리컴파일(Precompile)'이라는 일종의 패스(Pass)를 만들었다. 프리컴파일은 EVM의 특정 예약된 주소(예: 0x01, 0x02...)에 하드코딩된 '네이티브 코드(Go, Rust 등)'다. EVM이 이 주소로 오는 호출을 감지하면, 느린 옵코드를 실행하는 대신 이 미리 컴파일된 고속의 네이티브 코드를 직접 실행한다.
이것은 외부 세계로 나가는 창문이 아니라, 감옥 벽 안에 내장된 초고성능 계산기다. EVM은 여전히 감옥 안에 있지만, 특정 작업을 훨씬 빠르고 저렴하게 처리할 수 있게 된다. 이것 역시 100% 결정론적이다. 0x01 주소에 특정 입력을 넣으면, 모든 노드가 동일한 네이티브 코드를 실행하여 동일한 출력을 반환한다.
일부 커스텀된 EVM에서는 이 프리컴파일 개념은 극도로 확장된다. 표준적인 암호화 연산뿐만 아니라, bank.go나 staking.go처럼, EVM이 자체 SDK의 '은행(bank)' 모듈이나 '스테이킹(staking)' 모듈에 직접 접근할 수 있도록 허용하는 것이다. 이는 EVM이라는 감옥이 네이티브 체인이라는 '현실'과 상호작용할 수 있게 여는 강력한 문이다.
커스텀 EVM의 도전
여기까지가 표준 EVM의 세계다. 견고하고, 폐쇄적이며, 완벽하게 예측 가능하다. 하지만 최근 나의 흥미를 끈 일부 EVM 프로젝트들은 여기서 한 걸음 더 나아가려 한다. 그들의 문서를 보면, 이 결정론적 감옥(EVM)을 SDK라는 네이티브 프레임워크 위에 플러그인처럼 설치한다. 즉, EVM을 하나의 모듈로 취급한다. 이들의 야망은 이 EVM이 IBC(Inter-Blockchain Communication)라는 비동기 프로토콜을 사용해 다른 체인과 소통하게 만드는 것이다.
이것은 EVM의 근본 철학에 대한 정면 도전이다. EVM은 즉각적인 응답을 요구하는 동기식 기계인데, IBC는 언젠가 답장이 올 것을 전제로 하는 비동기식 프로토콜이다. 예를 들어, EVM이 "다른 체인으로 토큰을 보내라"는 명령을 내렸을 때 그 트랜잭션은 즉시 완료되어야 한다. 하지만 그 토큰이 실제로 성공적으로 도착했는지, 아니면 실패했는지에 대한 '영수증'은 몇 분 뒤, 혹은 몇 시간 뒤에나 돌아올 수도 있다.
해당 프로젝트는 이 모순을 해결하기 위해 프리컴파일과 EVM 확장을 사용한다. EVM이 IBC 전송을 호출하면, 프리컴파일은 이 요청을 받아 네이티브 코드로 번역해 발송한다. 그리고 EVM에게는 "일단 성공"이라고 즉시 응답하여 결정론을 유지한다.
진짜 문제는 그 답장, 즉 영수증이 돌아왔을 때 발생한다. EVM은 이미 자신의 트랜잭션을 완료하고 멈춘 상태다. 이를 담당하는 내부 기능은 이 비동기적 응답(영수증)을 받아, 사용자가 memo 필드에 미리 예약해 둔 EVM 내부의 컨트랙트를 다시 호출(Callback)하도록 설계되어 있다.
이 연결고리야말로 고민이 많이 담겨 있는 이음새다. 이 비동기적 다리는 과연 견고할까. 아니면 EVM이라는 신성한 감옥의 벽에, 우리가 모르는 치명적인 균열을 만들고 있는 것일까. 이 질문 속에 바로 다음 탐색의 실마리가 숨어있다. 결정론의 감옥이 비동기라는 바다를 만나기 위해 연 이 작은 창문은, 어쩌면 시스템 전체를 무너뜨릴 수 있는 가장 위험한 통로일지도 모른다.
< 3줄 요약 >
- EVM은 모든 노드가 동일한 결과를 계산해야 하는 합의(Consensus)를 위해, 합의를 깨뜨리는 외부 인터넷 API 호출이나 실시간 데이터 접근이 금지된 '결정론적 감옥'이다.
- 이 감옥은 '가스(Gas)'라는 경제적 비용을 통해 무한 루프를 방지하며, '오라클'(데이터 주입)이나 '프리컴파일'(고속 네이티브 연산)을 통해 외부와 제한적으로 소통한다.
- 일부 커스텀 EVM 프로젝트에서는 이 결정론적 EVM을 비동기 IBC 프로토콜과 연결하려 시도하며, 이 과정에서 EVM의 동기식 세계와 IBC의 비동기식 세계를 잇는 복잡한 '콜백' 메커니즘이 필요하게 된다.
'MACHINE: EXPLOIT' 카테고리의 다른 글
| 이름은 운명이다? 메타마스크는 왜 스냅을 선택했나 (0) | 2025.11.10 |
|---|---|
| 지분 증명 시대의 보이지 않는 권력자들, 검증인 (0) | 2025.11.10 |
| 실행자의 유령. 코드상의 나는 진짜 나인가? (0) | 2025.11.08 |
| 보안의 제1원칙: 왜 장부를 먼저 정리하고 돈을 내줘야 하는가 (0) | 2025.11.08 |
| 블록체인은 어떻게 현실을 움직이는가? 오라클의 양방향 혁명 (0) | 2025.11.07 |
| AI '기억 예산'의 숨겨진 규칙. "네"라고 대답했지만, 아무것도 기억하지 않는다 (0) | 2025.11.06 |
| 인터넷이 정보를 해방시켰다면, IBC는 자산을 해방시킨다 (0) | 2025.11.05 |
| EVM은 왜 미래를 예측할 수 없는가 (0) | 2025.11.04 |
| Code is Law의 배신, 그리고 프록시라는 구원 (0) | 2025.10.31 |
| 가장 비싼 땅, 이더리움에서 28바이트를 아끼는 기술 (0) | 2025.10.31 |