3세대 블록체인의 프로그램 언어 - 서울대학교 디사이퍼(Decipher) 김재윤

Words
481
Reading
3 min
Listen
Play
7y


이더리움이 가지고 있는 또 하나의 문제점은 바로 스마트 콘트랙트의 성능과 보안 취약점에 있다. 이더리움 가상 머신 (Ethereum Virtual Machine, EVM)은 결정적인(deterministic) 프로그램의 실행을 보장해야 한다.

다시 말해, 모든 노드들이 프로그램을 실행한 결과가 같아야 한다. 따라서 컴퓨터의 아키텍처나 시스템 성능에 따라서 프로그램의 실행 결과가 달라지면 안 되기 때문에 기능과 최적화를 제한한 가상 머신을 사용하므로 성능이 느리다는 단점이 있다.

또한, EVM의 실행 프로그램을 Solidity라고 하는 절차형 언어로 작성하는데, 여기에 보안 취약점이 많이 발생한다. 사실 EVM의 instruction과 관련한 문제들은 모두 수정되었기 때문에 시스템의 문제라기보다는 사용자의 문제라고 보는 것이 맞지만, 보안에 취약하지 않은 코드를 작성하는 것이 어렵다면 그것이 일반 사용자들에게 장벽이 되어 블록체인의 대중화를 지연시킬 수 있다.

높은 성능을 가지면서도 사용자들이 보안적으로 안전한 스마트 콘트랙트를 작성할 수 있는 프로그램 언어와 가상 머신을 적용하고자 하는 블록체인 프로젝트들이 등장했다. 이번 글에서는 기술적인 용어들을 많이 다룰 예정이라 대략적인 내용만 파악하고 스킵해도 무방하다.

WebAssembly (WASM)

웹 어셈블리는 자바스크립트로 작성되는 웹 어플리케이션의 속도를 개선하기 위해 개발되고 있는 언어이다. 자바스크립트로 작성된 프로그램은 소스코드 형태로 배포되기 때문에 웹 브라우저가 코드를 해석(interpret)하고 런타임 프로파일링(runtime profiling)과 Just-In-Time(JIT) compilation을 통해 최적화하고, Garbage Collection(GC)을 통해 메모리 관리를 한다.

이러한 일련의 과정이 어플리케이션 성능을 저하시키기 때문에 브라우저 4대 빅 벤더인 구글, 마이크로소프트, 애플, 그리고 모질라가 합심하여 기계어에 가까운 형태로 배포되는 웹 어셈블리라는 언어를 만들고 있다.
현재 EVM 등 블록체인에 임베딩 된 가상 머신의 성능이 좋지 않기 때문에 웹 어셈블리를 채택하여 가상 머신으로 사용하려는 시도가 늘어나고 있다. 이미 이오스는 웹 어셈블리를 사용하고 있고, 이더리움도 EWASM이라고 하는 가상 머신을 만들어 다음 버전에 적용할 계획이다.

Functional Programming Languages (FL)

프로그램에서 개발자가 의도하지 않은 경로로 프로그램이 실행되는 경우, 그것을 버그라고 부른다. 버그가 발생하면 보통 프로그램에 에러를 출력하며 죽어버리지만, 그렇지 않은 경우 심각한 문제를 초래할 수 있다. 게다가 내부적으로는 의도치 않은 방향으로 프로그램이 전개되는데도 불구하고 겉으로는 의도한 것처럼 돌아간다면 쉽게 눈치챌 수 없어 대응이 늦어지게 되고 막대한 피해와 손실을 가져올 수 있다.

스마트 콘트랙트도 프로그램의 일종이고, 코드가 자산을 다루기 때문에 버그가 없는 코드를 작성하는 것이 가장 중요하다. 하지만 프로그래밍을 해보신 분들은 알겠지만, 버그 없는 코드를 작성하는 것은 정말 어렵다. 머리로 생각할 수 있는 경우의 수에 한계가 있어 모든 경우를 꼼꼼히 따져보기 쉽지 않기 때문이다. 따라서 최대한 버그가 발생할 확률을 줄일 수 있도록 안전하다고 널리 알려진 프로그래밍 패턴을 쓰고, 프로그램 분석기를 가지고 프로그램 분석을 해 보는 것이 도움이 된다.

이때, 절차형 언어보다는 함수형 언어가 분석기를 통해 정적 분석(static analysis)을 하기 유리하다. 왜냐하면 함수형 언어는 어떤 함수가 변경하는 모든 state를 입력으로 받아서 처리하여 부작용(side effect)을 최소화하기 때문이다. 하지만 불행하게도 Solidity는 CA(Contract Account)에 정의된 state를 트랜잭션에 의해서 불리는 함수가 변경하는 형태이므로 항상 함수 외부의 state에 접근하게 된다. 이로 인해서 수많은 버그와 취약점이 발견되므로 이를 함수형으로 바꾸고자 새로운 프로그래밍 언어를 만들거나 도입하고자 하는 프로젝트로 Zilliqa(Scilla), Kadena(Pact), Tezos(Ocaml) 등이 있다.

결론

이번 글에서는 프로그램 언어를 발전시키고자 하는 시도에 대해서 다루어 보았다. 프로그램과 관련한 내용이기 때문에 최대한 쉽게 서술하려 해 보았으나 용어와 지면의 한계로 실패한 것 같아서 아쉽다. 하지만 만약에 프로그래밍 언어에 관심이 있으신 분이라면 흥미롭게 느끼는 부분들이 많을 것이라 생각한다. 다음 글에서는 하드포크를 통한 업그레이드 방식을 개선하고자 하는 프로젝트들에 대해서 살펴보겠다.




alt

지금 INBEX를 방문해보세요!