Devcon4 참관기- Getting Start with Vyper

온더는 이더리움 블록체인의 확장성 솔루션 Plasma 체인을 연구개발하는 회사입니다. 온더의 비전은 이더리움 블록체인 기술의 사용성을 제고시키고, 암호경제와 현실경제를 연동시켜 지금보다 더 나은 세상을 만드는 것입니다.

안녕하세요. 이번에 소개하고자 하는 참관기는 Getting Start with Vyper 입니다. Devcon4는 세션의 종류마다 할당된 시간이 다르다는 특징이 있습니다. 짧은 세션의 경우 10분 정도의 시간이 할당 되었으며, 보통은 약25분에서 30분정도의 시간이 할당 되었습니다. 하지만 제가 이번에 소개드릴 Getting Start with Vyper와 같은 workshop 세션은 무려 2시간이라는 시간이 할당되었습니다.

Workshop 세션같은 경우는 이전 Devcon에는 없었으나 이번에 새로 추가된 세션의 형태로 알고 있습니다. 그리고 2시간 동안 발표자 혼자서 떠드는 것이 아니라 세션에 참석한 사람들이 직접 세션의 내용을 실습해보는 시간을 갖는 다는 특징이 있습니다. 이더리움 재단 측에서 일방적인 전달 뿐만아니라 직접 실습해보면서 해당 기술에 대해 습득할 수 있도록 새로운 시도를 한 것이 아닌가 하는 생각이 듭니다.

이제 본격적으로 Getting Start with Vyper 세션에 대한 소개를 시작해 보도록 하겠습니다. Vyper는 Solidity와 같은 이더리움의 스마트 컨트랙트 언어입니다. Python과 매우 유사한 형태를 띄고 있어서 제가 개인적으로 좋아하는 언어이기도 합니다. 최근에 비콘체인 컨트랙트가 Vyper로 작성되는 것으로 알려져 대중들에게 소개되었습니다.

Vyper Features

세션은 우선 Vyper의 특성들에 대한 소개로 시작 되었습니다. Getting Start with Vyper라는 제목 답게 전체적으로 Vyper에 대한 개론에 대한 내용을 전달하는 듯한 인상을 받았습니다. 특징에 대한 소개가 끝난 후에는 Vyper의 자료형에 대한 소개가 이어졌습니다.

Vyper의 자료형

위 사진은 Vyper에서 사용할 수 있는 자료형에 대한 내용입니다. 사진을 보면 Vyper에서 변수를 선언하는 방법을 볼 수 있습니다. 대부분의 언어는 변수를 선언할 때 int a와 같이 먼저 해당 변수가 어떤 데이터 타입을 갖는지 명시 한 다음 변수의 이름을 정의하는 순서로 이루어져 있습니다. 하지만 Vyper는 a:int와 같이 먼저 변수의 이름을 정의한 다음 해당 변수의 데이터 타입을 정의하는 순서로 변수에 대한 선언을 해야한다는 차이점이 있습니다.

Solidity와의 차이점에 대해 더 알아 보자면 event와 mapping을 선언하는 방법이 차이가 있습니다. 먼저 mapping을 선언하는 방법에 대해 알아보면 Solidity에서는 mapping(address=>uint256) public a 와 같은 방식으로 해주어야 하지만 Vyper에서는 a: public(address[uint256]) 과 같이 해야합니다. 그 다음은 event 선언 방식의 차이입니다. Solidity에서는 event a({address b, uint c}) 와 같은 방식으로 해주면 되지만, Vyper에서는 a: event({a:address, b:uint}) 와 같이 해주면 됩니다.

여기까지는 사실 특별할 것 없는 세션 이었습니다. 하지만 세션을 듣던 중 신기한 광경을 보게 되었습니다.

우리들의 아이돌

바로 뭔가 낯익은 뒷모습을 발견한 것입니다. 뒷 모습만으로 누구인지 판별하지 못한 분들을 위해 저 익숙한 뒤태의 주인공에 대해 이야기하자면 이더리움계의 셀럽 비탈릭 부테린 입니다. 이런 대략적인 Vyper에 대한 소개가 끝나고 직접 실습할 시간이 찾아왔습니다. 그리고 실습이 시작됨과 동시에 비탈릭은 사라졌습니다..

실습 내용에 대한 소개를 하기 전에 먼저 Vyper의 특징에 대한 소개를 간단하게 하고 넘어가도록 하겠습니다.

Vyper의 특징

Vyper의 특징으로는 Security, Language and compile simplicity, Auditability 이 세 가지가 있습니다. 더 보안적인 측면에서 뛰어나고, 간단한 언어이며, 코드에 대한 보안 감사를 하기 용이하다는 의미인데, 한 마디로 ‘더 간단하고 읽기 쉬운 언어이기 때문에 보안적인 취약점을 발견하기 쉽기 때문에 더 안전한 코드를 작성할 수 있다.’ 라고 볼 수 있을것 같습니다.

