dukDukz

[블록체인] 오픈제펠린을 이용해서 토큰 생성, 테스트넷 배포 본문

웹 개발/블록체인

[블록체인] 오픈제펠린을 이용해서 토큰 생성, 테스트넷 배포

헤일리_HJ 2021. 10. 20. 12:50

# 기본 세팅

- ganache

- metamask

- $ truffle init

- truffle config 설정

 

# 작업 순서

1. 환경설정

2. 코드작성

3. 가나쉬 배포 (로컬 배포)

4. 테스트넷 배포 (테스트넷 이더리움)


1. 환경설정

# 오픈제펠린

- 오픈제펠린을 이용해서 토큰을 만든다. 안정성 굿

 

- 블록체인의 불변성

배포를 한 컨트랙트는 수정이 불가. 재배포를 해야만 하는데

컨트랙트를 수정할 수 있게 도와주는 라이브러리.

 

사용자가 트랜젝션을 발생시켜도 이더가 소비되지 않음 => 배포자가 낸다.

 

- 작성된 코드

ERC20, ERC721 인터페이스 구현 되어있음

 

interface {
    함수들이 구현되어 있음
}

 

토큰에 관련해서 자주쓰는 기능들

쉽게 구현할 수 있도록 라이브러리를 제공해준다.

 

(추가 기능)

우리가 사용할 라이브러리는 Pausable

배포한 사람만 실행할 수 있는 기능 Owner



# My Ether Wallet (MEW)

metamask 와 같은 지갑   (온라인 브라우저 사이트)

스마트 컨트랙트에 대한 매서드나 내용을 볼 수 있는 기능이 있다.

https://www.myetherwallet.com/

 

MyEtherWallet.com: Your Key to Ethereum

Free, open-source, client-side Ethereum wallet. Enabling you to interact with the blockchain easily & securely.

www.myetherwallet.com

홈페이지 접속 후

Access my Wallet 클릭 후

Browser Extension 클릭

메타 마스크 계정 연결

 

# 오픈제펠린 설정

PS D:\Blockchain_html\truffle\1020>

여기에서

$ npm init

$ npm install openzeppelin-solidity

 

node_modules > openzeppelin-solidity > contracts > token > ERC20 > .....

 

ERC20 > utils 안에 ERC20.sol 보면

어제 만들었던거랑 비슷한 코드가 있다.

 

 

# version 맞춰주기

 

솔리디티 언어는 0.8.0 ver

근데 우리가 설치한 ver 는 0.5.16 ($ truffle version)

 

환경을 바꿔줘야 한다.

 

truffle compile version 바꾸기

truffle-config.js 에서

84 번째 줄을 

version: "0.8.1",

이렇게 바꿔서 주석 풀어주고 다시 $ truffle version 보면 바뀐 것을 확인 할 수 있다.

 


 

환경설정 끝


2. 코드 작성

파일 만들기

$ truffle create contract IngToken

$ truffle create migration IngToken

 

[IngToken.sol]

pragma solidity >=0.4.22 <0.9.0;

contract IngToken {
  string public name = "INGOO TOKEN";
  string public symbol = "ING";
  uint256 public decimals = 18;
  uint256 public totalSupply = 10000 * (10**decimals);
  string text = "hello world";

  constructor() public {
  }
}

 

 

이렇게 작성하고

컴파일 배포 해보자



[숫자_ing_token.js]

 

const IngToken = artifacts.require("IngToken");

module.exports = function(deployer) {
  deployer.deploy(IngToken);
};

 

$ truffle compile

$ truffle migrate

 

이렇게 하고 나면 contract address 나온다.

# contract address :    

0x4e89722ac38A7E7D2d7A6d6B634385c98a905803

 

# ABI 

이렇게 접어서 저 배열 전체를 복사한다.

 

 

# EOA account:            

0xbbA4d184e891831443864776e85A39d33AC64647



MEW 다시 들어가서

 

Contract Address

migrate 하면 나오는 contract address를 쓰고

 

저 밑에는 배열을 넣어준다.

 

 

그러면 이런식으로 창이 뜨게 된다.

 

 

call 을 눌렀을 때 어떻게 저 값이 나오는가?

근데 수수료는 발생 안됨...

왜일까???

-> 공부 해보기

 


# 토큰 구현 해보자

 

IngToken.sol

 

node_modules 안에 ERC20 안에 있는 내용들을 가져오고 싶음

 

pragma solidity >=0.4.22 <0.9.0;

import '../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol';

contract IngToken is ERC20 {
  string public _name = "INGOO TOKEN";
  string public _symbol = "ING";
  uint256 public _totalSupply = 10000 * (10**uint256(decimals()));

}

 

 

상속도 받고

 

ERC20.sol 에 변수명과 같은 함수가 쓰이고 있어서 오류가 뜨니까

변수 앞에 언더바를 붙여준다.

 

그리고 _decimals 은 함수에서 바로 리턴해주고 있어서 그냥 함수를 갖다쓰자

앞에 혹시모르니까 uint256으로 감싸주고

 



ERC20.sol

 

function _mint 가 있는데 이걸 사용할거다

function _mint(address account, uint256 amount) internal virtual {
    require(account != address(0), "ERC20: mint to the zero address");

    _beforeTokenTransfer(address(0), account, amount);

    _totalSupply += amount;
    _balances[account] += amount;
    emit Transfer(address(0), account, amount);

    _afterTokenTransfer(address(0), account, amount);
}



