본문 바로가기
블록체인 및 경제/솔리디티

4. openzeppelin 사용하여 ERC20 토큰 만들기

by kimsfamily 2020. 11. 5.

1. 스마트 계약의 시작, 리믹스 도구 사용해보기

2. 솔리디티 개발환경 구성

3. 스마트컨트랙트 작성 후 배포하기

4. openzeppelin 사용하여 ERC20 토큰 만들기

5. Ropsten 테스트넷에 ERC20토큰 배포하기

6. web3.js 와 자바스크립트를 활용한 간단한 예제

7. 솔리디티 기초, 리믹스로 컨트랙트 작성하기

8. 솔리디티 기본문법 (변수, 데이터타입, 구조체)

9. 솔리디티 배열, 맵핑

10. 솔리디티 조건문, 반복문(if, else, for)

11. 솔리디티 암호화폐 지불(호텔룸 예약하기 프로그램)

12. 솔리디티 상속

13. 리믹스 솔리디티 6.0 버전 ERC20토큰 만들기

14. web3.js 와 자바스크립트를 활용하여 (이더잔액조회) 지갑 만들기

15. 솔리디티 컨트랙트 Web.js 활용하여 웹으로 보여주기


지난시간에 openzeppelin을 설치했고 이를 활용해서 기본적인 스마트컨트랙트 작성 후 배포까지 하였습니다. 이번시간에는 실제로 사용 가능한 ERC20 토큰을 만들어보겠습니다. 

 

1. MyToken.sol 파일을 새롭게 작성합니다.

 

소스는 아래와 같습니다.

pragma solidity ^0.6.0;

import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

contract MyToken is ERC20{
  uint public INITIAL_SUPPLY = 120000;

  constructor() public ERC20("My token","MT"){
    _mint(msg.sender, INITIAL_SUPPLY);
  }
}

 

migrations 폴더안에 2_deploy_Mytoken.js 을 아래와 같이 작성합니다.

 

추가로 truffle-config.js 컴파일 버전도 아래와 같은지 확인해줍니다. 모두  솔리디티 0.6.*버전입니다.

 

간단히 설명하면,

import '@openzeppelin/contracts/token/ERC20/ERC20.sol';

node_modules 폴더에 있는 위 경로의 ERC20.sol 파일을 불러오겠다.

contract MyToken is ERC20

불러온 ERC20.sol 파일에 현재의 TEST 코드를 덮어쓰겠다.

  constructor() public ERC20("My token","MT"){
    _mint(msg.sender, INITIAL_SUPPLY);
  }

consturctor는 스마트컨트랙트가 생성될때 1번만 호출이 됩니다.

그리고 위 코드에서는 ERC20 컨트랙트에 정의된 _mint() 함수를 사용했습니다.

_mint() 함수에 대한 사용법은 아래와 같습니다.

 

기타 openzeppelin에서 제공하는 ERC20 함수에 대한 사용법은 아래 사이트에서 참고하시면 됩니다.

 

docs.openzeppelin.com/contracts/2.x/api/token/erc20#ERC20

 

 

객체지향언어(C++,JAVA) 등에 대한 배경지식이 있는 분이라면 생성자에 대한 이해가 있을텐데요..(향후에 설명이 가능하면 이부분을 설명하겠습니다.)

아무튼, 겍체지향언어에는 생성자라는 개념이 있는데, 그 생성자의 개념이 솔리디티에도 동일하게 있습니다.(솔리디티도 객체지향언어와 유사하므로..) 그런데 차이가 있습니다. 그 차이를 간략하게 설명합니다. 일단 이런 개념이 있다정도로 알고 넘어가시면 될것 같네요.

 1) 솔리디티에서 생성자는 선택사항이며, 명시적으로 선언하지 않는 경우 컴파일러가 기본 생성자를 넣어줌.

 2) 생성자는 계약이 배포될 때만 한 번 실행됨. (이 부분이 일반적인 객체지향프로그래밍 언어랑 차이점)

  - 일반적으로 새로운 객체 인스턴스가 생성될때마다 생성자가 실행됨.

  - 솔리디티에서는 EVM에 배포되는 시점에만 실행됨.

  - 즉, 다른 프로그래밍 언어에서는 여러개의 생성자를 둘 수있지만, 솔리디티에서는 한 계약에 하나의 생성자만 있어야 함.

 3) 생성자는 파라미터를 취할 수 있으며, 계약을 배포할때 인자를 넣어야 함.

 4) 생성자는 계약과 같은 이름을 가짐.

 5) 생성자의 가시성은 Public 또는 Internal이 될 수 있음.

 6) 생성자는 external 이나 Private는 될 수 없음.

 7) 생성자는 데이터를 명시적으로 반환하지 않음.

 

일단 솔리디티에서의 생성자의 특징은 위와 같습니다. 중요한건 2번사항입니다. 나머지는 알면 좋지만 잘 이해가 안되더라도 이런것이 있다정도로 알고 넘어가시면 될것 같습니다. 일단 지금은요..

 

2. 배포하기

이제 한번 배포해봅시다!!

 

먼저 gansche-cli를 실행해줍니다.

그리고, truffle migrate --reset 해줍니다.

MyToken 정보가 아래와 같이 생성된걸 확인 할 수 있습니다.

contract address:    0x37FE0A4614D254E3Ae271790df2091ae2D825EED

 

3. Contract 다루기

이전 시간에 했던 방식으로 contract address와 ABI를 활용해서 myehterwallet에 연결해봅시다.

 

 

Contract address와 ABI를 복사하여 아래 myetherwallet에 붙여넣기합니다.

 

이전과는 다르게 오른쪽 메뉴에 상당히 많은 기능들이 생긴걸 확인할 수 있습니다.

 

 

 

이름, 총 공급량 등도 쉽게 확인할 수 있네요!!

 

 

메타마스크에서 사용자정의 토큰추가를 하면(토큰컨트랙트 주소를 입력합니다.) 아래와 같이 토큰이 추가되는걸 확인할 수 있습니다.

아래와 같이 토큰 전송도 가능하군요!!!

 

이렇게 ERC20 토큰을 만들고 보내는것까지 성공했습니다.

어렵지 않게 할 수 있는 이유는, ERC20.sol 파일을 활용했기 때문인데요.

간략하게 ERC20.sol 파일의 소스를 한번 살펴볼까요?

 

대략 위와 같지만, 최신 버전과 상세한 사용법은 아래 메뉴얼을 참고하는게 가장 좋습니다.

docs.openzeppelin.com/contracts/3.x/erc20

반응형

댓글2