TruffleとZeppelin Solidityを使ったERC20トークンの実装




ERC20

ERC20を簡単に説明するとEthereumで発行できるトークンの仕様を決めているものになります。詳細は下記を参照してください。

関連記事:EthereumのERC20トークンとは?

Truffle

TruffleはEtherreumを開発したConsenSysが開発しているフレームワークでコントラクトのコンパイル、テストの実行、ネットワークへのデプロイを簡単に実行できます。インストールはnpmから簡単にできます。

$ npm install -g truffle

Zeppelin Solidity

EthereumでのスマートコントラクトをSolidityで安全に実装できるライブラリでこれもnpmから簡単にインストールできます。

$ npm install --save zeppelin-solidity@1.4.0

開発準備

まずTruffleでテンプレートを作成し手からzeppelin-solidityをインストールします。Truffleではcontracts、migrations、test、truffle-config.js、truffle.jsが作成されます。

$ mkdir kzm_coin
$ truffle init
$ npm install  zeppelin-solidity
$ tree
.
├── contracts
│   └── Migrations.sol
├── migrations
│   └── 1_initial_migration.js
├── package.json
├── test
├── truffle-config.js
└── truffle.js

ERC20トークンの実装

ERC20トークンの実装には8個のメソッドと2個のイベントを実装しないといけませんがzeppelin-solidityを使うと下記だけでも実現できます。

ERC20トークンで実装すべきものに関しては下記リンクを参照してください。

関連記事:ERC20トークンで実装すべきメソッドとイベントの解説

pragma solidity ^0.4.18;
import "zeppelin-solidity/contracts/token/StandardToken.sol";

contract Kzm is StandardToken {
  string public name = "KozumaToken";
  string public symbol = "KZM";
  uint public decimals = 18;
  uint public INITIAL_SUPPLY = 10000 * (10 ** decimals);

  function Kzm() public {
    totalSupply = INITIAL_SUPPLY;
    balances[msg.sender] = INITIAL_SUPPLY;
  }
}

他の実装すべきものはzeppelin-solidity側で実装したものを継承しているのでたったこれだけで済みます。これだったらソースコードの解説いらないくらい簡単ですね。

コントラクトのコンパイル

実装したコントラクトは下記コマンド一発でimportしているファイルもコンパイルしてくれます。

truffle compile

結果はbuildディレクトリ配下に出力されます。コンパイルはこれで完了です。

$ tree build
build
└── contracts
    ├── BasicToken.json
    ├── ERC20.json
    ├── ERC20Basic.json
    ├── Kzm.json
    ├── Migrations.json
    ├── SafeMath.json
    └── StandardToken.json

マイグレーションファイルの作成

migrationディレクトリの中に2_deploy_kzm_token.jsでファイルを下記を実装します。

ファイルには命名規則があり”数字_文字列.js”としなくてはなりません。数字はマイグレーションの順番を決めるもになります。小さ方が先にデプロイされるので数字には気をつけてください。

const Kzm = artifacts.require('Kzm')

module.exports = (deployer) => {
  deployer.deploy(Kzm)
}

コントラクトのデプロイ

コントラクトデプロイはローカル環境のテストネットに対して行います。Truffleを使うとこのテストネットも下記コマンドで簡単に立ち上げることができます。

テストネットの起動と同時にインタラクティブに操作できるコソールにも接続してくれて、アドレスも10個作ってくれます。

$ truffle develop
Truffle Develop started at http://localhost:9545/

