본문으로 건너뛰기
0%

Solidity vs. Vyper: 알아야 할 모든 것

Alchemy team headshot

작성자 Alchemy

2022년 10월 4일에 게시됨6분 읽기

apps의 기저에는 스마트 컨트랙트의 지속적인 실행이 있습니다. 컴퓨터 과학자이자 암호학자인 Nick Szabo가 처음 제안한 스마트 컨트랙트는, 블록체인 상의 계정 동작을 관장하는 프로그래밍 가능한 코드와 데이터를 의미합니다. 스마트 컨트랙트 코드는 블록체인에 존재하며, Ethereum 블록체인의 상태를 변경하는 메커니즘 중 하나입니다.

스마트 컨트랙트는 Ethereum 상의 프로그램을 가능하게 하는 핵심 요소입니다. Vitalik Buterin의 최초 백서에서는 Ethereum을 "차세대 스마트 컨트랙트… 플랫폼"이라고 설명하고 있습니다. 스마트 컨트랙트는 일반적으로 자산 이전을 실행하도록 프로그래밍되지만, 그 활용 범위는 토큰 생성, 앱 및 DeFi 제품 구축, NFT 거래 등 훨씬 더 넓습니다.

스마트 컨트랙트를 작성하기 위한 프로그래밍 언어는 여러 가지가 있으며, 각 web3 언어는 서로 다른 필요, 이점, 트레이드오프에 최적화되어 있기 때문에 어떤 언어를 선택할지는 사용 사례에 따라 달라집니다.

먼저 개발자는 고수준 언어와 저수준 언어 중 하나를 선택합니다. 고수준 언어는 구현의 세부적인 사항을 추상화하여, 개발자가 바이트코드에 대한 이해 없이도 스마트 컨트랙트를 손쉽게 작성할 수 있게 해줍니다.

Ethereum 및 Ethereum Virtual Machine(EVM) 호환 블록체인에서 사용되는 대표적인 고수준 언어로 SolidityVyper가 있습니다.

Solidity란 무엇인가?

Solidity는 Ethereum Virtual Machine 상에서 스마트 컨트랙트를 작성하기 위한 고수준의 튜링 완전 프로그래밍 언어로, 탈중앙화 금융(DeFi), NFT, 지갑 등 다양한 사용 사례를 지원합니다.

Solidity는 문법에서 드러나듯 C++와 JavaScript의 영향을 강하게 받았으며, Python과 동일한 다중 상속 알고리즘을 사용합니다. Solidity는 Ethereum과 가장 밀접하게 연관되어 있지만, Polkadot이나 Avalanche 등 여러 블록체인 플랫폼에서도 실행됩니다.

Ethereum CTO인 Gavin Wood가 제안한 Solidity는 유연한 스마트 컨트랙트 기반 개발자 플랫폼에 대한 수요를 충족하기 위해 개발되었습니다. Solidity를 사용하면 개발자는 다양한 사용 사례를 위한 스마트 컨트랙트를 작성할 수 있으며, 이는 오늘날 Ethereum 상에서 운영되는 활발한 탈중앙화 애플리케이션 생태계를 만들어냈습니다.

Vyper란 무엇인가?

Vyper는 Solidity와 유사한 고수준 프로그래밍 언어로, EVM 호환 블록체인에서 사용되는 스마트 컨트랙트의 보안성을 높이기 위해 의도적으로 설계되었습니다.

Pythonic 문법을 사용하는—이름에 뱀을 뜻하는 어원이 들어간 이유이기도 한—Vyper 코드는 가독성을 우선시하여, 개발자가 컨트랙트를 배포하기 전에 코드 내의 버그와 취약점을 쉽게 발견할 수 있도록 합니다.

Vyper는 스마트 컨트랙트의 보안을 더욱 강화하기 위해 강한 타이핑과 계산 가능성(decidability)을 사용합니다. Vyper에서 선언되는 각 변수는 명시적인 타입을 가져야 하며, 컨트랙트의 계산 가능성 덕분에 개발자는 컨트랙트 배포 전에 가스 소비량의 상한을 계산할 수 있습니다.

Solidity vs. Vyper