IngToken.sol

pragma solidity >=0.4.22 <0.9.0;

import '../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol';

contract IngToken is ERC20 {
  string public _name = "INGOO TOKEN";
  string public _symbol = "ING";
  uint256 public _totalSupply = 10000 * (10**uint256(decimals()));

  constructor() ERC20(_name,_symbol) {
    _mint(msg.sender,_totalSupply);
    // 토큰 생성 끝
  }
}
  constructor() ERC20(_name,_symbol) {
    _mint(msg.sender,_totalSupply);
    // 토큰 생성 끝
  }

이 부분을 추가해주면 토큰 생성이 가능한 함수를 사용한 것이다.

 

contract 안에 json 파일 지우고

 

$ truffle compile

$ truffle migrate

 

다시 사이트 들어가서 레이어팝업 x로 닫고

 

contracts > IngToken.json

abi 부분 배열 복사해서 아까처럼 해준다.

 

contract address:    0x818C4877a0934CA7D849e62793f8c80F08328A2F

-> 이 주소 넣어서 메타마스크에서 Import Token 으로 ING 가져올 수 있다.

 

account:             0xbbA4d184e891831443864776e85A39d33AC64647

-> 이 주소 넣어서 BalanceOf 에 넣어서 보면 사진 5



Transfer

두번째 계정에도

 

contract address:    0x818C4877a0934CA7D849e62793f8c80F08328A2F

-> 이 주소 넣어서 메타마스크에서 Import Token 으로 ING 가져올 수 있다.

 

그런 다음에 ING 토큰 전송하는거 해봐도 잘 된다.



--------------------------------

 

코드 수정하기

 

- 배포자만 함수 호출 할 수 있게

- 토큰 보내는거 중지할 수 있게

 

오픈제플린에 있는거 갖다 쓰면 된다

 

[IngToken.sol]

 

# Ownable.sol

- 배포자만 실행할 수 있게 해주는 라이브러리

 

import '../node_modules/openzeppelin-solidity/contracts/access/Ownable.sol';

 

# Pausable.sol

- 매서드를 호출하면

pause()     // 컨트랙트 동작을 잠시 멈춤

unpause()   // 컨트랙트 동작을 다시 실행

 

import '../node_modules/openzeppelin-solidity/contracts/security/Pausable.sol';



contract IngToken is ERC20, Ownable, Pausable{

 

추가로 상속을 받는다.

 

1. Ownable

배포자만 실행할 수 있게 처리하는 건데

 

pausable

 

pause() 이것도 only owner 만 가능하게 할거임



[Pausable.sol]

    function _pause() internal virtual whenNotPaused {

        _paused = true;

        emit Paused(_msgSender());

    }

 

    event Paused(address account);

 

    이렇게 처리가 되어있기는하다.



    bool private _paused;

    이거를 바꿔줄거임 이 상태값을



[IngToken.sol]

  function pause() public onlyOwner{

    _pause();

  }

 

  function unpause() public onlyOwner{

    _unpause();

  }

이렇게 수정해주면 된다.



json 파일 다시 지우고

 

truffle compile

truffle migrate

 

홈페이지 다시 들어가서 x로 나가고



contract address:    0x651B603ce1Ce2de05d868d659f7AA69e18EC7C65

-> 이걸로 두 계정 Import Token 해서 ING 새롭게 가져오고

-> 한쪽에 500ING 을 보내준다.

 

abi 도 넣어주면



---------------------

 

# testnet 배포하기

 

테스트넷의 주소를 알아야 한다...!

 

https://infura.io

-> 가입하고

 

hjlee9725@gamil.com

hl4!

 

1. 사이드 메뉴에서 다이아모양(이더리움) 클릭

2. create new project 클릭

3. settings 에 들어가서

4. ENDPOINTS 값울 메인넷 -> 테스트넷(Ropsten) 으로 변경

https://ropsten.infura.io/v3/7e4aa9c368d64942b8bb404518551a75



테스트넷에 배포해야함

 

[truffle-config.js]

총 2가지 영역 수정할거임

 

21~24번째 줄 주석 풀기

-> npm install @truffle/hdwallet-provider 을 해야겠군

-> .secret 파일을 생성해야 하는구나 (위치는 truffle-config.js 와 같은 경로로!!)

 

60~67 번째 줄 주석 풀기

61 번째에는 나의 url 을 넣어주면 된다.



메타마스크 시드문구

.secret <- 시드문구를 넣을것이다.

 

메타마스크 시드 문구 찾는법

 

계정 동그라미 클릭 - 설정 - 보안 및 개인정보 보호 - 비밀 복구 구문 공개 - 계정시드 구문 복사

 

복사한 내용을 .secret 파일을 생성해서 거기안에다 복붙하기



배포를 테스트넷에 하는것!

 

json 파일 다 지우고

 

$ truffle compile --all

$ truffle migrate --network ropsten



transaction hash:    0xda04e9ebdb077ab257e1be7c751ee8c248df1624d7ffe89347baab2c0d27886d

 

-> 이거 검색하면 내 토큰 나온다.

사진 8, 9

 

이것도 하나의 포폴이 될 수 있음