ERC20トークンを処分するburn関数の仕組みと実装【OpenZeppelin2.0】

ERC20トークンを処分するburn関数の仕組みと実装【OpenZeppelin2.0】

どうもこじりょー(@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)から呼び出せるようにしています。

ERC20Buenable.sol

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()

「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]のトークン残高を確認してみます。

「burn()」実行後のaccounts[0]のトークン残高

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

「burn()」実行後のtotalSupply

残高とtotalSupplyのそれぞれから指定した量のトークンが処分されていることが確認できました。

おわりに

以上が「OpenZeppelin」を利用したERC20トークンのburn関数の仕組みと実装でした。

「OpenZepplin」を利用するとこんなにも簡単にトークンの作成や拡張が可能になります。

また「ERC20」だけでなく「ERC725」「クラウドセール(crowdsale)」のコントラクト等も作成できます。

ぜひ色々いじって遊んでみてください!

ERC20トークンカテゴリの最新記事