유용한 정보

Ethereum_dApp_2_스마트 컨트랙트와 dApp, 개발환경 구축하기

CyberI 2018. 6. 1. 10:33

이전 내용에서 블록체인과 이더리움에 대한 개념을 알아보았다면, 이번에는 스마트 컨트랙트와 dApp, 개발환경 구축에 대해 살펴보겠습니다. 

Ethereum_dApp_1_블록체인과 이더리움에 대한 1편 내용을 다시 보고 싶다면, '다시보기'를 클릭해주세요.


3. 스마트 컨트랙트(Smart Contract)

 

이더리움을 보다 보면 빠질 수 없는 것이 이 스마트 컨트랙트입니다. 스마트 컨트랙트는 미국의 컴퓨터 과학자인 Nick Szabo 1994년 최초 제안한 개념입니다. 기존 계약(Contract)은 서면으로 되어 있어 계약 조건을 이행하려면 실제 사람이  계약서대로 수행을 해야 하지만 디지털로 계약을 작성하게 되면 조건에 따라 계약 내용을 자동으로 실행할 수 있다고 주장한 것입니다.

 

디지털로 된 계약서는 조건에 따른 계약 결과가 명확하고 계약 내용을 즉각 이행할 수 있다는 것이 큰 장점이었지만 이 당시 디지털로 된 자료들은 쉽게 복사되고 조작이 쉬워 개념으로만 존재하고 구체적인 서비스에 이용될 수 없었습니다.

 

20여년이 지나 디지털 데이터를 신뢰할 수 있게 만들어 주는 블록체인 기술이 급부상함에 따라 스마트 컨트랙트는 함께 급부상하게 되었습니다. 스마트 컨트랙트를 만들 수 있는 환경이 구체화된 것입니다. 비트코인 스크립트는 반복문을 사용할 수 없고 잔고 외에는 다른 정보를 관리 할 수 없는 한계가 있습니다. 또한 반복문을 허용하게 될 경우 스크립트 조건 때문에 무한 루프가 발생한 경우 네트워크 전체가 마비가 될 수도 있습니다. 이더리움은 이러한 비트코인 스크립팅 시스템의 한계를 극복하고자 나온 스마트 컨트랙트 특화 블록체인 플랫폼이라고도 볼 수 있습니다. 본격적으로 스마트 컨트랙트란 용어가 사용되기 시작한 것은 이더리움이 나온 이후라고 해도 무방합니다. 이더리움에서는 각 라인을 실행할 때마다 수수료(Gas)를 발생시키고 네트워크 상에 수수료의 한계를 둠으로써 무한루프가 발생되는 것을 사전에 차단하였습니다.


4. dAPP (Decentralized Application)

 

위에서 잠깐 말씀드렸던 대로 dApp 이란 탈중앙화된 어플리케이션을 뜻합니다.

탈중앙화란 블록체인의 가장 큰 특징으로 현재까지의 통화시스템은 중앙화된 장부 기입 방식으로 구축이 되어 있어 거래에 대한 내용을 신뢰할 수 있는 기관에 맡겨야 했지만 이런 시스템은 항상 과도한 권력의 집중과 과도한 초과 이익을 부여해야 하는 문제를 갖고 있습니다. 하지만 블록체인이 생겨남으로써 탈중앙화가 이뤄지고 공공에게 완전히 장부를 개방해주어 중앙기관이 필요가 없게 된 것이 탈중앙화 입니다. 기존의 중앙화된 어플리케이션은 중개인이 서버를 보관하고 그 곳에 보관된 정보들을 불러와서 사용자들에게 제공되는 형태이기 때문에 개인정보 보안에 취약한 상태입니다. 하지만 dApp  블록체인을 활용한 어플리케이션이라 정보의 분산으로 이러한 위험에 노출될 확률이 매우 적어집니다.


그림을 통해 다시 설명 드리면,

현재 대부분의 웹 어플리케이션의 경우 위 그림과 같은 아키텍쳐로 구성되어 있습니다. 중앙화된 시스템에 많은 장점들이 있지만 중앙 서버로 모든 데이터들이 모아져 있다 보니 항상 외부, 내부에 의한 해킹과 데이터 유출에 대한 위험성이 지적되고 있습니다.


