#1 ERC777 토큰 컨트랙트 테스트

in #erc4 years ago (edited)

이타인클럽 리부트 중입니다. 많은 관심과 응원, 참여 부탁드립니다.

  • 홈페이지 개편 (https://etain.club)
  • 스마트 컨트랙트 토큰 적용
  • 도움 요청 분야 세분화
  • 영상 통화를 이용한 도움 받기

image.png


이타인클럽 도움 주고 받기를 위한 ERC 토큰을 만들어 보려고 합니다.

ERC 토큰을 만든다는 것은 다른 말로 토큰을 관리할 스마트 컨트랙트를 만드는 것입니다.

이더리움 블록체인에서 사용되는 Ether(이더)와 달리 ERC 토큰은 스마트 컨트랙트가 관리합니다.

ERC20 vs ERC777

기존에 만들어진 토큰은 대부분 ERC-20입니다. 다시 말씀드리지만 여기서 토큰은 해당 토큰을 관리하기 위한 스마트 컨트랙트를 의미합니다.
ERC20을 개선에서 만든 토큰 규약이 ERC777인데도, ERC777은 잘 안쓰이고 있는 현실입니다.
이유는 ERC777이 ERC-20과 호환되려면, ERC-20쪽에서 입금을 수신하는지 체크하는 코드가 있어야 하는데, 기존 ERC-20 토큰 중에 이러한 기능을 추가한 것이 없기 때문입니다.
자세한 내용은 다음을 참고하세요.

https://dev.to/a_mature_dev/erc20-vs-erc777-quick-understanding-and-why-erc777-is-not-being-used-4lle

ERC, EIP

참고로 ERC20, ERC777의 ERC는 Ethereum Request for Comments의 약자로, 이더리움 개선을 위한 github issue 번호가 20인게 ERC20이고, 777번이 ERC777입니다. 나중에 Ethereum Improvement Proposal (EIP)란 용어를 제시했지만 ERC가 통용되고 있습니다. 정확하게는 ERC보다는 EIP가 맞습니다.

이타인클럽 ERC777 토큰 컨트랙트

도움 주고 받기 앱 이타인클럽에서는 ERC20대신에 ERC777을 사용하려고 합니다. 그 이유는 ERC777이 송금, 수신했을 때 이벤트 신호를 받을 수 있다고 해서입니다.

여기서 잠깐! 새롭게 토큰을 만들 때 주의할 것이 있습니다.

그것은 바로 토큰 컨트랙트의 보안입니다. 특히나 solidity로 토큰 컨트랙트를 구현할 때, 보안이 취약하기 매우 쉽습니다.
제가 예전에 마스터링 이더리움이란 책에서 보안 내용을 정리한 게 있으니 참고하세요.

https://steemit.com/kr/@etainclub/16-tx-origin
앞으로 쭈욱 따라가실 수 있습니다.

그래서 안전하게 기존에 검증된 라이브러리 형태의 컨트랙트를 상속해서 사용하는 것이 좋습니다.

여기서는 openzeppelin이라는 오픈 소스 컨트랙트를 상속해서 구현할 것입니다. 이미 기본 기능이 다 구현되어 있는 것을 상속하는 것이라서, 토큰 만들기가 매우 쉽습니다.

openzeppelin 패키지 설치

프로젝트 폴더를 만든 후에 다음과 같이 패키지를 설치합니다.

$ npm install @openzeppelin/contracts
or
$ yarn add @openzeppelin/contracts

아래 코드가 전부입니다. 아마 앞으로 내용이 추가될 수 있지만, 크게 추가할 일이 없이 바로 쓸 수 있습니다.

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

import "../node_modules/@openzeppelin/contracts/token/ERC777/ERC777.sol";

contract EtainClubToken is ERC777 {
  // constructor
  constructor(
    uint256 initialSupply,
    address[] memory defaultOperators
  )
    ERC777("EtainClub", "ECT", defaultOperators)
    public
  {
    _mint(msg.sender, initialSupply, "", "");
  }
}

참고. https://docs.openzeppelin.com/contracts/3.x/erc777

테스트용으로 만든 거지만, 정말 간단합니다. 참고로, 토큰 만들기와 토큰에 대한 설명이 마스터링 이더리움 책에 잘 설명되어 있습니다.
https://steemitimages.com/p/7ohP4GDMGPrUMp8dW6yuJTR9MKNu8P8DCXDU9qmmp8j55XfyF141rLWbX2DrW54BixKzJyu2vTVSZZm88FTvaf1MdNiV8KCxSskz?format=match&mode=fit&width=640

위에서 만든 토큰 컨트랙트를 테스트하기 위해서는 로컬 이더리움 네트워크가 필요합니다. 이를 위해서 truffle이라는 것이 사용되는데, 다음에 알아보겠습니다.

image.png

truffle 설치

truffle은 시스템 설치를 진행합니다.

$ npm install -g truffle
or
$ yarn global add truffle

참고로, yarn을 이용해서 설치했을 때, truffle 명령을 인식 못할 수 있습니다. 이때는 yarn의 실행파일들이 있는 곳을 시스템 path에 추가해야 합니다.
사용하는bash와 같은 쉘 프로그램 설정파일에 다음과 같이 추가합니다.

export PATH="$PATH:$(yarn global bin)"

truffle 사용

프로젝트 폴더로 이동하여 다음과 같이 명령하면 truffle 세팅이 됩니다.

$ cd erc-test
$ truffle init

truffle 참고. https://www.trufflesuite.com/docs/truffle/overview


굳이 블록체인 토큰을 써야 할까?

토큰 컨트랙트 만들기를 시작하면서, 굳이 이걸 블록체인 토큰으로 할 필요가 있을까라는 생각이 떠올랐습니다. 그냥 기존대로 Firebase와 같이 서버같은 곳에서 데이터베이스로 처리하면 훨씬 간단할 거 같은데 말이죠. 블록체인을 쓰면 사용자들이 좀 더 앱과 서비스를 신뢰하게 될까요?

아직 잘 모르겠습니다.


도움 주고 받기 앱 helpus