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
의 발행한 토큰은 +
가 된것을 확인합니다.