どうもこじりょー(@kojiryoinvestor)です。
この記事では「OpenZeppelin」を利用したERC20トークンのburn関数の仕組みを確認していきます。
前回のチュートリアルのコードをベースに実装していきますので、まだ読まれていない場合は先に下記のチュートリアルを確認しておくことをオススメします!
1. 【Truffle5.0対応】シンプルなERC20トークンを作成しよう!
2. ERC20トークンの追加発行機能を実装しよう!【OpenZeppelin2.0】
ERC20トークンの処分とは?
下記のチュートリアルでは、ERC20トークンを追加発行する方法を解説しました。
ERC20トークンの追加発行機能を実装しよう!【OpenZeppelin2.0】
この仕組みによりトークンを追加発行して資金を集めるといったことができます。
しかしトークンを発行して売れ残ってしまった場合はどうなるでしょう?
余ったトークンは値段を下げて売却するかもしれません。
その場合、初回にトークンを購入した投資家からは喜ばれませんね。
そんなとき、余ったトークンはburn関数を利用して処分することができます。
ERC20Burnable
「ERC20Buenable.sol」は「ERC20.sol」を継承しています。
「ERC20.sol」のプライベート関数「_burn()」や「_burnForm()」をラッピングして、それぞれをコントラクト外部(public)から呼び出せるようにしています。
pragma solidity ^0.4.24;
import "./ERC20.sol";
/**
* @title Burnable Token
* @dev Token that can be irreversibly burned (destroyed).
*/
contract ERC20Burnable is ERC20 {
/**
* @dev Burns a specific amount of tokens.
* @param value The amount of token to be burned.
*/
function burn(uint256 value) public {
_burn(msg.sender, value);
}
/**
* @dev Burns a specific amount of tokens from the target address and decrements allowance
* @param from address The address which you want to send tokens from
* @param value uint256 The amount of token to be burned
*/
function burnFrom(address from, uint256 value) public {
_burnFrom(from, value);
}
}
トークンが処分される仕組み
トークンが処分される仕組みは単純です。
「ERC20.sol」の「_burn()」は、残高を減らしたいアカウント(addres account)と減らしたいトークンの量(uint256 value)を受け取ります。
その後、_totalSupply(発行されているトークンの合計)とアカウントのトークン残高のそれぞれから、減らしたいトークンの量の分だけ減算しているだけです。
ERC20.sol 「_burn()」:
function _burn(address account, uint256 value) internal {
require(account != address(0));
_totalSupply = _totalSupply.sub(value);
_balances[account] = _balances[account].sub(value);
emit Transfer(account, address(0), value);
}
実装
発行したトークンを処分する機能は「ERC20Burnable.sol」を継承するだけで実装できます。
デプロイ
それではGanacheを起動して、プライベートネットにコントラクトをデプロイします。
コードの完成版はGitHubで公開しています。
https://github.com/kojimaro/ERC20Tutorial
再度コントラクトをデプロイする際は「–reset」オプションを付けます。
デプロイに成功したらプライベートネットのノードにアクセスしましょう。
$ truffle migrate --reset
$ truffle console

トークンを処分する
トークン残高の確認
プライベートネットのノードにアクセスしたら、Ganacheが生成したイーサリアムアカウントを取得します。
下記のコードを実行して、イーサリアムアカウントをaccounts変数に格納します。
web3.eth.getAccounts().then(a=>accounts=a)

続いて以下のコードを実行して、コントラクトのインスタンスを生成してinstance変数に格納します。
SimpleToken.deployed().then(i=>instance=i)
下記のコードを実行してトークン名を表示できていればインスタンスの生成に成功しています。
instance.name()

さらに下記のコードを実行して、accounts[0]のトークン残高を取得します。
instance.balanceOf(accounts[0]).then(b=>balance=b)
Ether(10^18)の単位に変換し、トークンの残高を表示します。
web3.utils.fromWei(balance, "ether")

以上で、accounts[0]が100STトークン所持していることが確認できました。
burn関数の実行
まずは処分するトークンの量を指定しましょう。
ここでは50ST分のトークンを処分していきます。
amount = web3.utils.toBN(50*(10**18))
続いてburn関数の引数に処分するトークンの量を与えて、処理を実行します。
instance.burn(amount)
実行したら再度accounts[0]のトークン残高を確認してみます。

ついでにtotalSupply(トークンが発行されている合計)も確認してみます。

残高とtotalSupplyのそれぞれから指定した量のトークンが処分されていることが確認できました。
おわりに
以上が「OpenZeppelin」を利用したERC20トークンのburn関数の仕組みと実装でした。
「OpenZepplin」を利用するとこんなにも簡単にトークンの作成や拡張が可能になります。
また「ERC20」だけでなく「ERC725」や「クラウドセール(crowdsale)」のコントラクト等も作成できます。
ぜひ色々いじって遊んでみてください!
[…] Next step: 「ERC20トークンを処分するburn関数の仕組みと実装【OpenZeppelin2.0】」 […]