Truffleを使ってERC20の独自トークンを発行する

こんにちは。休みの日はDapps開発をしている 藤田拓弥 です。

今回はERC20の独自トークン作成からローカル環境にデプロイまでを行います。
Truffle(Ethereumのスマートコントラクト開発フレームワーク)を使うので、何それ?という方は下記の記事を参考にして環境構築をお願いします。

takuyafujita.hatenablog.com

それでは早速作っていきましょう。

Truffleでプロジェクトを作成する

今回は自分の名前(takuya)でトークンを発行しますので「takuya_token」という名前のディレクトリを作成します。

mkdir takuya_token

作成したディレクトリに移動します。

cd takuya_token

Truffleを初期化してプロジェクトに必要なファイル一式を作成します。

truffle init

OpenZepplinをインストールする

続いて独自トークンとなるコントラクトを作成しますが、その前にOpenZepplinをインストールします。
OpenZepplinはEthereum上で安全なコントラクトを実装するためのフレームワークです。
その中にERC20も含まれており、トークンに必要な機能が一通り揃っています。

まずは「package.json」を作成します。

npm init -f

続いてOpenZeppelinをインストールします。

npm install zeppelin-solidity

インストールすると以下の警告が出ました。

This package has been renamed to openzeppelin-solidity. Please update your dependency, or you will no longer receive updates.

OpenZeppelinのバージョンが上がり、パッケージ名が変わっているようです。

新:openzeppelin-solidity
旧:zeppelin-solidity

今回は旧の方を使用します。

コントラクトを実装する

プロジェクト(takuya_token)配下の「contracts」ファルダ内に、「TakuyaToken.sol」という名前でファイルを新規作成します。

「TakuyaToken.sol」の内容は下記の通りです。


マイグレーションファイルを作成する

デプロイを行うので、マイグレーションファイルを作成します。

プロジェクト(takuya_token)配下の「migrations」ファルダ内に、「2_deploy_takuya_token.js」という名前でファイルを新規作成します。

「2_deploy_takuya_token.js」の内容は下記の通りです。


テストコードを作成する

プロジェクト(takuya_token)配下の「test」ファルダ内に、「TestTakuyaToken.js」という名前でファイルを新規作成します。

「TestTakuyaToken.js」の内容は下記の通りです。


テストを実施する

今回はローカル環境を使用するので、以下のコマンドでEthereumブロックチェーンエミュレータを起動します。

truffle develop

truffle consoleに入りますので、そのままテストを実行します。

truffle(develop)> test

テスト結果が表示されます。想定通りの結果になればデプロイに進みます。

Compiling .\contracts\Migrations.sol...
Compiling .\contracts\TakuyaToken.sol...
Compiling zeppelin-solidity/contracts/token/ERC20/StandardToken.sol...
Compiling zeppelin-solidity\contracts\math\SafeMath.sol...
Compiling zeppelin-solidity\contracts\token\ERC20\BasicToken.sol...
Compiling zeppelin-solidity\contracts\token\ERC20\ERC20.sol...
Compiling zeppelin-solidity\contracts\token\ERC20\ERC20Basic.sol...

  Contract: TakuyaToken
    √ should put 1000 TAKUYA in the first account

  1 passing (65ms)

デプロイする

以下のコマンドでローカル環境にデプロイを行います。

truffle(develop)> migrate

デプロイされた内容を確認する

以下のコマンドでデプロイしたTakuyaTokenのオブジェクトを変数(TakuyaToken)に格納します。

truffle(develop)> TakuyaToken = TakuyaToken.at(TakuyaToken.address)

コントラクトを作成する際に設定した情報を確認します。

トークンの名称

truffle(develop)> TakuyaToken.name()
'TAKUYA'

トークンの単位

truffle(develop)> TakuyaToken.symbol()
'TAKUYA'

トークンの総発行量

truffle(develop)> TakuyaToken.totalSupply()
BigNumber { s: 1, e: 21, c: [ 10000000 ] }

独自トークンを送金する

1つ目のアカウントはトークンの発行者なので作成した全てのトークンが入っていることを確認します。

truffle(develop)> TakuyaToken.balanceOf(web3.eth.accounts[0])
BigNumber { s: 1, e: 21, c: [ 10000000 ] }

2つ目のアカウントはトークンの残高が0であることを確認します。

truffle(develop)> TakuyaToken.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 0, c: [ 0 ] }

1つ目のアカウントから2つ目のアカウントに 100 TAKUYA を送金します。

truffle(develop)> TakuyaToken.transfer(web3.eth.accounts[1], 100)

2つ目のアカウントの残高が100であることを確認します。

truffle(develop)> TakuyaToken.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 2, c: [ 100 ] }

これで独自トークンを発行し、送金できることが確認できました!

本当はRopstenにデプロイしたかったのですがエラーが出て解決に時間がかかりそうだったので断念しました。

次はRopstenへのデプロイに挑戦しようかな。