IDE: online IDE인 REMIX를 활용해도 괜찮다. 필자는 vscode를 사용
Infura : smartcontract의 네트워크 배포를 위해선 node가 필요하다. 이를 제공해주는 infura node api 활용
ganache : solidity 배포 테스트
truffle : (ethereum development environment) Solidity 언어로 smartcontract 작성을 위한 프레임워크
hardhat : (ethereum development environment) Solidity 언어로 smartcontract 작성을 위한 프레임워크
Myetherwallet : wallet과 연동되어 본인 소유 account 속 contract(token형태) 확인가능
etherscan : ethereum transaction을 확인하기 위한 사이트
openzeppelin : ethereum smart contract 작성을 도와주는 library
nvm(node version manager)설치. 프로젝트마다 원하는 node.js Version이 다르기에.
brew install nvm
.zshrc에 path설정
export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
node version 16설치 및 default설정
nvm install v16
nvm list
nvm use v16
nvm alias default 16.13.0
필요한 libray 설치
npm install truffle, ganache-cli, @openzeppelin/contracts
truffle 으로 ethereum project 진행
project 프레임 잡기
truffle init
디렉토리 구조는 아래와 같다
(truffle이 정한 디렉토리 구조 약속)
contracts 디렉토리에 smartcontract.sol 작성
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract PLAYPLZTOKEN is ERC20{
uint public INITIAL_SUPPLY = 120000;
constructor() ERC20("PLAYPLZTOKEN","PPTOEKN"){
_mint(msg.sender, INITIAL_SUPPLY);
}
}
contract plyplztoken is ERC20{~~이란
openzeppelin에서 정의한 ERC20 contract에 덮어쓰기 하는것이다. 마치 python에서 class 상속받고 override하는 방식처럼 이해하면 쉽다. INITIAL_SUPPLY attribute를 정의해주면 ERC20 스마트컨트랙트는 배포된후 INITIAL_SUPPLY만큼 token을 발행(mint)한다.
truffle compile 하면 build 디렉토리에 컴파일된 .json파일 생성
truffle compile
migrations 디렉토리에 migration.js 작성
var PLAYPLZTOKEN = artifacts.require("PLAYPLZTOKEN")
module.exports = function(deployer){
deployer.deploy(PLAYPLZTOKEN);
}
truffle-config.js 작성
infura api를 이용해 HDWalletprovider 설정 및 mnemonic 암호 설정(.secret파일에 mnemonic phrase 불러오기)
const HDWalletProvider = require('@truffle/hdwallet-provider');
const infurakey = "c39c73ade6234570a752da78c29ff630";
const fs = require('fs');
const mnemonic = fs.readFileSync(".secret").toString().trim();
ropsten 네트워크 설정
module.exports = {
networks: {
ropsten: {
provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/c39c73ade6234570a752da78c29ff630`),
network_id: 3, // Ropsten's id
gas: 5500000, // Ropsten has a lower block limit than mainnet
confirmations: 2, // # of confs to wait between deployments. (default: 0)
timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50)
skipDryRun: true // Skip dry run before migrations? (default: false for public nets )
},
},
// Set default mocha options here, use special reporters etc.
mocha: {
// timeout: 100000
},
smart contract 배포하기
truffle migrate --reset
https://etherscan.io 에서 contract address 로 확인
truffle cli를 활용한 방법
instance = await PLAYPLZTOKEN.deployed()
instance.name()
instance.symbol()
instance.mint("PLAYPLZTOKEN contract속 정의된 mint함수가 필요한 인자1","PLAYPLZTOKEN contract속 정의된 mint함수가 필요한 인자2")
instance.totalSupply()
etherscan contract 탭에서 GUI를 활용하는 방법
REMIX를 활용하는 경우