그리고 이 세가지 특징을 보장하기 위해 제한되는 기능들이 있는데 그 중에서 몇 가지만 소개해 드리겠습니다.

  • Modifiers: Modifier를 이용하면 잘못된 코드를 작성할 가능성이 높고, 보안감사를 하기 어렵게 만들기 때문에 Vyper에서는 이 기능을 제공하지 않습니다. Modifier의 일반적인 사용 방법은 프로그램 실행전에 단일 검사를 수행하는 것인데 이런 확인은 단순히 assert문을 이용하는 것이 좋습니다.
  • Class inheritance: 클래스 상속이 있으면 코드의 기능을 파악하기 위해 여러 파일을 참조해야하며, 충돌이 일어날 경우 우선 순위 규칙을 이해해야 하기 때문에 코드를 이해하기가 어렵기 때문에 이 기능을 제공하지 않습니다.
  • Inline Assembly: inline assembly가 있을 경우 Ctrl + F를 사용하며 모든 인스턴스를 찾을 수 가 없기에 이 기능을 제공하지 않습니다.
  • Function Overloading: 오버로딩을 사용하게 되면 특정 시간에 어떤 함수가 호출 되는지 파악하는데 많은 혼동을 일으킬 수 있기 때문에 제공하지 않습니다.

이러한 특징들로 미루어 볼 때 Vyper의 철학은 읽기 쉽고 한 눈에 파악할 수 있는 코드를 작성하게 하는 것이고, 이를 실현하기 위해 코드를 복잡하게 하는 기능들을 제한한다고 보면 될 것 같습니다.

실습

실습시간은 세션의 책임자들이 준비한 코드를 바탕으로 테스트 코드를 돌려보는 작업으로 알고 있었습니다. 실습을 위해서는 위 링크에 연결된 Github 레포지토리에서 소스 코드를 받으신 후 README.md에 안내된 내용대로 설치하시면 됩니다. 설치가 완료 된 후 pytest tests 를 콘솔에 입력하면 테스트가 진행이 됩니다. 하지만 여기서 문제가 발생했습니다. 바로 준비된 코드가 테스트를 통과하지 못하고 에러를 잔뜩 내뱉었습니다. 저 뿐만 아니라 같이 듣고 있던 다른 참관자들도 같은 에러를 겪고 있어서 뭐가 문제인지 모른체 있었는데 알고보니 해당 코드는 테스트 코드는 작성되어 있었으나 Vyper 코드는 이벤트, 매핑, 함수명만 정의되어 있었고 각 함수의 내부를 채워 테스트가 원활하게 작동하도록 해야하는 것이었습니다.

위 그림에서 보시는 것처럼 vyper에 대한 lint가 설정이 안되어 있어서 이벤트나 매핑이 정의되어 있는 것을 보고 완성된 코드라고 착각을 했던 것이었습니다. 이런 것은 IDE에서도 마찬가지여서 코드의 가독성이 매우 떨어진다는 문제가 있습니다. 이런 문제를 해결하려면 여기에서 IDE에 플러그인을 설치하시거나 파이썬용 IDE에서 Vyper 코드의 확장자를 .vy에서 .v.py로 바꿔 주시면 완전하게 지원되는 것은 아니지만 주석과 코드, 함수 정도는 식별할 수 있기 때문에 코딩 하는데 큰 지장은 없을 것 입니다.

주어진 테스트 코드는 총 10개의 테스트 항목이 있는데 raffle.vy에 비어 있는 부분의 코드를 작성하여 테스트가 원활하게 작동하도록 하면 됩니다. 어떻게 하면 되는지에 대한 예시를 준비 했습니다.

저도 Vyper로 코드를 작성해 본 것은 처음이라 코드에 미숙한 점이 보이더라도 이해해 주시길 부탁드립니다 ^^.. 위 코드는 앞에서 언급했던 10개의 테스트 항목중 8개를 통과하는 코드 입니다. 모든 정답을 올리면 여러분들이 문제 해결에 대한 성취감을 위해 남겨두도록 하겠습니다.

마치며

Vyper로 코드를 작성하면서 느꼈던 개인적인 에로사항은 파이썬과 비슷한 형태로 생겨서 파이썬 코딩하는 것과 같은 생각으로 변수의 자료형에 대해 크게 신경을 쓰지 않고 코딩을 했다가는 코드가 제대로 동작을 하지 않는 것이었습니다. 파이썬과 다른게 Vyper는 자료형들을 철저하게 지켜주어야 합니다. 파이썬처럼 생겨서 파이썬으로 코딩하듯 코드를 작성 한다면 빨간 글자를 많이 보게 될 것입니다.(저 처럼..)

Vyper가 앞으로 이더리움에서 어떻게 활용 될지는 아직 모르겠습니다. 아직은 뛰어난 가독성으로 인해 poc의 용도로 많이 활용되는 것 같지만 앞으로는 활용도가 더 높아졌으면 좋겠습니다.