블록체인의 다양한 VM (Virtual Machine)
최근 커뮤니티에서도 EVM 외 VM에 대한 관심이 다시 조금씩 높아지는 것 같습니다.(MoveVM, LinuxVM, zkEVM, zkLLVM, etc)
그래서 VM이 뭐고, 왜 이렇게 열심히 다들 개발하는지 알기 위해 간단하게 소개해보겠습니다.
1️⃣ VM이란 무엇일까?
가상 머신(Virtual Machine)은 간단하게 생각하면 분리된 프로그래밍 실행 환경입니다. 프로그래밍을 그냥 돌리면 되지, 왜 가상 머신이라는 거창한 이름까지?
- 가상 머신은 원래 개발에서 사용하는 개념입니다. 분리되고 모두에게 통일된 환경은 어디에나 중요하기 때문이죠.
- 우선 스마트컨트랙트를 위해서는 프로그래밍 언어로 구현할 수 있는 환경이 구축되어야 합니다.
- 리소스가 제한된 블록체인(실행하는 동작이 전체 시스템을 건드려서도 안되니까)의 경우 이를 세팅할 수 있는 환경 또한 필요합니다. 그렇기에 개발 환경의 업그레이드 또한 블록체인 프로토콜과 별개로 진행할 수 있습니다.
- 블록체인은 분산 시스템입니다. 분산 시스템에서 핵심은 이를 실행하는 주체인 노드가 특정 요청에 대해 모두 동일한 결과값을 내야합니다. (결정론적 실행)
2️⃣ 그러면 VM을 만들기 위해선 어떤 요소들이 필요할까?
다양한 게 필요하지만 크게 동작적으로만 보면 이런 내용들이 포함됩니다.
- 명령어 집합: 컴퓨터는 상당히 단순한 모델입니다. 01로 구성되어 있긴하지만 동작 단위에서 가장 최소한의 연산은 메모리 접근, 더하기, 복사, 위치 이동, 정지 등으로 구성되어 있습니다. 이게 opcode로 구성되어 동작합니다.
- 실행 모델: 이런 명령어가 있으면 실행 순서에 대한 규칙이 정해져야합니다.
- 메모리 모델: 실행 모델과 연계되는 데, 결국 메모리도 장기적으로 저장하는 메모리, 필요에 따라 확보하는 메모리, 단기에 사용하는 메모리 등을 구분해서 사용해야 합니다. 특히 블록체인은 상태를 지속적으로 상태를 업데이트하는 상태머신이므로 더욱 중요하죠.
- 컴파일러: 위의 명령어 집합만 있다고 코드를 짤 수는 없습니다. (물론 예전에 천공카드 시절에는 그렇게 짜긴 함) Solidity 같은 고수준(쉬운) 언어로 코드를 구현하면 이를 명령어로, 그리고 실제 동작하는 01 바이트코드로 변환하는 컴파일러도 필요합니다.
3️⃣ 그럼 솔리디티는 뭔가요?
솔리디티는 EVM에서 사용하는 언어 중 하나입니다. 실제로 초반에는 Vyper를 쓰기 위해 노력하는 모습들도 볼 수 있습니다. (Uniswap V1, Curve 등)
솔리디티 외에도 Vyper, LLL, Fe, Huff 등 다양한 언어가 있습니다. 하지만 가장 범용적으로 사용되는 솔리디티만큼 커뮤니티가 크지는 않습니다. 그래도 어떤 언어로 작성하더라도 컨트랙트 작성은 가능합니다.
다만 EVM은 2015년 이더리움 설계 당시의 구현이며, 꽤나 비효율적인 부분이 많습니다. 컴파일 방식, 메모리 관리 방식 등 2024년의 발전된 개발 기술에 비하면 더 나아질 부분이 보이는 것이죠. 물론 언어와 VM을 새롭게 만든다는 것이 절대 쉬운 작업은 아닙니다.
그럼에도 사용자들이 많이 쓰는 이유는 (1) 이더리움 기반 커뮤니티의 규모 (2) 쉬운 문법 (3) 다양한 레퍼런스 정도가 될 것 같네요.
4️⃣ 그래서 사람들이 하는 건 뭔가요?
물론 블록체인 속도는 VM만이 아닌 합의 알고리즘 등 더 다양한 요소에 결정되지만 결국에는 이것들도 VM 설계가 필요합니다. 병렬EVM은 또 현재 EVM의 병렬처리 방식에 대한 접근이라 또 추후에 기회가 되면 정리해보겠습니다.
- MoveVM: Move언어를 사용한 VM입니다. 기본적으로 Rust 언어를 바탕으로 만들어졌는데, 메모리 및 스레드 안정성이 높아 최근 다양한 시스템이 Rust 기반으로 변경되는 추세와도 결이 맞습니다. (Aptos, Sui, Movement Labs)
- LinuxVM: 바이트코드 레벨로 변환되는 것이 VM의 최종 역할이라면 모든 코드가 돌아갈 수 있는 Linux 환경에서 스마트 컨트랙트를 만들면 되지 않나? 라는 시작점에서 만들어졌습니다. (Cartesi)
- zkEVM & zkVM & zkLLVM: 지금의 zk 방식이 EVM에서 비효율적이기에 호환성은 유지하되 zkEVM을 효율적으로 만드려고 하는 팀(zkSync, Polygon, Linea, Kroma)과 호환성을 버리고 효율성을 최대화하는 zkVM 팀(StarkNet)이 있습니다. 그 와중에는 컴파일러 레벨에서 중간 표현을 사용하여 zk 친화적인 실행환경이자 다양한 언어를 사용할 수 있는 zkLLVM(nil Foundation)도 있습니다.
5️⃣ 그럼 무엇에 베팅을 해야하는가?
모든 사업이 그렇듯 기술은 성능에만 의존하는 것은 아닙니다. (1) 학습 난이도와 유연성 (2) 레퍼런스 (3) 개발진의 꾸준함 등 정말 다양한 것들이 포함됩니다.
그렇기에 별로인 프로덕트라도 꾸준히 팀들은 해커톤을 열어 레퍼런스를 쌓고, 개발자의 피드백을 통해 지속적으로 개발 문서와 실제 내용을 업그레이드 하는 것이죠.
성공의 유무는 어렵습니다. 저 또한 처음 개발할 때는 파이썬과 같이 느리고 비효율적인 언어가 이렇게 성장할지 몰랐습니다. AI의 붐 => 개발자 수요 증가 => 범용 언어 중 학습 난이도가 쉬운 파이썬의 수요 증가 => 파이썬 대중화 => 파이썬 개발 커뮤니티 증대 => 다양한 속도 개선 => 마법의 언어가 되버림. 이런 흐름으로 갑작스럽게 컸던 기억이 있네요. 결국 시기도 중요하고 팀도 중요합니다.
블록체인 커뮤니티가 커져가는 방식이 어떨지 고민해보시며 이런 개발 생태계에 관심을 가져보시면 좋을 것 같습니다.