Solidity와 Vyper 모두 EVM 호환 스마트 컨트랙트를 만드는 데 사용할 수 있지만, 두 web3 코딩 언어는 서로 다른 설계 원칙을 가지고 있기 때문에 dApp 개발에 어떤 언어가 최적인지 결정할 때 이점과 트레이드오프가 존재합니다.

이 대비를 더 잘 이해하기 위해, 먼저 Solidity와 Vyper가 어떤 부분에서 겹치는지 살펴보겠습니다.

Solidity와 Vyper의 공통점은 무엇인가?

두 언어 모두 고수준이며, Solidity와 Vyper의 컴파일러는 코드를 EVM이 실행할 수 있는 시스템 수준 바이트코드로 변환합니다. 즉, 배포 후에는 Solidity와 Vyper 스마트 컨트랙트가 동일한 바이트코드 언어로 실행된다는 의미입니다. 그 결과, Solidity와 Vyper 컨트랙트는 같은 애플리케이션 내에서 동시에 사용될 수 있습니다.

Vyper와 Solidity 스마트 컨트랙트의 구조에는 여러 유사점이 있습니다:

  • 버전 프라그마(Version pragma) - 각 스마트 컨트랙트에 대해 의도된 컴파일러 버전 또는 버전 범위
  • 상태 변수(State variables) - 스마트 컨트랙트 스토리지에 영구적으로 저장되는 값
  • 구조체(Structs) - 여러 변수를 하나의 타입으로 묶기 위해 커스텀 정의할 수 있음
  • 함수(Functions) - 컨트랙트 안팎에서 상태 변경을 수행할 수 있는 실행 가능한 코드 라인
  • 이벤트(Events) - EVM을 통해 액션을 기록하며, 발생 후 효율적으로 검색 가능
  • 오버플로우 체크(Overflow Checking) - 배열 접근과 산술 연산을 검사하여 변수 저장의 안전성을 보장함으로써 데이터 타입의 우발적인 오버플로우를 방지

스마트 컨트랙트 핵심 구조의 상당 부분은 Solidity와 Vyper 스마트 컨트랙트 간에 공유됩니다. 그러나 Solidity와 Vyper는 web3 개발자가 스마트 컨트랙트를 작성하는 매우 다른 방식을 각각 제공합니다.

Solidity와 Vyper는 어떻게 다른가?

Vyper와 Solidity의 핵심적인 차이는, Vyper가 계산 가능성(decidability)을 포함해 보안을 근본적인 설계 원칙으로 삼고 있으며, modifier, 상속, 인라인 어셈블리, 함수 오버로딩, 재귀 호출을 지원하지 않는다는 점에서 비롯됩니다.

Vyper는 기능을 추가하는 동시에 Solidity의 위험한 속성 일부를 제외함으로써 Solidity에 비해 추가적인 보안성을 확보합니다.

1. 계산 가능성(Decidability)

계산 가능성을 통해 개발자는 각 컨트랙트의 가스 소비 상한을 계산할 수 있어, 가스 한도 공격을 방지할 수 있습니다. 가스 한도 공격은 서비스 거부(DoS) 공격의 한 종류로, 악의적인 행위자가 컨트랙트를 통해 트랜잭션을 전송하여 블록 가스 한도를 초과시킴으로써 다른 모든 트랜잭션이 실패하거나 되돌려지도록(revert) 강제합니다.

2. Modifier

Solidity에서는 함수 정의 앞에 modifier를 붙일 수 있으며, 이 modifier는 코드의 다른 곳에 정의되어 스마트 컨트랙트 실행 전후로 검사를 수행하거나 상태를 변경하는 등의 작업을 할 수 있습니다.

modifier의 특성상 오해의 소지가 있는 코드를 작성하기 쉬우며, 겉보기에는 무해해 보이는 함수 modifier가 실제로는 취약점을 만드는 연산을 수행할 수 있습니다. Vyper는 가독성과 위험한 코드의 탐지를 개선하기 위해 modifier를 지원하지 않습니다.

3. 클래스 상속

클래스 상속을 사용하는 코드를 읽으려면, 컨트랙트가 어떻게 동작하는지 이해하기 위해 여러 개의 서로 다른 코드 파일을 읽어야 합니다. 또한 Solidity는 다중 상속을 허용하기 때문에, 충돌이 어떻게 해결되는지 알기 위해서는 우선순위 규칙을 이해해야 합니다.

