우분투에서 ganache-cli 를 입력하면 100이더가 들어있는 계정 10개가 뜬다.
메타마스크에서 네트워크를 로컬호스트로 바꿔주고 비공개 키로 계정을 2개 갖고오자.
그리고 truffle migrate로 생성되었던 contract address로 토큰을 추가하면 하나에는 2100만개의 토큰이, 나머지에는 0개의 토큰이 생긴다.
나는 프로젝트를 위해 이전 포스팅에서와 다른 토큰을 새로 생성해서 했다.
이제 token.sol파일의 내용을 수정해준다.
나는 코인을 새로 발행하는 mint와 발행된 코인을 태우는 burn 기능을 사용해볼 것이다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import '@openzeppelin/contracts/access/AccessControl.sol';
import '@openzeppelin/contracts/token/ERC20/ERC20.sol';
contract MontBlancToken is ERC20, AccessControl {
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE");
address minter = msg.sender;
address burner = msg.sender;
uint public INITIAL_SUPPLY = 21000000;
constructor() public ERC20("MontBlanc Token", "MBT") {
_setupRole(MINTER_ROLE, minter);
_setupRole(BURNER_ROLE, burner);
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
_mint(msg.sender, INITIAL_SUPPLY * 10 ** (uint(decimals())));
}
function mint(address to, uint256 amount) public onlyRole(MINTER_ROLE){
// require(hasRole(MINTER_ROLE, msg.sender), "Caller is not a minter);
_mint(to, amount);
}
function burn(address from, uint256 amount) public onlyRole(BURNER_ROLE) {
// require(hasRole(BURNER_ROLE, msg.sender), "Caller is not a burner);
_burn(from, amount);
}
}
우분투를 하나 열어 ganache-cli로 네트워크를 켠다.
그리고 다른 우분투를 또 열어서 수정사항 반영을 위해 compile과 migrate를 해준다.
이미 migrate한 토큰을 갱신하려면 --reset을 해주면 된다.
truffle compile --all
truffle migrate --reset
이제 토큰의 기능이 잘 실행되는지 테스트할 것이다.
https://www.myetherwallet.com/
위 사이트에 접속하면 다음과 같은 화면이 뜬다.
만들어둔 지갑이 있으므로 access my wallet 선택
위에서 두번째인 Browser Extension 선택하면 메타마스크 창이 뜬다.
가져온 계정 중 토큰이 들어있는 계정을 선택한다. 그럼 선택한 지갑 페이지에 들어갈 수 있다.
좌측의 contract 에서 Interact with Contract를 선택한다.
아까 migrate해서 얻은 토큰의 contract address와,
토큰 폴더의 build > contracts > ~~Token.json 파일의 abi 부분을 복사해 붙여넣자.
이제 다음과 같은 화면이 뜰 것이다.
minter_role을 선택하고 read를 누르면 발행하는 역할의 해시값이 뜬다.
나온 값을 더블클릭해 복사하고, hasrole을 선택해 role 부분에 붙여넣고, 2100만개 토큰을 갖고 있는 지갑 주소를 복사해 붙여넣어 mint 권한이 있는지 검사해보자.
true 가 나왔으므로 발행 권한이 있는 지갑이다. 다른 지갑주소를 넣어보면 false 가 뜬다.
발행 권한이 없는 지갑에 mint로 토큰을 발행해보자.
mint를 선택해 토큰이 없는 지갑주소를 넣고, 발행해주고 싶은 양을 입력해준다.
원하는 양만큼 입력하고 뒤에 소수점 자리를 표시하는 0을 18개 넣어줘야 한다.
Write를 눌렀을 때 오류가 나면 발행 권한이 있는 계정이 아닌 다른 계정이 연결되어 있을 가능성이 높다.
오류가 나면 현재 창에서 확장 중 메타마스크를 눌러 발행 권한이 있는 계정을 연결해주자.
이제 메타마스크를 열면 잘 발행된 것을 확인할 수 있다.
다른 지갑에도 발행/폐기 권한을 주고 싶으면 minter/burn_role을 선택해 role의 해시값을 받아오고
MyEtherWallet에서 GrantRole로 코인 발행/폐기 권한을 부여할 수 있다.
마찬가지로 RevokeRole로 부여했던 권한을 다시 빼앗을 수 있다.
'블록체인 기반 핀테크 및 응용 SW 개발 > Solidity' 카테고리의 다른 글
[Solidity] 2. 만든 토큰을 ropsten testnet에 발행하기 (0) | 2021.07.23 |
---|---|
[Solidity] 1. 우분투에서 이더리움 토큰 만들고 MetaMask로 배포해보기 (0) | 2021.07.16 |