dukDukz
[블록체인] 오픈제펠린을 이용해서 토큰 생성, 테스트넷 배포 본문
# 기본 세팅
- 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/
홈페이지 접속 후
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 배포하기
테스트넷의 주소를 알아야 한다...!
-> 가입하고
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
이것도 하나의 포폴이 될 수 있음
'웹 개발 > 블록체인' 카테고리의 다른 글
[블록체인] BSC Test Network 에서 ERC20 토큰 발행하기 (0) | 2022.11.08 |
---|---|
ERC1155 (0) | 2022.02.15 |
[블록체인] GAS란 ? ERC20 토큰 생성 ? (0) | 2021.10.18 |
[블록체인] 서명하는 방법 3가지 - 수업 ver (0) | 2021.10.18 |
[블록체인] Dapp 사용의 전반적인 흐름 (0) | 2021.10.18 |