truffleでERC20トークン作成する

gethを触り、truffleを触り、なんとなくブロックチェーンの開発、というものが見えてきました。

truffleのプロジェクト作成から、ERC20トークンをコーディングして、truffleのディベロッパー環境のブロックチェーンネットワークにデプロイに挑戦してみます。

truffleのインストールやnpmコマンドのインストールが前提となりますので、truffle等がインストールされていない場合下の記事を参考にインストール作業を行ってください。

truffleには、developという一瞬でトランザクションをブロックに組み込んでくれる開発に適した仮のブロックチェーンがありますので、今回はdevelopでERC20トークンを動作させる、という点を目標にしたいと思います。

プロジェクト作成準備

・プロジェクフォルダ作成

ターミナルを開き、以下コマンドでプロジェクトフォルダを作成。

mkdir mytoken

・プロジェクトの初期化

作成したプロジェクトフォルダ内に移動します。

cd mytoken

移動したら、以下のコマンドでtruffleプロジェクトに必要なファイル群をダウンロードします。

truffle init

・openzeppelin-solidityフレームワークの追加

以下コマンドで、OpenZeppelinをプロジェクトに追加します。

①package.jsonの生成

npm init -f

②openzeppelin-solidityのダウンロード

npm install openzeppelin-solidity

①のコマンドで、プロジェクトフォルダ内にpackage.jsonが生成され、②のコマンドでOpenZeppelinのフォルダがダウンロードされます。

上記2コマンドで、プロジェクトフォルダに以下のファイル、フォルダが追加されます。

・package.json

・node_modules

node_modulesフォルダの中に、OpenZeppelinのsolファイル(フレームワーク集のプログラムソースコード)が格納されます。

これで、自分のトークンをコーディングする準備が整いました。

ERC20トークンのコーディング

・手順概要

トークン作成の際には、以下のファイルをいじります。

①contractsフォルダ内の「自分のトークンコード.sol」

テキストエディタなどで作成して.solの拡張子で保存してcontractsフォルダに入れます。

「自分のトークンコード」の部分は任意の名前です。今回はmytokenとします。

②migrationsフォルダ内の「2_deploy_自分のトークン名.sol」

テキストエディタ等で作成してmigrationsフォルダに入れます。

「自分のトークン」の部分は任意の名前です。今回はmytokenとします。

・mytoken.solの作成

以下のコードをテキストエディタ等で入力します。

もし、テキストエディタがない場合は、標準のテキストエディタを使用するか、以下のオススメの無料テキストエディタを使用してください。

無料のテキストエディタ

個人的オススメはBracketsです!

pragma solidity ^0.4.18;

import "openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol";

contract mytoken is StandardToken{
  string public name = "mytoken";
  string public symbol = "MYTKN";
  uint public decimals = 18;

  constructor (uint initialSupply) public{
    totalSupply_ = initialSupply;
    balances[msg.sender] = initialSupply;
  }
}

mytoken.solファイル

・コードの簡単な説明

importでopenzeppelin-solidityのStandardToken.solをこのコード内で使えるようにしました。

コントラクトはクラスの概念に似ています。

contract mytoken is StandardToken{

……

}

OpenZeppelinのコードStandardToken.solのコントラクト、StandardTokenを継承しているコントラクトmytokenとなります。

contract mytoken内に定義した変数

name:発行するトークンの名前です。

symbol:発行するトークンのシンボルです。お金の単位になります。この場合、1000MYTKNとなります。

decimals:トークンの小数点以下の桁数です。

constructor:デプロイ(ブロックチェーンネットワークに実装すること)したときに一度だけ実行される初期化処理です。クラスの概念に似ています。

初期化処理として、initialSupplyという引数をtotalSupply_変数に格納します。デプロイするときにinitialSupplyの数値は実際に与えてあげる必要があります。数値を与える場所は、次にコーディングするマイグレーションファイル内となります。

