Interface란 간단하게 객체에 담을 내용을 지정해놓은 것입니다.Token을 생성할때에도 아래와 비슷한Interface형식으로 생성을 할 것입니다.
Interface balance{
address:string; // 지갑 주소
amount:number; // 금액
}
Interface token{
name:string; // 토큰의 이름
symbol:string; // 토큰의 심볼명 BTC,ETH 등등
balances:string[]; // UTXO처럼 해당 주소의 남은 금액만 배열로 담습니다.
}
- 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) },
// 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.sender즉contract를 배포한 계정에 발행한 모든 토큰을 할당해준다는 내용입니다. 이 배열의 내용은 객체 형태로address와 보유한 토큰양을 저장 하고 있습니다. 비트코인의UTXO와 비슷한 것을 알 수 있습니다.- 마지막으로
balanceOf함수를 만들어 본인의 현재balance를 구해오도록 하였습니다.
Ganache-cli 실행후 truffle migration으로 작성한 Contract를 배포합니다.
Contract가 성공적으로 배포되었다면 배포된 Contract Address 계정을 보관합니다.MetaMask에 Ganache의 개인키를 입력하여 2개의 지갑을 MetaMask에 가져옵니다.
MetaMask에 성공적으로 Ganache network의 지갑을 가져왔다면, 자산의 토큰 가져오기를 하여 CA값을 넣으면 방금 생성한 토큰 내용이 입력됩니다.

balance를 확인할 수 있습니다.
- 지금까지는 토큰을 발행하고 발행한 토큰양을 가져올 수만 있으니, 생성한 토큰을 다른 지갑으로 보낼수 있도록
Contract에Transfer함수를 추가하도록 하겠습니다.
// 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배열안에 보내려는 지갑의 금액을 보내려는 금액만큼 빼고 받는 사람의 금액을 보내려는 금액만큼 더하고 난후true를return하도록 합니다.
SolidityCode를 수정했으니 Truffle migration --reset으로 Contract를 재배포 한뒤 다시 CA값을 입력하여 MataMask에 추가하도록 합니다.

Account2와Account3의 지갑에CA값을 넣어 각각 발행한 토큰을 추가해줍니다.Account2가Conract를 배포한 계정이라 발행한 모든Token을 보유중인것을 알 수 있습니다.
이제 Account2에서 Account3으로 발행한 Token을 전송해보도록 하겠습니다.
발행한 토큰 내보내기


Account3 선택

Account2에 발행한 토큰은 - 되고 Account3의 발행한 토큰은 + 가 된것을 확인합니다.
