EthereumのERC20トークンを発行してみた!

イーサリアムへの理解をより深めるためにERC20トークンを発行してみました。ERC20トークンとはEthereumでトークンを発行する際の規格のことで、ERC20に準拠したトークンを発行することで、異なるトークン同士のやりとりの簡略化を実現しました。また、ERC20対応のウォレットを活用することでトークンの一括管理が可能になりました。ERCはEthereum RFCの略で、ERC20は20番目の仕様を意味します。代表的なERC20トークンには0x、Augur、OmiseGOなどがあります。
それでは早速作っていきましょう。
ERC20トークンを作成するための要件は定義されており、下記の6つのメソッドと2つのイベントを実装することでトークンを発行することができます。
function totalSupply() constant returns (uint totalSupply);function balanceOf(address _owner) constant returns (uint balance);function transfer(address _to, uint _value) returns (bool success);function transferFrom(address _from, address _to, uint _value) returns (bool success);function approve(address _spender, uint _value) returns (bool success);function allowance(address _owner, address _spender) constant returns (uint remaining);event Transfer(address indexed _from, address indexed _to, uint _value);event Approval(address indexed _owner, address indexed _spender, uint _value);
Truffleフレームワークのインストール
今回はTruffleフレームワークを活用してトークンの発行を行なっていきます。Truffle(トリュフ)とはEthereumのスマートコントラクト開発フレームワークのことで、コンパイルやリンク、デプロイ、バイナリ管理などの機能を持っています。
まずはじめにTruffleのインストールを行います。
$ npm install -g truffleプロジェクトのディレクトリの作成を行います。
$ mkdir project(お好きな名前に変更してください)
$ cd projectTruffleプロジェクトの新規作成
$ truffle initこれにより下記フォルダ構成が作成されます。
contracts/ スマートコントラクトのディレクトリmigrations/ マイグレーションファイルのディレクトリtest/ テストファイルのディレクトリtruffle.js: Truffleの設定ファイルのディレクトリtruffle-config.js: Truffleの設定ファイルのディレクトリ
OpenZeppelinのインストール
OpenZeppelinとはEthereumのスマートコントラクト開発を補助するためのライブラリのことです。OpenZeppelinを活用することでスクラッチで開発するよりも安全なコントラクトを短時間で開発することができます。
先ほど作成したプロジェクトフォルダ内で下記コマンドを実行します。
$ npm init -f
$ npm install zeppelin-solidityコントラクトの作成
いよいよトークンを作成します。contractsフォルダの中にTestToken.solを作成し、以下のコードを記述します。また、スマートコントラクトの記述にはSolidityというプログラミング言語が使われています。
pragma solidity ^0.4.18; //コンパイルに使用するsolidityのバージョンを指定//OpenZeppelin ライブラリから、ERC20 の実装クラスである StandardToken.sol をインポート
import "zeppelin-solidity/contracts/token/ERC20/StandardToken.sol";// StandardTokenの継承
contract TestToken is StandardToken { // 状態変数に値を代入
string public name = “TestToken"; //トークンの名称
string public symbol = “TTKN"; //トークンの単位表記
uint public decimals = 18; // 小数点の桁数 //コントラクトが作成された際に呼ばれるコンストラクタの定義
// totalSupply_ (トークンの総発行量)にinitialSupply(トークンの発行数)を代入。
// 発行したトークンをmsg.sender のアドレス(口座)に入れる。msg.senderはトークン発行者のEthereumアドレス。
function TestToken(uint initialSupply) public {
totalSupply_ = initialSupply;
balances[msg.sender] = initialSupply;
}}
マイグレーションファイルの作成
migrationフォルダの中に、2_deploy_test_token.jsを作成し下記のコードを記述します。
const TestToken = artifacts.require(‘./TestToken.sol')module.exports = function(deployer) => { const initialSupply = 1000 //トークンの発行
deployer.deploy(TestToken, initialSupply)}
テストコードの作成
testフォルダの中に、TestToken.jsを作成し下記のコードを記述します。
var TestToken = artifacts.require(“./TestToken.sol");// テストの宣言
contract(‘TestToken', function(accounts) {// 最初のアカウントに1000 TestTokenが保持されていることをテスト
it("should put 1000 TestToken in the first account", function(){
return TestToken.deployed().then(function(instance){
return instance.balanceOf.call(accounts[0]);
}).then(function(balance){
assert.equal(balance.valueOf(), 1000, "1000 wasn't in the first account");
});
})
})
コントラクトのデプロイ
truffle developコマンドでtruffleコンソールに入りテストを実行します。
$ truffle develop
truffle(develop)> test無事テストを通過したらmigrationを実行しdebelopネットワークにデプロイします。
truffle(develop)> migrate
truffle(develop)> TestToken = TestToken.at(TestToken.address)デプロイされたコントラクトの確認をしてみましょう。
// 名前の確認
truffle(develop)> testToken.name()
’TestToken’// symbolの確認
truffle(develop)> testToken.symbol()
’TTKN’// 総発行量の確認
truffle(develop)> testToken.totalSupply()
{ [String: ‘1000’] s: 1, e: 3, c: [1000] }
最後にアカウント別のトークン発行量を確認し、トークンの送金をしてみましょう。
// 一番目のアカウントはトークンの発行者なので1000トークン保持しているtruffle(develop)> testToken.balanceOf(web3.eth.accounts[0])
{ [String: ‘1000’] s: 1, e: 3, c: [1000] }// 一番目のアカウントはトークンを保持していない
truffle(develop)> testToken.balanceOf(web3.eth.accounts[0])
{ [String: ‘0’] s: 1, e: 0, c: [0] }// トークンの送金
truffle(develop)> testToken.transfer(web3.eth.accounts[1], 100)
送金完了後に各アカウントを確認するとトークンの保持数が変更していることが確認できます。
終わりに
ERC20トークンの発行がここまで簡単にできることに正直驚きでした。
多くのエンジニアがイーサリアムを含むブロックチェーンプロダクトの開発にとっつきにくさを感じているようですが、フレームワークやライブラリを上手に活用することでストレスなく一歩を踏み出せるような気がしています。ブロックチェーンに対する本質的な理解も当然重要ですが、とりあえず動かしてみることもやっぱり重要だなと実感した次第です。
ツイッターでは日々暗号通貨やブロックチェーンの発信を行っています。よろしければフォローをお待ちしてます!
