ERC20
ERC20を簡単に説明するとEthereumで発行できるトークンの仕様を決めているものになります。詳細は下記を参照してください。
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プロトコル、公開鍵暗号などビットコインを支える技術について詳細に解説されています。また、サンプルコードを通して実際に手を動かして学べるので非常に濃い内容となっています。
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す