동일한 이름을 가진 여러 함수가 상속된 경우, 컨트랙트가 실제로 사용하는 것은 어느 것일까요?

Vyper는 상속을 허용하지 않기 때문에, 감사해야 할 파일 수가 더 적어 코드를 더 쉽게 감사할 수 있습니다.

4. 인라인 어셈블리

Vyper에서 인라인 어셈블리 메커니즘—즉 Solidity 코드를 머신 코드로 변환하는 기능—을 제외함으로써, 변수 이름을 코드 내에서 검색하여 해당 변수가 읽히거나 수정되는 모든 위치를 확인할 수 있습니다.

5. 함수 오버로딩

Solidity에서 함수 오버로딩은 유해한 코드를 숨길 수 있게 만들기 때문에, Vyper에서는 지원되지 않습니다. 예를 들어, 함수 \{sendToken(address)\}은 안전할 수 있지만 \{sendToken(address, “Hello!”)\}은 지갑을 비워버릴 수 있습니다.

함수 오버로딩을 배제함으로써 Vyper는 어떤 함수가 정확히 언제 호출되는지 이해하기 쉽게 만듭니다.

6. 재귀 호출과 무한 루프

재귀 호출과 무한 루프는 가스 한도의 상한을 계산하는 것을 불가능하게 만들며, 이는 Vyper의 계산 가능성 특성과 상충됩니다. 이것이 Vyper에서 재귀 호출이 지원되지 않는 이유입니다.

Solidity 대신 Vyper를 사용할 때의 이점은 무엇인가?

Vyper의 여섯 가지 주요 차이점은 Solidity에 비해 Vyper에 보안성과 감사 용이성이라는 두 가지 뚜렷한 이점을 부여합니다.

1. 보안성

다양한 안전 기능을 통해 Vyper는 개발자가 버그와 공격 가능한 표면을 탐지하지 못한 채 취약한 코드를 작성하는 것을 방지합니다.

2. 감사 용이성

Vyper 코드는 스마트 컨트랙트 보안 감사자가 스마트 컨트랙트가 정확히 무엇을 하고 있는지 읽고 이해하기 쉽게 만듭니다. 즉, 여러분의 스마트 컨트랙트를 읽는 모든 사람이 블록체인 상에서 자산이 어떻게 조작될 것인지 빠르게 파악할 수 있다는 의미입니다.

마지막으로, Vyper를 배워나가면서 그 가독성 덕분에 다른 앱의 기존 스마트 컨트랙트를 읽는 과정도 더 수월해질 것입니다.

Solidity 대신 Vyper를 사용할 때의 트레이드오프는 무엇인가?

Vyper가 Solidity로 할 수 있는 모든 것을 추가적인 보안 보호와 함께 할 수 있는 것처럼 보이지만, Solidity 대신 Vyper를 선택하는 데에는 유연성과 커뮤니티라는 두 가지 주요 트레이드오프가 따릅니다.

1. 유연성

Vyper의 문서에는 Vyper가 Solidity를 완전히 대체하려는 의도가 아니라고 명시되어 있는데, 이는 Solidity에서는 할 수 있지만 Vyper로 코딩할 때는 명시적으로 금지되는 사항들이 있기 때문입니다. 따라서 Solidity 대신 Vyper를 선택하는 것은 스마트 컨트랙트의 유연성을 포기하고 애플리케이션의 범위를 제한하는 것을 의미합니다.

2. 개발자 커뮤니티

수치만 놓고 보면 Solidity는 Vyper보다 훨씬 더 널리 사용되는 web3 프로그래밍 언어입니다. GitHub에서 Vyper로 작성된 모든 파일(.vy)과 Solidity로 작성된 모든 파일(.sol)을 간단히 검색해보면 각 언어를 사용하는 개발자 수를 어느 정도 가늠할 수 있습니다. 이 글을 작성하는 시점 기준으로, GitHub에는 Vyper 파일이 약 10,300개 있는 반면 Solidity 파일은 830만 개에 달했습니다.

