블록체인 Block-Chain - 이더리움 ERC-20 토큰 발행하기

dev_swan·2022년 7월 16일
0

블록체인

목록 보기
24/36
post-thumbnail

Interface

  • Interface란 간단하게 객체에 담을 내용을 지정해놓은 것입니다.
  • Token을 생성할때에도 아래와 비슷한 Interface 형식으로 생성을 할 것입니다.
Interface balance{
	address:string; // 지갑 주소
	amount:number;  // 금액
}

Interface token{
	name:string; // 토큰의 이름
	symbol:string; // 토큰의 심볼명 BTC,ETH 등등
	balances:string[]; // UTXO처럼 해당 주소의 남은 금액만 배열로 담습니다.
}

이더리움 토큰 만들어보기

Truffle 세팅

  • mkdir truffle
  • cd truffle
  • truffle init
  • truffle-config.js 파일의 development 주석 풀기
development: {
  host: '127.0.0.1', // Localhost (default: none)
    port: 8545, // Standard Ethereum port (default: none)
      network_id: '*', // Any network (default: none)
},

Solidity Code 작성

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

contract swanToken {

    mapping(address => uint256) public balances;

    string public name = 'swanToken'; // 토큰명
    string public symbol = "STK"; // 심볼명
    uint8 public decimals = 18; // 소수점 자릿수
    uint256 public totalSupply = 21000000 * 10 ** decimals; // 토큰 발행량

    constructor(){
        balances[msg.sender] = totalSupply;
    }

    function balanceOf(address _owner)public view returns (uint256 balance){
        return balances[_owner];
    }
}
  • 위와 같이 코드를 작성하는데 name에는 해당 토큰의 이름을 적고 symbol에는 심볼명을 decimals에는 해당 토큰의 소수점 자릿수를 적고 totalSupply에는 해당 토큰의 총 발행량 적어줍니다 토큰이 wei 단위이니 발행량을 조금 크게 잡아줍니다.
  • balances[msg.sender] = totalSupply 이 부분을 살펴보면 새로운 배열을 생성할 것인데 안의 내용은 mapping(address => uint256) public balances 으로 만든 객체의 내용이 들어가고 msg.sendercontract를 배포한 계정에 발행한 모든 토큰을 할당해준다는 내용입니다. 이 배열의 내용은 객체 형태로 address와 보유한 토큰양을 저장 하고 있습니다. 비트코인의 UTXO와 비슷한 것을 알 수 있습니다.
  • 마지막으로 balanceOf 함수를 만들어 본인의 현재 balance를 구해오도록 하였습니다.

Contract 배포하기

  • Ganache-cli 실행후 truffle migration으로 작성한 Contract를 배포합니다.

  • Contract가 성공적으로 배포되었다면 배포된 Contract Address 계정을 보관합니다.
  • MetaMaskGanache의 개인키를 입력하여 2개의 지갑을 MetaMask에 가져옵니다.

  • MetaMask에 성공적으로 Ganache network의 지갑을 가져왔다면, 자산의 토큰 가져오기를 하여 CA값을 넣으면 방금 생성한 토큰 내용이 입력됩니다.


  • 토큰 가져오기가 완료되었으면 지갑의 자산에서 본인의 현재 배포한 토큰의 balance를 확인할 수 있습니다.

Contract 수정

  • 지금까지는 토큰을 발행하고 발행한 토큰양을 가져올 수만 있으니, 생성한 토큰을 다른 지갑으로 보낼수 있도록 ContractTransfer 함수를 추가하도록 하겠습니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

contract swanToken {

    mapping(address => uint256) public balances;

    string public name = 'swanToken'; // 토큰명
    string public symbol = "STK"; // 심볼명
    uint8 public decimals = 18; // 소수점 자릿수
    uint256 public totalSupply = 21000000 * 10 ** decimals; // 토큰 발행량

    constructor(){
        balances[msg.sender] = totalSupply;
    }

    function balanceOf(address _owner)public view returns (uint256 balance){
        return balances[_owner];
    }

    function transfer(address _to, uint256 _amount) public returns(bool success) {
        require(balances[msg.sender] >= _amount); // 조건이 충족되지 않으면 함수가 종료됩니다.
        balances[msg.sender] -= _amount;
        balances[_to] += _amount;

        return true;

    }
}
  • 위와 같이 새로운 transfer 함수를 만들어 토큰을 받는 계정인 _to와 보내려는 금액인 amount을 인자값으로 받아 require()를 사용하여 balances 배열 안에서 msg.sender, 즉 보내려는 지갑의 amount가 보낼 금액만큼 있는지 확인한 후 보내려는 금액보다 가지고있는 금액이 더 클 경우에만 balances 배열안에 보내려는 지갑의 금액을 보내려는 금액만큼 빼고 받는 사람의 금액을 보내려는 금액만큼 더하고 난후 truereturn하도록 합니다.

생성한 Token 전송하기

  • SolidityCode를 수정했으니 Truffle migration --reset으로 Contract를 재배포 한뒤 다시 CA값을 입력하여 MataMask에 추가하도록 합니다.

  • Account2Account3의 지갑에 CA값을 넣어 각각 발행한 토큰을 추가해줍니다.
  • Account2Conract를 배포한 계정이라 발행한 모든 Token을 보유중인것을 알 수 있습니다.

  • 이제 Account2에서 Account3으로 발행한 Token을 전송해보도록 하겠습니다.

  • 발행한 토큰 내보내기

  • 보내기

  • 내 계정간 전송 -> Account3 선택

  • 보낼 토큰 수량 적고 다음 클릭

  • 예상 가스비 확인후 확인 클릭 -> Account2에 발행한 토큰은 - 되고 Account3의 발행한 토큰은 + 가 된것을 확인합니다.

0개의 댓글