이더리움 기반 ERC20 토큰 만들기
[요약]
Remix에서 ERC20 토큰 생성 & 전송.
이를 통해 코인과 토큰이 차이를 알아보자.
토큰 생성하기
- 리믹스 접속.
- 스마트 컨트랙트 작성
- '더보기'로 코드 내용확인가능.
-
더보기
pragma solidity >=0.4.22 <0.6.0; contract ERC20Basic { string public constant name = "Maximus"; string public constant symbol = "Maxi"; uint8 public constant decimals = 0; // 토큰 명칭, 심볼, 소수점 event Approval(address indexed tokenOwner, address indexed spender, uint tokens); event Transfer(address indexed from, address indexed to, uint tokens); // 이벤트 Approval, Transfer가 받는 파라미터 mapping(address => uint256) balances; mapping(address => mapping (address => uint256)) allowed; // 맵핑 uint256 totalSupply_; // totalSupply 숫자 변수. using SafeMath for uint256; constructor(uint256 total) public { totalSupply_ = total; balances[msg.sender] = totalSupply_; } // constructor 토큰 생성시 호출되는 함수 // uint256 total : 생성할 토큰의 총량 // msg.sender: 배포자의 주소 // 배포자의 주소의 잔고를 생성할 토큰의 총량 만큼 대입시킴. //=> 총 발행량을 발행하는 사람이 정할 수 있으며 배포 시 모두 발행자에게 지급됨. function totalSupply() public view returns (uint256) { return totalSupply_; } function balanceOf(address tokenOwner) public view returns (uint) { return balances[tokenOwner]; } // tokenOwner의 잔고를 확인 function transfer(address receiver, uint numTokens) public returns (bool) { require(numTokens <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender].sub(numTokens); balances[receiver] = balances[receiver].add(numTokens); emit Transfer(msg.sender, receiver, numTokens); return true; } // transfer 함수 :토큰 전송 // : 함수 transfer는 수신자의 주소, 토큰의 수량을 파라미터로 받는다. //그리고나서 true/false(bool)를 반환한다. // require~:보내는 토큰의 수량(numTokens)보다 토큰 전송자의 //토큰 잔고( balances[msg.sender])가 더 커야 함. // balance[msg.sender]~: :보내는 토큰의 수량(numTokens)만큼 //토큰 전송자의 잔고( balances[msg.sender])를 감소(sub)시킴 // balances[receiver]~:수신자의 토큰 잔고(balances[receiver])를 //송신자가 전송한 토큰의 수량만큼 증가(add)시킴. function approve(address delegate, uint numTokens) public returns (bool) { allowed[msg.sender][delegate] = numTokens; emit Approval(msg.sender, delegate, numTokens); return true; } function allowance(address owner, address delegate) public view returns (uint) { return allowed[owner][delegate]; } function transferFrom(address owner, address buyer, uint numTokens) public returns (bool) { require(numTokens <= balances[owner]); require(numTokens <= allowed[owner][msg.sender]); balances[owner] = balances[owner].sub(numTokens); allowed[owner][msg.sender] = allowed[owner][msg.sender].sub(numTokens); balances[buyer] = balances[buyer].add(numTokens); emit Transfer(owner, buyer, numTokens); return true; } } library SafeMath { function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } }
DEPLOY & RUN TRANSACTIONS
Deploy에 총 발행량을 입력하면 된다.
1,000을 입력하여 1,000개 발행.
토큰명: Maximus
토큰 심볼: Maxi
토큰 발행 수량: 1,000
- 발행 완료
토큰이 발행이 완료 되고
메타마스크에서 토큰 추가를 클릭하여
토큰의 스마트컨트랙트 주소를 입력하면
토큰 발행자인 나의 메타마스크에
1,000개의 Maxi 토큰이 지급된것을 확인 할 수 있다.
1,000개의 Maxi 토큰 중 1개를 다른 지갑 주소로보낸다.
수신자는 토큰 전송이 완료 되었더라도
전송자가 보낸 1 Maxi 토큰을 확인할 수 없다.
역시 토큰 추가를 눌러서
토큰의 스마트컨트랙트 주소를 입력해서 추가하면
전송된 토큰을 확인할 수 있다.
*토큰은 스마트컨트랙트내에 주소마다 밸런스가 얼마 갖고 있는지 기록된다.
토큰 스마트컨트랙트 주소를 해야 해당 토큰을 내가 얼마 갖고 있는지 확인 할 수 있다.
[코인과 토큰 차이]
- 코인
Account {
nonce:
balance:
code:
storage:
}
코인 전송시
전송자는 받는 사람 주소, 보낼 코인의량을 설정하고 보내게 된다.
이 경우 EOA(외부 소유 계정)에서 EOA로 전송되므로
수신자는 전송된 코인 만큼 어카운트의 코인이 증가하고
송신자는 전송한 코인 만큼 감소하게된다.
- 토큰
Tx {
to:
value:
gas:
data:
}
토큰의 경우에는
수신자 EOA를 입력하고 보낼 토큰의 수량을 설정하고 보내게 된다.
하지만 토큰 전송이 완료 되어도 수신자는 자신이 토큰을 받았는지 확인할 수 없다.
토큰의 스마트컨트랙트 주소를 메타마스크에서 추가해야 비로소 수신자가
토큰을 얼마나 받았는지 확인 할 수 있다.
토큰의 스마트컨트랙트 내에 수신자의 밸런스가 기록되기 때문이다.
'블록체인' 카테고리의 다른 글
uint 자료형의 허점을 노린 스마트컨트랙트 해킹 (0) | 2021.07.28 |
---|---|
스마트컨트랙트 홀짝 해킹 #3 (0) | 2021.07.28 |
스마트컨트랙트에서 코인 훔치기 #2 (0) | 2021.07.27 |
스마트컨트랙트에서 코인을 훔쳐보자 (0) | 2021.07.27 |
스마트컨트랙트 배포 (1) | 2021.07.26 |