MintとBurn

Mintは、TokenやCoinを鋳造する、つまり増やす行為。
Burnは、TokenやCoinを燃やす、つまり減らす行為。
ICOや何かで独自のTokenを作った場合に、それを増やしたり減らしたりするときにつかわれる。zeppelin-solidityのクラウドセールではEtherを送ってきた場合に、都度MintしてEtherの送金主に送られるなどの使い方がされている。
またICOが終了した場合に不要なTokenを減らしてTokenの価値を高めたりするのにBurnは使われる
zeppelin-solidityのライブラリを使えば比較的容易にTokenに組み込むことができてしまうが、なかなか使い方が解り難かったりしたので、自分のやり方を書いてみます

Tokenを作成

以前に作ったトークンを弄ってMintとBurnが出来るようにする

minaToken.sol
pragma solidity ^0.4.18;
import "zeppelin-solidity/contracts/token/ERC20/MintableToken.sol";
import "zeppelin-solidity/contracts/token/ERC20/BurnableToken.sol";

contract minaToken is MintableToken , BurnableToken {
  string public name = "minaToken";
  string public symbol = "MNTK";
  uint public decimals = 3;
  uint public INITIAL_SUPPLY = 10000 * (10 ** decimals);
  address public owner;

  function minaToken() public {
    totalSupply_ = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
    owner = msg.sender;
  }
}

importで、MintableToken.solBurnableToken.solを挿入する

import "zeppelin-solidity/contracts/token/ERC20/MintableToken.sol";
import "zeppelin-solidity/contracts/token/ERC20/BurnableToken.sol";

上で入れたライブラリを継承するようにする

contract minaToken is MintableToken , BurnableToken {

基本的にこれだけ

あとは自分の環境ではすでにデプロイしたものだったので、-rのオプションで再デプロイ

truffle(develop)> migrate -r

コンソールからMintとBurn

truffleコマンドによる接続してからMintやBurnを実施
まずTokenのインスタンスを作成する

truffle(develop)> inst = minaToken.at(minaToken.address)

作ったインスタンスを使いアカウントの残高を確認。
私の場合、INITIAL_SUPPLY = 10000(10 * decimals 3)の為に10000000が初期のアカウントに発行されている

truffle(develop)> inst.balanceOf(web3.eth.accounts[0])

BigNumber { s: 1, e: 7, c: [ 10000000 ] }

Mintを実施。
発行先のアドレスと発行数を指定する

truffle(develop)> inst.mint(web3.eth.accounts[0],1000)

{ tx: '0x2f43ad8caf307be8ec1535102ce2b4e3711193b40e12685910d8587ad5b0238b',
  receipt: 
   { transactionHash: '0x2f43ad8caf307be8ec1535102ce2b4e3711193b40e12685910d8587ad5b0238b',
     transactionIndex: 0,
     blockHash: '0x835ab293692d068dc14e304b17994f3203135f3e51856cb952f92423b1fc24c9',
     blockNumber: 5,
     gasUsed: 38065,
     cumulativeGasUsed: 38065,
     contractAddress: null,
     logs: [ [Object], [Object] ],
     status: '0x01',
     logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000010000008000000000000000000010000000000000000000000000000020000000000000000000800000000000000400000000010000000000000000000000000000000000000000000000000000000000000010000000002000080000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000004000000000000020000000000000000000000000000000000000000000000000000010000000000000' },
  logs: 
   [ { logIndex: 0,
       transactionIndex: 0,
       transactionHash: '0x2f43ad8caf307be8ec1535102ce2b4e3711193b40e12685910d8587ad5b0238b',
       blockHash: '0x835ab293692d068dc14e304b17994f3203135f3e51856cb952f92423b1fc24c9',
       blockNumber: 5,
       address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
       type: 'mined',
       event: 'Mint',
       args: [Object] },
     { logIndex: 1,
       transactionIndex: 0,
       transactionHash: '0x2f43ad8caf307be8ec1535102ce2b4e3711193b40e12685910d8587ad5b0238b',
       blockHash: '0x835ab293692d068dc14e304b17994f3203135f3e51856cb952f92423b1fc24c9',
       blockNumber: 5,
       address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
       type: 'mined',
       event: 'Transfer',
       args: [Object] } ] }

発行したあと残高を確認すると、指定した1000増えている事が確認できる

truffle(develop)> inst.balanceOf(web3.eth.accounts[0])

BigNumber { s: 1, e: 7, c: [ 10001000 ] }

続いて発行した分をBurnしてみru
Burnの場合は、アドレスは指定できず接続したCoinbaseのアカウントからBurnされるようだ

truffle(develop)> inst.burn("1000")

{ tx: '0x87f658f6331c74343f403210776e6bb97f90276ab98339ad76f0ef8af6f92678',
  receipt: 
   { transactionHash: '0x87f658f6331c74343f403210776e6bb97f90276ab98339ad76f0ef8af6f92678',
     transactionIndex: 0,
     blockHash: '0x2322be05ad44516dda63a5236acfa640d4fa112b4e01223c90a1270f061c55c5',
     blockNumber: 6,
     gasUsed: 34459,
     cumulativeGasUsed: 34459,
     contractAddress: null,
     logs: [ [Object] ],
     status: '0x01',
     logsBloom: '0x00000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000010000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000010000200002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000010000000000000' },
  logs: 
   [ { logIndex: 0,
       transactionIndex: 0,
       transactionHash: '0x87f658f6331c74343f403210776e6bb97f90276ab98339ad76f0ef8af6f92678',
       blockHash: '0x2322be05ad44516dda63a5236acfa640d4fa112b4e01223c90a1270f061c55c5',
       blockNumber: 6,
       address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
       type: 'mined',
       event: 'Burn',
       args: [Object] } ] }

成功したら残高を確認する

truffle(develop)> inst.balanceOf(web3.eth.accounts[0])

BigNumber { s: 1, e: 7, c: [ 10000000 ] }

解ってしまえば簡単な事ではあったけど、このやり方はあまり推奨されてないのかもしれない

参考

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.