탈중앙화된 어플리케이션은 중앙화된 모델에서 파생되는 여러가지 문제들에 대한 대안으로서 부각되기 시작하고 있습니다. 위와 같은 아키텍처로 구성되어 있으며 가장 큰 차이점은 중앙 서버가 없다는 점입니다. 각각의 사용자가 모두 독립노드가 되어 똑같은 역할을 수행하게 되는 구조입니다. 이러한 노드들이 무수하게 서로 연결되어 이더리움 네트워크를 이루게 됩니다.

 

다시 dApp 을 설명하면 이더리움은 OS, dApp 은 어플이라는 개념으로 생각하시면 쉬울 것 같습니다. 이더리움은 dApp 을 만들기 위한 플랫폼입니다. 현재 이더리움 플랫폼을 기반으로 만들어진 많은 dApp 들이 있고 아직도 수 많은 dApp 들이 개발되고 있습니다.

DAPP에 대한 정보를 찾을 때 이더리움 토큰 이라는 말이 많이 등장 합니다. 이더리움 토큰이란 이더리움 플랫폼에 기반하며 dApp 서비스를 사용하는데 필요합니다. 이때 토큰 간의 트랜잭션에 대한 수수료는 이더리움으로 지불합니다. dApp 개발사들은 새로운 dApp 개발을 선언하고 투자금을 받는 대신에 투자자들에게 토큰을 나눠주기도 하고 거래소에서 토큰이 거래되도록 하기도 합니다. 나중에 자신들의 서비스가 많이 커진다면 토큰을 가지고 있는 사람들한테 보상을 해줄 수도 있고, 토큰 수에 따라서 이더리움을 나눠줄 수도 있습니다. , dApp 이든 이더리움 토큰이든 모두 이더리움을 기반으로 두고 있습니다. 더 많은 dApp  성공할 수록 dApp   dApp 의 토큰에 대한 수요가 늘어나고 최종적으로 dApp 을사용하는데 필요한 이더리움의 가치는 증가합니다.



5. 개발환경 구축하기

 

우선 dAPP을 개발해보고 테스트 하기 위해서는 설치할 것이 여러가지가 있습니다.

 

첫번 째로 Geth 입니다.

Geth Go언어로 된 이더리움 노드 소프트웨어 코드 (Go-Ethereum Node Software Code) 입니다. Solidity, HTTP JSON RPC, web3.js 를 통한 JavaScript 언어로 다양한 Ethereum Client 을 개발할 수 있습니다