totalSupplyはトークンの総量を示す変数で、BasicToken.sol内で定義されてます。BasicToken.solで定義されているBasicTokenコントラクトは、StandardTokenによって継承されているため、使うことができます。

上記処理の後、initialSupply変数をメッセージセンダー(デプロイしたアカウント)の保持トークン量(バランス)に代入して初期化処理を終了します。

初期化処理によって、トークンの総量設定と、保持するアカウントに実際にトークンを付与する、ということを行いました。

ここで作成した「mytoken.sol」ファイルは、作成したプロジェクトフォルダmytokenの中のcontractsに配置します。

・デプロイの為のマイグレーションファイル作成

var mytoken = artifacts.require("./mytoken.sol");

module.exports = function(deployer){
  var initialSupply = 21000000e18
  deployer.deploy(mytoken, initialSupply, {
    gas: 2000000
  })
}

2_deploy_mytoken.js

initialSupplyは発行するトークンの総量となります。e18が小数点以下の桁数を示します。この場合2100万トークン発行します。

このjsファイルは、プロジェクトのmigrationsフォルダ内に配置します。

動かしてみる

・truffleのdevelopのネットワークにデプロイ

以下のコマンドでtruffleのdevelopを起動します。

truffle develop

起動時に、10個のテスト用アカウントのアドレスが表示されますので、これはメモしておいてください。最後の送金テストに使用します。

赤い部分が重要なテキストです。テキストファイルにコピーしたりして、後から確認できるようにしておきましょう。

次に、マイグレーションを行います。先ほど記述したマイグレーションファイルを実行すると、コードのコンパイル、トークンの総量を与る、デプロイ作業を行うなど、実際にネットワーク上に実装するために必要な工程をまとめて行うことができます。migrationsフォルダ内のスクリプトを実行することでデプロイを行うマイグレーションを以下のコマンドで行います。

migrate

コマンドが実行され、

mytoken: 0x[任意のアドレス]

Saving successful migration to network…

Saving artifacts…

と表示されたら、developのネットワークにトークンがデプロイされました。

上記のmytoken:のアドレスは、mytokenコントラクトのアドレスになりますので、メモしておきましょう。

※コントラクトのコード(mytoken.sol)を修正したりしたら、再度以下のコマンドでマイグレーションをし直しましょう。

migrate --reset

 

・動作確認

developのネットワークからデプロイしたトークンの名前、シンボルを取得してみます。

トークンの入力を短縮するために、以下のように、トークンのアドレスをaという変数に格納します。

a = mytoken.at(“0x[任意のアドレス]“)

aの名前を呼び出します。

a.name()

‘mytoken’

aのシンボルを呼び出します。

a.symbol()

‘MYTKN’

となるはずです。

送金テストをします。

まず、トークンの総量は、

a.totalSupply()

で取得できます。

次に、トークン発行アカウント(developのネットワークでは、0番のアカウント)の保有トークンを確認します。

a.balanceOf(“0x[develop起動時の(0)のアドレス]“)

これで、発行したすべての数量のトークンがこのアドレスに入っていることがわかると思います。

(1)のアカウントに送金してみます。

a.transfer(“0x[develop起動時の(1)のアドレス], 1000000e18“)

これで、(0)のアドレスから(1)のアドレスに100万MYTKNの送金ができました。

a.balanceOf(“0x[develop起動時の(0)のアドレス]“)

a.balanceOf(“0x[develop起動時の(1)のアドレス]“)

でそれぞれのトークン保有量を確認してみましょう。

truffleのdevelopを終了するには、

control + D

のキーで終了することができます。

 

あとがき

developのネットワークでは、gethで必要だったアカウントのアンロック等を行わなくてよいみたいで、ブロックチェーンのアカウント概念がなんとなくあいまいなこの頃です^^;

 

◆オススメの書籍

ブロックチェーンの概要、スマートコントラクトの概要から、ビットコイン、イーサリアムの違い、イーサリアムのコントラクトを実装するための開発環境構築など、ブロックチェーンアプリケーションの入門にはもってこいの書籍です。