초보자들을 위한 이더리움 DApp 만들기
About Teckle (Technology + Tackle = Teckle)
Teckle은 “어려운 기술을 확고히, 효율적으로 분석하여, 많은 이들이 알 수 있도록 널리 알리자” 라는 목적을 가지고 만들어진 블록체인 스터디 및 DApp 개발 모임입니다. 현재 6인의 멤버가 함께하고 있습니다.
들어가며
이 글은 DApp을 처음 접하는 개발자를 위한 글입니다. Solidity 언어로 이더리움 기반의 탈중앙화된 애플리케이션(Decetralized applications)을 만드는 과정을 이해할 수 있게 썼습니다.
*기초적인 웹 개발 지식을 필요로 합니다.
목차:
Part 1. 개발 흐름 이해하기
- DApp이 뭔가요?
- Solidity란?
- 개발 환경 구성
Part 2. 개발부터 배포까지
- 스마트 컨트랙트 작성
- 테스트넷 배포
- 프론트엔드 작성
- 메인넷 배포
Part1. 개발 흐름 이해하기
A. DApp이 뭔가요?
먼저 DApp(Decentralized application)에 대한 이해를 하고 넘어가야겠죠? DApp은 블록체인 위에서 돌아가는 애플리케이션입니다. 아이폰과 구글이 각각의 OS로 플랫폼을 만들고 그 위에 앱들을 만들 수 있는 생태계를 제공한 것처럼, 블록체인 플랫폼 (ex. 이더리움, 이오스, 퀀텀, 네오 등) 역시 그 위에 애플리케이션을 만들고 운영할 수 있습니다.
그렇다면 일반 애플리케이션과 DApp의 차이가 뭐야? 라는 의문이 드실텐데요. 완벽히 탈중앙화된 애플리케이션은 다음과 같은 특성을 가지고 있습니다:
- 오픈 소스 기반이며 자율적으로 운영됨 (블록체인으로 운영하는 서비스는 서비스가 중단되거나 사라진다고 하더라도, 한 번 배포하면 영원하기 때문에 계속해서 사용이 가능)
- 퍼블릭 블록체인 위에 데이터를 저장 (한번 블록체인 위에 올라가면 데이터를 다시 되돌리거나 변형 불가능)
- 암호화폐에 가치를 부여함
- 알고리즘 기반에 의한 토큰 생성
위와 같은 특징때문에 데이터 조작으로 부터 안전하며, 민주적으로 애플리케이션을 운영할 수 있습니다. (커뮤니티가 주도해서 업데이트를 반영할지, 반영하지 않을지 정하기 때문에, 개발자들이 마음대로 서비스를 바꿀 수 없습니다).
DApp 의 가장 유명한 예시로는 크립토키티(Cryptokitties)가 있습니다. 크립토키티는 DApp으로 구현된 최초의 게임입니다. 고양이를 수집, 교배하는데, 고양이는 가상 화폐로 거래할 수 있습니다. 한때 이더리움 메인넷을 마비시킬 정도로 인기를 끌었던 앱이기도 하며, 얼마전엔 큰 투자 유치까지 완료했습니다. 게임에서 사용되는 거래와 데이터 중 크립토 이미지와 같은 일반적인 리소스들은 중앙화된 서버에서 관리를 하나, ERC 721 토큰 소유권에 대해서는 블록체인 위에 데이터를 올리는 형식으로 운영하고 있습니다.
크립토키티를 포함한 대부분의 DApp 들이 일부 리소스를 중앙화된 서버에 저장하는 것과 달리, DelegateCall(블록체인 기반 Q&A 질문 DApp)처럼 100% 블록체인 위에서 돌아가는 서비스도 있습니다.
현재 이더리움 블록체인에서 운영되고 있는 다양한 DApp을 보고 싶으시다면, 이곳에서 확인 가능합니다.
B. Solidity란?
Solidity란 이더리움 기반의 스마트 컨트랙트를 작성할 수 있는 객체지향형 프로그래밍 언어입니다. C++, Python, 그리고 자바스크립트에 영향을 많이 받았으며, 짜여진 스마트 컨트랙트는 이더리움 가상 머신인 EVM(Ethereum Virtual Machine)에서 실행됩니다.
Solidity is statically typed, supports inheritance, libraries and complex user-defined types among other features.
위 문장에 나와있듯이 솔리디티는 정적 타입의 언어이며, 상속과 라이브러리, 사용자 정의 타입을 지원하는 등 여러 특징이 있습니다.
물론 솔리디티 이외에도 이더리움 기반의 DApp을 만들 수 있는 언어들이 있습니다. 하지만 솔리디티가 가장 널리 쓰이고 있습니다. 가장 많이 쓰여지는 언어이다 보니 지원도 많이 되고, 문서화가 잘 되어 있습니다.
솔리디티를 사용하면, 투표를 위한 DApp부터, 크라우드 펀딩 서비스, 경매 시스템, 다중 지갑 등의 서비스들을 구현할 수 있습니다. 아직 솔리디티를 접하지 않은 분이시라면, CryptoZombies라는 게임을 추천합니다. 게임을 만들면서 스마트 컨트랙트에 대한 개념과 작성 방법을 쉽게 배울 수 있습니다.
C. 개발 환경 구성하기
DApp을 구현하기 위한 개발 환경은 크게 두 가지로 나눌 있습니다. 스마트 컨트랙트를 작성하고 배포하는 백엔드 사이드와, 사용자 인터페이스를 구현할 프론트엔트 사이드입니다. 아래 그림은 전체 개발 환경을 표현한 다이어그램입니다. 이 다이어그램에 대한 자세한 설명은 밑에서 이어가도록 하겠습니다.
Front-end:
HTML/CSS/Javascript
웹 프론트엔드를 작성에 사용하는 언어들. 블록체인 기반 서비스(DApp)의 클라이언트를 웹 브라우저 기반으로 만들 때 필요.
Web3.js
이더리움 자바스크립트 API.
Metamask
이더리움 풀노드를 운영하지 않고도 웹 브라우저에서 DApp을 사용할 수 있게 해주는 크롬 및 파이어폭스 확장 프로그램. 즉, 일부 필수적인 블록 헤더 데이터만 외부의 풀노드로부터 받아와 검증하는 라이트 클라이언트 중 하나.
메타마스크를 사용하면 여러 사이트의 계정을 관리하고, 블록체인 트랜잭션에 서명할 수 있음.
Back-end:
Solidity
이더리움의 스마트 컨트랙트를 작성할 수 있는 객체지향형 프로그래밍 언어
Remix IDE
솔리디티 코드를 작성하고 컴파일 및 배포까지 쉽게 자동으로 할 수 있도록 돕는 온라인 컴파일러 툴. 디버깅 툴로도 많이 쓰임.원래는 로컬 컴퓨터에 직접 솔리디티 컴파일러를 설치해야하는데, 리믹스 웹브라우저를 사용하면 그런 과정없이 쉽고 빠르게 컴파일 및 배포가 가능
TestRPC
개발 단계에서 실제 이더없이 시뮬레이션 테스트 환경을 구성할 수 있게 해주는 툴. 원래 이더리움 메인넷에서 테스트를 하려면 실제 이더가 필요하지만, TestRPC 를 사용하면 마이닝 없이 가상환경에서 리소스, 트랜잭션에 대한 제한 없이 이더리움을 만들어내서 테스트를 할 수 있음.
TestNet
이더리움의 퍼블릭 테스트 네트워크. 현재 아래와 같은 3개의 퍼블릭 테스트넷을 제공.
- Ropsten (Proof of Work): 프로덕션 환경이 실제 메인넷이랑 가장 비슷하여 (PoW 이기 때문에) 현재 가장 많이 쓰여지고 있는 테스트 네트워크. Geth 와 Parity 클라이언드 둘다 지원. 이전에 스팸 어택을 당한 이력이 있음… 이더 마이닝이 가능하며, 테스트 이더를 요청할 수 있다.
- Kovan (Proof of Authority): Parity 팀이 랍스텐의 문제를 해결하기 위해 개발한 테스트 네트워크. 스팸어택으로부터 안전하며, Parity 클라이언트만 지원. 이더 마이닝 불가능하며, 테스트 이더 요청 필요.
- Rinkeby (Proof of Authority): Rinkeby 역시 스팸 어택을 방지하고자 만들어졌으며, 이더리움 팀이 개발한 테스트넷. Geth 클라이언트만 지원. 이더 마이닝 불가능하며, 테스트 이더 요청 가능.
Mainnet
실제 거래가 이루어지는 이더리움의 메인 네트워크.