オリジナル通貨
Ethereumを使うとオリジナルの通貨が作れます。以前記事で作ったKZM(KozumaToken)をEthereumのテストネットワークであるRopsteにデプロイしてみたいと思います。
ERC20がわからないという方は下記記事をお読みください。
参考記事:EthereumのERC20トークンとは?
トークン作成
前回はzeppelin–solidityのバージョン1.4.0を使っていましたが今回は最新版の1.7.0で再度作り直してみたいと思います。
Truffleのインストール
$ npm install -g truffle
雛形作成
Truffleを使うことでトークンの雛形を簡単に作成できます。zeppelin-solidity@1.7.0とtruffle-hdwallet-provider@0.1.0をnpmでインストールしておきます。
$ mkdir token & cd token $ truffle init $ tree . ├── contracts │ └── Migrations.sol ├── migrations │ └── 1_initial_migration.js ├── test ├── truffle-config.js └── truffle.js $ npm init -f $ npm install --save zeppelin-solidity@1.7.0 truffle-hdwallet-provider@0.1.0
トークンを実装
contracts配下にKzm.solを作成します。zeppelin–solidityのv1.7.0ではStandardToken.solの階層が変わっていることと、totalSupplyがtotalSupply_になっていることに注意してください。自分はv1.4.0のソースコードとごちゃまぜに考えてしまい、ハマってしまいました。
pragma solidity ^0.4.18; import "zeppelin-solidity/contracts/token/ERC20/StandardToken.sol"; contract Kzm is StandardToken { string public name = "KozumaToken"; string public symbol = "KZM"; uint public decimals = 18; function Kzm(uint initialSupply) public { totalSupply_ = initialSupply; balances[msg.sender] = initialSupply; } }
ソースコードがコンパイルできたら問題ないです。
$ truffle compile Compiling ./contracts/Kzm.sol... Compiling ./contracts/Migrations.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... Compiling zeppelin-solidity/contracts/token/ERC20/StandardToken.sol... Writing artifacts to ./build/contracts
マイグレーションファイル
migrations配下に2_deploy_kzm_token.jsを作成します。
const Kzm = artifacts.require('./kzm.sol') module.exports = (deployer) => { let initialSupply = 50000e18 deployer.deploy(Kzm, initialSupply) }
デプロイ設定
truffle.jsを下記に修正します。ROPSTEN_MNEMONICはMetaMaskでアカウントを作った時のものを使用します。INFURA_ACCESS_TOKENはこちらで作成したものを指定してください。HDWalletProviderはちゃんと理解していないので今後追記します。
const HDWalletProvider = require("truffle-hdwallet-provider"); const mnemonic = process.env.ROPSTEN_MNEMONIC; const accessToken = process.env.INFURA_ACCESS_TOKEN; module.exports = { // See <http://truffleframework.com/docs/advanced/configuration> // to customize your Truffle configuration! networks: { ropsten: { provider: function() { return new HDWalletProvider( mnemonic, 'https://ropsten.infura.io/' + accessToken ); }, network_id: 3, gas: 4600000 } } };
これで準備は完了です。
Ropstenへのデプロイ
gasの設定が悪いのかデプロイが失敗してます。この時のgasは500000を設定していました。
$ truffle compile Compiling ./contracts/Kzm.sol... Compiling ./contracts/Migrations.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... Compiling zeppelin-solidity/contracts/token/ERC20/StandardToken.sol... Writing artifacts to ./build/contracts $ truffle migrate --network ropsten Using network 'ropsten'. Running migration: 1_initial_migration.js Deploying Migrations... ... 0x6a11fe7f9d3878fde3933a877aa1e26e591dc53de0fba2321d51b79495dc3bd1 Migrations: 0xd29416206f197f39512d213079ee1aef43d1ec82 Saving successful migration to network... ... 0xa079904dc4b78073f62369b73e3d021176a68d61b6550267f9db2b18a84fc87f Saving artifacts... Running migration: 2_deploy_kzm_token.js Deploying Kzm... ... 0x669c4f09928e0461269c1806cbcc7d50a0cb41141fa609981b7913cce2f8835d Error encountered, bailing. Network state unknown. Review successful transactions manually. Error: The contract code couldn't be stored, please check your gas amount. at Object.callback (/Users/.nvm/versions/node/v6.10.2/lib/node_modules/truffle/build/cli.bundled.js:329221:46) at /Users/.nvm/versions/node/v6.10.2/lib/node_modules/truffle/build/cli.bundled.js:39618:25 at /Users/.nvm/versions/node/v6.10.2/lib/node_modules/truffle/build/cli.bundled.js:331159:9 at /Users/.nvm/versions/node/v6.10.2/lib/node_modules/truffle/build/cli.bundled.js:175492:11 at /Users/.nvm/versions/node/v6.10.2/lib/node_modules/truffle/build/cli.bundled.js:314196:9 at Web3ProviderEngine._inspectResponseForNewBlock (/Users/private_work/erc20/my_token/node_modules/web3-provider-engine/index.js:231:12) at /Users/private_work/erc20/my_token/node_modules/web3-provider-engine/index.js:131:14 at /Users/private_work/erc20/my_token/node_modules/async/dist/async.js:473:16 at replenish (/Users/private_work/erc20/my_token/node_modules/async/dist/async.js:993:25) at iterateeCallback (/Users/private_work/erc20/my_token/node_modules/async/dist/async.js:983:17)
GitHubのissueで4600000にするとうまくいったよというのを見つけたので試してみたらうまくいきました。
$ truffle migrate --network ropsten Using network 'ropsten'. Running migration: 2_deploy_kzm_token.js Deploying Kzm... ... 0xa9fdfa79fcfb866631afd5ce94c479a8eb56a63f24d6c658ebe7f12279bf4d4d Kzm: 0x75830610cd1c532c408ab68a4f6dbee2856a0e29 Saving successful migration to network... ... 0x68f4df0b6598feb03d7afcf1f1082eec7f5e44bfbecc0f024a813166addd1b8d Saving artifacts...
トークンのコントラクトアドレスは0x75830610cd1c532c408ab68a4f6dbee2856a0e29になります。RopsteのEthescanで確認できます。ページはこちら。
MetaMasckへの反映
次はRopstenに作成したトークンをMetaMaskに反映させます。反映方法は簡単でTOKENSのADD TOKENにコントラクトアドレスを入力するだけです。

これで自分のアカウントにオリジナルのトークンが追加されます。

まとめ
ローカル環境にデプロイするのもテストネットにデプロイするのもそんなに手間が変わらないことが分かっていただけたかと思います。次は本番環境にデプロイする記事を書きたいと思います。
おすすめ書籍
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
コメントを残す