Truffleを使ってERC20の独自トークンを発行する
こんにちは。休みの日はDapps開発をしている 藤田拓弥 です。
今回はERC20の独自トークン作成からローカル環境にデプロイまでを行います。
Truffle(Ethereumのスマートコントラクト開発フレームワーク)を使うので、何それ?という方は下記の記事を参考にして環境構築をお願いします。
それでは早速作っていきましょう。
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へのデプロイに挑戦しようかな。