본문 바로가기
BlockChain

ERC20 스마트 컨트랙트 (SmartContract) 개발 및 배포해보자 [2]

by parkjp 2023. 8. 25.

 

 

시작하기 앞서

앞선 편에서 프로젝트 설정을 진행해 보았다.

이번 편에서는 ERC-20 스마트컨트랙트를 solidity라는 언어로 개발해보고 로컬에 배포해보겠다.

물론 solidity에 대해 모르시는 분들은 어느 정도 공부가 필요하다.

ERC-20은 이미 기본적인 기능이 구현되어있어서 간단하게 진행할 수 있다.

 

 

ERC-20 만들기

지난 편에 만들었던 프로젝트 폴더에서 contracts폴더 내에 solidity 파일을 만들어보자.

확장자는 .sol이다. 나는 TestERC20.sol로 만들었다.

 

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

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

contract TestERC20 is ERC20 {
  constructor(uint256 initialSupply) ERC20("Test", "TET") {
    _mint(msg.sender, initialSupply);
  }
}

 

openzepplin의 ERC20을 import하고 있는데 npm에서 install을 진행하자.

npm install @openzeppelin/contracts

 

ERC20은 name과 symbol을 받는데 필자는 'Test'와 'TET'로 하였다. 

Bitcoin, BTC와 같은 이치이다.

 

constructor 부근에 _mint 함수가 있는데 토큰을 발행하는 함수이다.

생성자에서 msg.sender라는 것은 이 생성자를 호출하는 사람의 주소를 뜻하는데 결국은 컨트랙트 소유자를 말한다.

내가 만든 ERC20 예시는 소유자에게 토큰 초기물량을 발행하는 것이다. 물론 이 부분은 각자 다르게 해도 된다.

 

여기까지만 해도 토큰 전송, 토큰 갯수 확인 등의 기본적인 기능은 상속받은 ERC20안에 구현되어 있다.

추가적인 기능을 및 응용을 원한다면 함수로 만들면 된다. 필자는 예시이니 기본적인 기능만 하도록 하겠다.

 

 

배포

배포를 하기 위해서는 migrations 폴더에 migration파일을 생성해야 한다.

필자는 1_deploy_ERC20.js라고 만들었다.

 

파일이름은 번호가 매겨진 prefix와 설명의 suffix로 이루어진다.

여기서 숫자를 증가시켜 파일을 만들고 다른 컨트랙트를 배포할 수 있다. 배포는 마지막으로 실행된 migration파일 이후 새로 생성된 migration파일만 진행한다.

각 순서를 초기화하려면 truffle migration --reset을 실행하면 된다.

 

우선 아래처럼 만들어보자.

const ERC20 = artifacts.require("TestERC20");

module.exports = function (deployer) {
  deployer.deploy(ERC20, 100000000);
};

 

deploy함수에서 두번째 인자의 숫자는 TestERC20.sol에서 생성자의 initialSupply 인자로 초기 물량이다.

 

migration파일을 만들었다면 truffle compile과 migration명령어를 실행하면 된다.

truffle compile
truffle migration --network development

network는 이전 설정 편에서 truffle-config.js에서 development로 설정하였으니 입력해주었다.

명령어를 실행하면 transaction hash와 contract address, account 주소등이 나올 것이다.

contract address는 스마트 컨트랙트의 주소, account는 소유자의 지갑 주소를 뜻한다.

 

여기까지 되었으면 로컬에 스마트컨트랙트를 배포가 되었다.

 

 

스마트컨트랙트 확인

배포를 했으면 간단하게 내가 만든 컨트랙트의 토큰을 다른 주소로 전송을 해보겠다.

ganache를 실행해보면 10개의 주소가 보일 것이다. 그중 하나에게 내가 만든 토큰의 반인 5000만개를 전송해보자.

 

truffle console --network "development"

위 명령어를 입력하면 내 로컬 네트워크에 접속할 수 있다.

 

아래처럼 명령어를 입력해보자.

truffle(development)> TestERC20.address

// output : 내 컨트랙트 주소

truffle(development)> TestERC20.deployed().then(function(i){c=i})

첫 줄의 명령어로는 내 컨트랙트 주소가 나올 것이다.

두번째 명령어는 내 컨트랙트가 배포된 instance를 가져온다.

 

truffle(development)> c.transfer('<other-address>', 50000000)

전송하는 함수이다.

<other-address> 부분에는 ganache의 10개중 내 주소 이외에 다른 주소를 넣고 전송을 해보자.

다른 함수들을 보려면 c.까지만 입력 후 탭을 두번 누르면 목록이 보일 것이다.

 

truffle(development)> c.balanceOf('<my-address>')

// output : 내 주소의 남은 토큰 잔여량

truffle(development)> c.balanceOf('<other-address>')

// output : 내가 보낸 주소의 남은 토큰 잔여량

 

이렇게 직접 확인까지 해보았다. 로컬에서는 간단하게 여기까지 해보자.

추후에는 Remix를 이용한 디버깅과 배포도 글을 올리겠다. (개인적으로 필자는 remix를 쓰는게 더 편하다.)

 

 

 

https://developer-jp.tistory.com/103

 

ERC20 스마트 컨트랙트 (SmartContract) 테스트넷에 배포해보자 [3]

시작하기 앞서 지난 편에서 Ganache로 로컬 배포를 진행해 보았다. 이번편에서는 Sepolia라는 이더리움 테스트넷에 배포를 진행해 보겠다. 테스트 넷에 배포하면 Etherscan이라는 홈페이지에서 확인이

developer-jp.tistory.com

 

반응형