스마트 컨트랙트 자동생성 dApp의 구현

cg.bahk
Presto
Published in
6 min readOct 31, 2018

--

dApp이란?

dApp이란 decentralized app를 의미하며, 기존의 DB서버상에 존재하는 웹 어플리케이션과는 달리 이더리움 메인넷과 같이 탈중앙화된 네트워크상에 작동하는 어플리케이션을 말한다. 여기서는 dApp의 가장 간단한 예제로서, 클릭만으로 쉽게 스마트 컨트랙트를 만들어낼 수 있는 어플리케이션을 소개하고 어떻게 동작하는지 코드분석을 통해 알아본다.

스마트 컨트랙트를 설계하는 것은 전문지식을 필요로하며, 오랜 시간을 투자해야하는 힘든 일이다. 또한 제작한 스마트 컨트랙트를 발효하기 위해 직접 트랜잭션을 보내는 것도 네트워크 노드 구성 등을 필요로 하기 때문에 진입장벽이 존재하거나 귀찮을 수 있는 작업이다.

그러나 이미 정형화된 스마트 컨트랙트의 구조가 정해졌을 때, 스마트 컨트랙트를 정의하는 요소는 몇가지 커스터마이징 변수들 뿐이다. 따라서 귀찮은 스마트 컨트랙트 설계 및 트랜잭션 전송의 부분을 자동화 한다면, 커스터마이징 변수를 입력받아 스마트 컨트랙트를 만들어내는 dApp을 만들 수 있다.

스마트 컨트랙트 자동생성 dApp

다음 링크를 확인하자: A simple smart contract generator

이 간단한 dApp에서는 토큰 이름, 발행량 등을 커스터마이징 변수로 입력받아 버튼 클릭 한번으로 스마트 컨트랙트를 생성해낸다. 다음 순서를 따라 dApp을 이용해보자.

Ropsten Network에 MetaMask 계정을 이미 가지고 있다면, 5번으로 넘어가도 좋다.

  1. 이 dApp은 메타마스크를 기반으로 작동한다. 크롬 브라우저메타마스크를 설치한다.
  2. 메타마스크 최신버전으로 업데이트한다.
  3. 비밀번호를 설정하고 메타마스크 계정을 만든다.
  4. 테스트용으로 사용하기 위해 실제 이더리움 메인넷이 아닌 Ropsten 테스트넷으로 전환한다. 이더리움 메인넷에서도 작동하지만 컨트랙트 생성 과정에서 소량의 이더를 소비할 수 있다. 이 dApp을 사용함에 있어 Ropsten 테스트넷 사용을 권장하며, 이를 따르지 않았을 경우 발생하는 금전적 피해는 책임지지 않음을 밝히는 바이다.

5. 메타마스크에 로그인 & Ropsten 테스트넷으로 전환한 후, 링크의 웹페이지에 접속하거나 새로고침한다. 계정과 잔액을 보여주는 메세지가 보인다면 정상 작동중인 것이다.

6. 이더가 없거나, 이더가 부족하면 스마트 컨트랙트를 생성할 수 없다. faucet을 이용하여 이더를 받자. 1이더면 충분하다. faucet에서 공급받은 이더는 트랜잭션이 승인되기까지 1분정도 후에 메타마스크 상에 나타난다.

7. 토큰을 만들 커스터마이징 변수를 입력한다. 의미를 모른다면 기본값을 유지해도 좋다.

8. ‘Deploy!’ 버튼을 누르면, 메타마스크에서 트랜잭션을 보낼 것에 대한 확인을 요청한다. gas와 내용을 보고 확정하면 트랜잭션이 전송된다.

9. 트랜잭션이 전송되면, status에서 트랜잭션의 주소를 확인할 수 있다. 전송 후 인증되고 스마트 컨트랙트 주소가 확정나기까지는 1분정도 걸린다.

10. 1분 후 스마트 컨트랙트 정보를 가진 메세지를 확인한다.

내가 만든 토큰을 확인하고 싶다면 생성된 컨트랙트 주소를 복사하여 etherscan에 검색하여 확인해볼 수 있다.

토큰을 발행한 직후, 생성한 주소가 토큰의 총 발행량을 모두 가지고 있는데 이것을 메타마스크를 통해 확인해보자.

  1. 메타마스크에서 토큰을 발행한 계정의 메뉴버튼을 클릭하여 토큰 추가(ADD TOKEN) 버튼을 클릭한다.

2. Custom token 탭에서 주소에 발행된 토큰 컨트랙트의 주소를 복사해 붙여넣는다. 심볼과 소수점 자리수가 자동완성되어 표시된다.

3. 이제 이더와 함께 발행한 토큰을 가지고있는 것을 확인할 수 있다.

코드분석

위 예제는 index.html / index.js 두개로 구성된다. 하나씩 살펴보며 어떤식으로 작동하는지 알아보자. Mahesh Murthy의 코드를 참고하여 만들었다. Link

먼저 index.html 을 보자

  • 21~42번줄에서 표를 통해 사용자 입력을 받고있고, 현재 상태 및 로그를 Status에 표시하도록 한다.
  • 45번줄에서는 버튼을 누르면 index.js의 deploySC()함수가 작동됨을 볼 수 있다.
  • 47번줄은 웹에서 web3.js를 사용하기 위한 스크립트 코드이다.
  • 49번줄에서 index.js를 사용함을 확인할 수 있다.

다음으로 index.js를 보자

  • 3~ 8번 줄에서 클라이언트가 MetaMask를 사용하는지 확인하고, web3.js를 통해 연결한다.
  • 정상적으로 작동했다면 16~21번줄에서 MetaMask에서 사용되는 wallet주소와 이더리움 잔고를 알려준다.
  • 이 dApp의 핵심은 36번줄에서 정의되는 deploySC()함수로, index.html의 deploy 버튼을 누르면 작동한다. deploySC()가 호출되면 사용자가 입력한 커스터마이징 정보를 읽어들이고, 미리 컴파일된 abi와 bytecode를 이용해 ERC20 토큰생성 스마트 컨트랙트를 48번줄에서 만들게된다. 이 함수가 호출되면 먼저 컨트랙트를 만들기위한 트랜잭션이 전송되며 그 정보가 돌아오고, 이후에 트랜잭션을 포함한 블록이 네트워크 망에서 인증받게되면 최종적으로 컨트랙트가 만들어지고 그 정보가 돌아온다.

이번에 살펴본 dApp은 정말 간단하고 학습적인 의미만을 가진 예제일 수 있다. 그러나 Presto가 가진 DAICO 플랫폼 모델도, 이와 개념적으로 크게 다르지 않다. Presto 플랫폼은 공정하게 설계된 DAICO 스마트 컨트랙트를 제공하며, 사업자는 Presto 플랫폼 상에서 몇 가지 커스터마이징을 통해 쉽고 빠르게 공평한 DAICO를 진행할 수 있게 된다.

Presto 플랫폼으로 더 안전하고 공평한 블록체인 이코노미가 활성화 되길 기대해본다.

--

--