Accounts:
(0) 0x627306090abab3a6e1400e9345bc60c78a8bef57
(1) 0xf17f52151ebef6c7334fad080c5704d77216b732
(2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef
(3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544
(4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2
(5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e
(6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5
(7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5
(8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc
(9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de

Mnemonic: candy maple cake sugar pudding cream honey rich smooth crumble sweet treat

truffle(develop)>

デプロイは下記コマンドです。これで実装したERC20トークンをテストネットワークにデプロイするのが完了です。

truffle(develop)> migrate
Compiling ./contracts/Kzm.sol...
Compiling zeppelin-solidity/contracts/math/SafeMath.sol...
Compiling zeppelin-solidity/contracts/token/BasicToken.sol...
Compiling zeppelin-solidity/contracts/token/ERC20.sol...
Compiling zeppelin-solidity/contracts/token/ERC20Basic.sol...
Compiling zeppelin-solidity/contracts/token/StandardToken.sol...
Writing artifacts to ./build/contracts

Using network 'develop'.

Running migration: 1_initial_migration.js
  Replacing Migrations...
  ... 0xbd0ab6cc9ff5bcf181f6c75b8abd92c34b4ee11cad1057bcd501966d7db85f09
  Migrations: 0x8cdaf0cd259887258bc13a92c0a6da92698644c0
Saving successful migration to network...
  ... 0xd7bc86d31bee32fa3988f1c1eabce403a1b5d570340a3a9cdba53a472ee8c956
Saving artifacts...
Running migration: 2_deploy_kzm_token.js
  Replacing Kzm...
  ... 0x01f6b6c97156905d51537c3394322663ec014312ff49df4fc498a3addd174611
  Kzm: 0x345ca3e014aaf5dca488057592ee47305d9b3e10
Saving successful migration to network...
  ... 0xf36163615f41ef7ed8f4a8f192149a0bf633fe1a2398ce001bf44c43dc7bdda0
Saving artifacts...

初期のトークンは10個のアドレスのうち1個目に送られているので確認すると確かにありますね。デプロイがちゃんとできていることが確認できます。

truffle(develop)> kzm.balanceOf(web3.eth.accounts[0])
{ [String: '1e+22'] s: 1, e: 22, c: [ 100000000 ] }

次は試しに送金をしてみます。

truffle(develop)> kzm.transfer(web3.eth.accounts[1], 1000e18)
{ tx: '0xacb3467e2a2ddbdd6204365c6d2a4072204ab2f89850d808116038d0f91c03a5',
  receipt:
   { transactionHash: '0xacb3467e2a2ddbdd6204365c6d2a4072204ab2f89850d808116038d0f91c03a5',
     transactionIndex: 0,
     blockHash: '0x026708c86436e44c9dd95571c92f4e0c48f1f1c94cda1ff55873c33deec94574',
     blockNumber: 5,
     gasUsed: 51925,
     cumulativeGasUsed: 51925,
     contractAddress: null,
     logs: [ [Object] ] },
  logs:
   [ { logIndex: 0,
       transactionIndex: 0,
       transactionHash: '0xacb3467e2a2ddbdd6204365c6d2a4072204ab2f89850d808116038d0f91c03a5',
       blockHash: '0x026708c86436e44c9dd95571c92f4e0c48f1f1c94cda1ff55873c33deec94574',
       blockNumber: 5,
       address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
       type: 'mined',
       event: 'Transfer',
       args: [Object] } ] }
truffle(develop)> kzm.balanceOf(web3.eth.accounts[0])
{ [String: '9e+21'] s: 1, e: 21, c: [ 90000000 ] }
truffle(develop)> kzm.balanceOf(web3.eth.accounts[1])
{ [String: '1e+21'] s: 1, e: 21, c: [ 10000000 ] }

ちゃんと指定した分が送金できているのが確認できます。これのすごいところは自分ではtransfer()メソッドを実装していないのに送れていることですね。これはzeppelin-solidityが実装したものを継承して使っているからです。

このようにTruffleとzeppelin-solidityを使うと開発からトークンの送金まで簡単に実装できます。オリジナルのERC20トークンを作りたいときはぜひ試してみてください。

関連記事

おすすめ書籍

Ethereumを使ったDApps開発を学びたいなら今だとこの1冊が1番良いです!開発環境の構築から使うべきツール、フレームワーク、実装方法・注意点まで網羅的に解説されている書籍なのでおすすめです。出版も2018年1月ということでかなり新しい本で、DMM Bitcoinを作っているネクストカレンシー所属の方が書いているので信頼できます。

ビットコインとブロックチェーンの詳細をしっかりと学びたい方にはこちらの書籍が非常におすすめです。ウォレットの仕組み、楕円曲線暗号、P2Pプロトコル、公開鍵暗号などビットコインを支える技術について詳細に解説されています。また、サンプルコードを通して実際に手を動かして学べるので非常に濃い内容となっています。

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です