(참조 : https://ethereum-homestead.readthedocs.io/en/latest/ethereum-clients/go-ethereum/index.html)


명령창에서 git 을 통해서 설치할 수도 있고, 해당 홈페이지에서 설치할 수도 있습니다.

(1) git clone https://github.com/ethereum/go-ethereum.git

(2) https://geth.ethereum.org/downloads/


저는 (1) 의 방식으로 설치를 해보았습니다.


설치가 완료된 경우 > geth version 명령을 통해 설치 및 버전 등을 확인해 볼 수 있습니다.


(JSON RPC API 를 사용하는 경우 Geth 를 사용하게 됩니다.)


두 번째로 TestRPC 를 설치합니다.

이더리움은 Main Network 뿐만 아니라 Ropsten, Kovan, Rinkeby 등의 Test Net 을 제공합니다.

Main ( https://etherscan.io/ )

Ropsten ( https://ropsten.etherscan.io/ )

Kovan( https://kovan.etherscan.io/ )

Rinkeby ( https://rinkeby .etherscan.io/ )


개발 시 편리함을 제공하지만 사용자가 많아 블록이 매우 많습니다. 글 작성시간 기준으로 각각 323만개, 727만개, 228만개의 블록이 존재합니다. 따라서 개발 시 블록에 쓰고 읽는 속도가 느려져 개발 자체가 느려지는 단점이 존재합니다. 그로 인해 로컬에서도 바로 테스트할 수 있도록 나온 것이 있는 데 그 중 하나인 TestRPC 가 있습니다. Node.js npm 모듈을 사용하여 설치할 수 있습니다

설치되어 있지 않는 경우 https://nodejs.org/ko/download/ 에서 받을 수 있습니다. 해당 node -v npm -v 명령을 통해 설치된 것을 확인할 수 있으며 npm install –g ethereumjs-testrpc 으로 TestRPC를 설치할 수 있습니다.



명령창에서 testrpc로 실행합니다.


실행하면 위와 같이 실행이 됩니다. TestRPC 의 버전과 해당 실행 시 10개의 계좌 주소와 그에 해당하는 private key 를 제공받습니다. 아래의 Mnemonic (니모닉)의 경우 저 계좌를 기억하는 일종의 코드 입니다. 최대 12개까지의 10자이내의 단어를 입력 받을 수 있습니다. TestRPC 는 재실행시 마다 제공되는 계좌가 변경이 되는데 니모닉 코드를 사용하여 해당 계좌를 동일하게 제공받을 수 있습니다

위의 사진의 니모닉으로 옵션을 지정하여 다시 실행을 다시 해보면 

testrpc -m "meat cover cheap friend index electric music arch speed cactus sail legal"



동일한 계좌를 받는 것을 확인해볼 수 있습니다. 또한 기본적으로 8545 포트로 실행됩니다. 다른 옵션들이 궁금한 경우 https://www.npmjs.com/package/ethereumjs-testrpc 을 참조하시면 되겠습니다.


세 번째로 메타마스크(Metamask) 입니다.

메타마스크는 브라우저의 확장 프로그램 형식으로 사용자가 이더리움 네트워크와 통신을 보다 편하게 하게끔 하기 위하여 특수하게 제작된 dApp 지갑입니다. 기반 기술은 ethereumjs-wallet 을 모토로 하여 사용자에게 비밀번호를 입력받아 해당 정보로 하여금 private key 를 안전하게 저장하고 보관하며, 각 계좌들의 사용을 용이하게끔 해주는 기능을 가지고 있습니다. 추후에 사용될 온라인 Solidity 컴파일러 사이트인 Remix 와의 연동이 매우 용이하므로 다른 지갑들 대신 메타마스크를 사용하였습니다. 설치는 https://metamask.io 에서 할 수 있습니다.



GET CHROME EXTENSION 을 누르면 크롬 확장프로그램으로 설치하는 곳으로 이동되며 익스플로러는 지원하지 않습니다.


설치를 끝내고 메타마스크 버튼을 클릭하고 가입과 로그인 과정을 거치면 위의 좌측 화면처럼 나오게 됩니다. 만약 이더리움 메인넷에 존재하는 실제 이더 (ETH) 화폐가 있는 경우 연동되어 표시될 것이고 없는 경우 저처럼 0 ETH 가 표시되게 됩니다.

 

개발은 아까 구성한 TestRPC 에서 할 것이므로 네트워크는 로컬호스트 8545 로 변경해줍니다. 만약 TestRPC 옵션을 통해 포트번호가 8545 가 아닌 경우 커스텀 RPC 를 통해 설정을 해주면 되겠습니다. (두번째 그림)

변경한 경우 상단에 프라이빗 네트워크라고 표시됩니다. (세번째 그림)




우측 상단의 둥근 그림을 클릭하면 현재 계좌, 계좌 생성 등 다양한 메뉴를 확인할 수 있습니다.

여기서 계좌 가져오기를 통해 아까 TestRPC 에서 제공된 계좌 하나의 private key 를 가져와서 위에 화면에 비밀키 입력칸에 입력 후 파일에서 가져오기 버튼을 클릭하면100 ETH 를 가진 계좌가 생기게 됩니다

이 이더는 컨트랙트에 트랜잭션이 발생할 경우 요금을 지불할 때 사용되게 됩니다. 이 계좌를 계속 사용하기 위해 TestRPC 실행시 니모닉 옵션을 사용하는 것이 유용합니다. 또한 여러 개의 계좌를 저장할 수 있어서 여러 계정을 테스트하는 데에도 유용하게 쓰입니다. 만약에 TestRPC 를 사용하지 않고 이더리움에서 제공하는 테스트넷 중 하나를 사용하고 싶은 경우 계좌를 개설하여 https://faucet.metamask.io 에서 해당 계좌에 지급 받을 수 있습니다.



이상 스마트 컨트랙트, dApp, 개발 환경 구축까지 설명을 마치겠습니다. 다음에는 실제로 dApp을 개발하는 과정을 설명하도록 하겠습니다.