따라서 Vyper로 코딩하는 사람들을 위한 가이드와 자료는 상대적으로 적습니다. 공식 가이드 외에는, Vyper로 개발하면서 겪을 수 있는 어려움을 다루는 커뮤니티 논의를 찾기가 더 어려울 것입니다.

Solidity와 Vyper - 어떤 언어를 선택해야 하는가?

Vyper와 Solidity의 호환성 덕분에 하나의 언어만 선택해야 하는 양자택일의 문제는 아니지만, 더 기본적이고 유연성이 필요한 스마트 컨트랙트는 Solidity로 작성하고, 확실한 보안 보장이 필요한 애플리케이션은 Vyper를 선택해야 합니다.

두 언어는 각각 다른 사용 사례를 가지고 있기 때문에 어느 한쪽이 명백히 더 낫다고 할 수는 없습니다. 유연성이 부족하고 깊이 있는 개발자 커뮤니티가 없다는 점에서, Vyper는 최고 수준의 보안이 필요한 용도에 최적이며, web3 개발을 처음 시작하는 사람이라면 먼저 Solidity를 배우는 것이 좋습니다.

Solidity와 Vyper 학습을 시작하는 방법

Vyper는 개발자 커뮤니티가 상대적으로 덜 활발하지만, 이 두 프로그래밍 언어를 배우기 위한 공식적, 비공식적 자료는 여전히 풍부하고 유용합니다. 다음 자료들은 Solidity 개발자가 되는 데 도움을 줄 것입니다:

Solidity 학습 자료

Solidity를 배우는 가장 좋은 방법은 Solidity 부트캠프에 등록하는 것이며, ChainShot의 web3 엔지니어들로 구성된 최정예 팀이 이끄는 Alchemy University의 Ethereum Developer Bootcamp는 이용 가능한 가장 종합적인 7주 온라인 Solidity 과정입니다. Alchemy가 최근 ChainShot을 인수함에 따라, Alchemy는 원래 3,000달러였던 ChainShot의 부트캠프를 완전 무료로 제공하고 있습니다.

지금 Alchemy University의 Ethereum developer bootcamp에 등록하여 Ethereum 앱을 개발하는 방법을 배워보세요.

부트캠프 외에도, Solidity를 배울 수 있는 몇 가지 추가적인 방법이 있습니다:

  • 공식 문서 - Solidity 문서는 타입부터 스마트 컨트랙트, 컴파일러까지 모든 것을 다룹니다
  • Solidity by Example - 유용한 설명이 곁들여진 Solidity 코드 예제 모음
  • Clean Contracts - 안전하고 예측 가능한 Solidity 스마트 컨트랙트를 작성하는 방법을 배웁니다
  • Ethernaut by OpenZeppelin - 스마트 컨트랙트 기반 워게임에서 스마트 컨트랙트를 해킹해봅니다

개발 전반에 익숙하지 않은 개발자라면, Alchemy의 3주 JavaScript 크래시 코스가 Ethereum 부트캠프를 시작하기 전에 좋은 선행 학습이 될 것입니다.

Vyper 학습 자료

부트캠프를 통해 Solidity를 배운 후, Vyper를 배우는 가장 좋은 방법은 공식 문서를 읽고, 튜토리얼을 따라 만들어보고, GitHub에서 .vy 파일을 연구하는 것입니다.

결론

대부분의 개발자에게는 Solidity만으로도 스마트 컨트랙트에 필요한 요구사항을 충분히 충족할 수 있지만, 극도로 높은 수준의 보안이 필요한 경우에는 Vyper가 훌륭한 선택이 됩니다. Vyper와 Solidity 모두 Ethereum 블록체인 상에서 구축할 수 있는 가능성을 온전히 실현하기 위한 도구이기 때문에, 어느 쪽이 명확한 승자라고 할 수는 없습니다. Vyper와 Solidity는 서로를 보완하는, Ethereum 개발자라면 반드시 배워야 할 두 가지 프로그래밍 언어입니다.

Background gradient

블록체인 매직을 만드세요

Alchemy는 가장 강력한 Web3 개발자 제품 및 도구를 리소스, 커뮤니티, 그리고 전설적인 지원과 결합합니다.