본문 바로가기

이더리움

이더리움 simple wallet 만들기(5) (토큰발행)

 

안녕하세요. 

 

이더리움을 조금이라도 다뤄보신분이라면 토큰 이라는 말을 들어보셨을거예요.

 

그중 아직까지도 가장 대표적인 토큰이 ERC20인데 오늘은 truffle.js를 사용해  ERC20토큰을 발행해보도록 하겠습니다.

 

토큰을 발행하는 방법은 truffle.js를 사용하는 방법과 remix와 메타마스크를 사용해 발행하는 방법이 있는데 오늘 저희는 keystore파일과 truffle.js를 사용해서 발행해보려고 합니다.

 

사실 erc20토큰에는 완벽하지않고 매우 치명적인 결함이 존재하는데,아직까지 저는 한번도 경험해보지 못했지만 스마트 컨트랙트를 사용해 토큰을 보냈을때 토큰이 사라지는 현상이 가끔 나타난다고합니다. 

 

그래서 이 버그의 대안으로 여러 토큰들이 나왔는데도 불구하고 아직까지도 가장 많이 사용되는 토큰이 ERC20토큰입니다.

 


 

가장먼저 truffle.js를 글로벌로 설치해 주겠습니다

npm install -g truffle

 

다음 npm install --save @openzeppelin/contracts 을 설치해주세요 . openzeppelin은 코인을 보다 쉽게 발행하도록 제공해주는 모듈입니다.

 

https://github.com/OpenZeppelin/openzeppelin-contracts

 

들어가서 살펴보시면 코인발행외에 코인과련 많은 기능이 있는걸 확인 하실수 있을거예요. 오늘 저희는 다른 기능들은 다 접어두고 순수하게 발행만을 위해 진행하겠습니다.

 

 

두가지 라이브러리를 설치해주셨으면 콘솔창에 truffle init를 입력해주세요 입력하시면 contracts , migrations, test 세가지 폴더와 truffle-config.js 파일이 생성되셨을거예요.

 

일단 저희는 token발행에 관련된 코드를 먼저 작성해보도록 하겠습니다. 이더리움 스마트컨트랙트를 작성하기위해서 solidity언어를 사용하는건 다들 아실테니 vscode에서 solidity extention을 설치해주세요!

 

다음으로 contracts폴더 안에 BasicToken.sol이라는 파일을 생성해주세요.

 

BasicToken.sol 파일을 아래와 같이 코드를 입력해주세요.

 

pragma solidity ^0.5.0;

 

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

import "../node_modules/@openzeppelin/contracts/token/ERC20/ERC20Detailed.sol";

import "../node_modules/@openzeppelin/contracts/ownership/Ownable.sol";

 

contract BasicToken is ERC20,ERC20Detailed,Ownable{

 

  constructor(string memory name,string memory symbol,uint8 decimals,uint256 initialSupply) 

    public ERC20Detailed(name,symbol,decimals){

    _mint(owner(), initialSupply*(10**uint256(decimals)));

  }

}



ERC20Detailed와 Ownable 두가지를 상속받아서 정말 기본적인 토큰 기능을 갖고있는 BasicToken 컨트랙트를 생성하겠습니다.

 

콘솔창에 truffle compile 명령어를 입력해주세요. 그럼 contracts 폴더안에있는 Migrations.sol과 BasicToken.sol파일이 빌드되어 build폴더안에 생성되는데, 이 폴더에서 저희는 BasicToken.sol의 abi를 추출해 사용할겁니다.

 

다음 truffle-config.js파일을 수정할거고 앞선 포스팅에서 저희는 ropsten네트워크를 사용했으니 여기서도 똑같이 ropsten네트워크에 토큰을 배포해 사용하겠습니다.

 

아래 코드를 입력하기전에 truffle-privatekey-provider 모듈도 설치해주세요!

 

 

require('dotenv').config();

//환경변수에 private key등록해서 사용하실분은 dotenv 라이브러리를 설치해 사용해주세요. 이번글에서는 사용안하겠습니다

 

const PrivateKeyProvider = require('truffle-privatekey-provider')

 

const privatekey = "자신의 private key"

 

module.exports = {

  networks: {

    ropsten: {

      from: "자신의 wallet 주소 ",

      provider: () =>

        new PrivateKeyProvider(

          privatekey.toString(),

          "https://ropsten.infura.io/v3/자신의 infura 프로젝트 키 "),

      network_id: 3,

      gas: 5000000 //가스리밋은 넉넉하게 주겠습니다.

    }

  }

};

 

다음으로 migration폴더안에 2_contract_migration.js 파일을 만들어주세요. 이 파일안에서 저희는 토큰이름,심볼,소숫점자리,총공급량을 정해서 배포하도록 만들거예요.

 

const BasicToken = artifacts.require("./BasicToken.sol");

 

const _name = "minojsToken"; 

const _symbol = "mino";

const _decimals = 6;

const initialSupply = 10000;

 

module.exports = function (deployer) {

  deployer.deploy(BasicToken, _name, _symbol, _decimals, initialSupply);

};

 

 

여기까지 진행하셨으면 이제 ropsten 네트워크에 토큰 발행하는 스마트컨트랙트를 배포하도록 하겠습니다.

명령어도 간단해요 truffle migrate --reset --network ropsten 

truffle 사용해서 컨트랙트 배포는 remix에 비해서 생각보다 시간이 오래걸리더라구요.

 

콘솔창에 이런식으로 나온다면 토큰만드는 스마트컨트랙트 배포가 성공한겁니다. 이제 transaction hash를 복사해서 이더스캔에서 확인해 보겠습니다.

https://etherscan.io/

이더스캔은 메인넷뿐아니라 몇몇테스트멧의 모든 블록과 트랜잭션을 볼수도 있고 api도 제공해주는 사이트입니다.

 

 

저부분을 ropsten 네트워크로 바꾸고 transaction hash를 검색해보겠습니다.

 

minojs라는 이름의 토큰이 10000개 정상적으로 발행되었고, 세부정보는 저 빨간색안에 있는 링크를 클릭하시면 확인하실수 있습니다.

 

오늘은 간단하게 토큰발행을 하였고 다음포스팅에서는 발행한 토큰 조회, 전송하는 부분에 대해 코드를 직접 작성해 보도록 하겠습니다.

물론 메타마스크에 연동시켜서 사용할수도 있습니다.

 

 

이더리움 simple wallet 만들기 (6) 보러가기

 

https://github.com/MinhoKim1018/eth-wallet/tree/ch05