ネットワークへのデプロイ
ERC20準拠のトークンをTruffleからGethプライベートネット、Ropstenテストネットへデプロイします。
プライベートネットへのデプロイ
Gethを使用して、マイニングを実行します。
> miner.start(1)
null
> eth.mining
true
truffle.js
を以下のように書き換えてください。
|
module.exports = { |
|
networks: { |
|
development: { |
|
host: "localhost", |
|
port: 8545, |
|
network_id: "10" |
|
}, |
|
} |
|
}; |
上記のコードは、ネットワーク「development」を定義しています。
ローカルの8545ポートで動作しているnetwork_idが10番のネットワークを表しています。
$ truffle migrate --network development
上記のコマンドでデプロイします。
正常でデプロイが完了すると、以下のようなログが出力されます。
$ truffle migrate --network development
Using network 'development'.
Running migration: 1_initial_migration.js
Deploying Migrations...
... 0xa244887eacbe0ffff9d623a9b33ec898d05ae8e98ad9321eab71f8d1849ae51e
Migrations: 0xc6606b19bee1ebe99a49c444d2c1d3999dabfdee
Saving successful migration to network...
... 0x34e038e5138525df91ef983bcc45aca4563e5ff884bb24ad569ff8685580d951
Saving artifacts...
Running migration: 2_deploy_dapps_token.js
Deploying DappsToken...
... 0x00d2adab66b24ee0294b0dace1835f0ed796f3742802ef79da15741acb188373
DappsToken: 0xb7b98eb1cfad29a8f19ef9f4e32aa4490409482f
Saving successful migration to network...
... 0x61997403b5875340f3528463a9b24ff472ca9d4c81cccad9e9632a356021a17d
Saving artifacts...
DappsToken: 0xb7b98eb1cfad29a8f19ef9f4e32aa4490409482f
がコントラクトのアドレスとなります。
下記のコマンドでdevelopmentネットワークに接続します。
$ truffle console --network development
動作確認
truffle(development)> d = DappsToken.at("0xb7b98eb1cfad29a8f19ef9f4e32aa4490409482f")
truffle(development)> d.name()
'DappsToken'
truffle(development)> d.symbol()
'DTKN'
truffle(development)> d.balanceOf(web3.eth.accounts[0])
{ [String: '1000'] s: 1, e: 3, c: [ 1000 ] }
truffle(development)> d.balanceOf(web3.eth.accounts[1])
{ [String: '0'] s: 1, e: 0, c: [ 0 ] }
truffle(development)> d.balanceOf(web3.eth.accounts[2])
{ [String: '0'] s: 1, e: 0, c: [ 0 ] }
truffle(development)> d.transfer(web3.eth.accounts[1], 100)
{ tx: '0x94bfb6e4c8446bdd2ee16e0aa33aac46f0767f43e7e129c1ea5ed3a259052f65',
receipt:
{ blockHash: '0xb8c4bf57f251cf4322fec3f94c23eaddbdb33f0ca6017546e154f65944a32665',
blockNumber: 619,
contractAddress: null,
cumulativeGasUsed: 51519,
from: '0x81c8e5be811f32a90e6a7143ccfd6660cdd8d971',
gasUsed: 51519,
logs: [ [Object] ],
logsBloom: '0x00200000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000100000000000000000000000000000000000000000000000000002000000000010000000000000000008000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000002000000000000004000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000',
root: '0x936e27befec4794daec189579dc35d623b488bf47d76d1b37271aad7e089bd8a',
to: '0xb7b98eb1cfad29a8f19ef9f4e32aa4490409482f',
transactionHash: '0x94bfb6e4c8446bdd2ee16e0aa33aac46f0767f43e7e129c1ea5ed3a259052f65',
transactionIndex: 0 },
logs:
[ { address: '0xb7b98eb1cfad29a8f19ef9f4e32aa4490409482f',
blockNumber: 619,
transactionHash: '0x94bfb6e4c8446bdd2ee16e0aa33aac46f0767f43e7e129c1ea5ed3a259052f65',
transactionIndex: 0,
blockHash: '0xb8c4bf57f251cf4322fec3f94c23eaddbdb33f0ca6017546e154f65944a32665',
logIndex: 0,
removed: false,
event: 'Transfer',
args: [Object] } ] }
truffle(development)> d.balanceOf(web3.eth.accounts[0])
{ [String: '900'] s: 1, e: 2, c: [ 900 ] }
truffle(development)> d.balanceOf(web3.eth.accounts[1])
{ [String: '100'] s: 1, e: 2, c: [ 100 ] }
truffle(development)> d.balanceOf(web3.eth.accounts[2])
{ [String: '0'] s: 1, e: 0, c: [ 0 ] }
テストネットへのデプロイ
テストネットには様々な選択肢があります。
代表的なテストネットは、Ropsten、Kovan、Rinkebyの3種ですが、それぞれブロック生成のコンセンサスアルゴリズムが違います。
テストネット |
コンセンサスアルゴリズム |
Ropsten |
Proof of Work |
Kovan |
Proof of Authority |
Rinkeby |
Proof of Authority |
ここでは、Ropstenネットワークに対してデプロイを行っていきます。
MetaMaskのインストール
MetaMaskは、Google Chromeで利用できるイーサリアムのウォレットです。
MetaMaskを利用して、Ropstenネットワークへのデプロイ準備します。
ネットワークにコントラクトをデプロイするためには、Gasコストがかかるため、ある程度の残高が必要です。
Ropstenネットワークにコントラクトをデプロイするには、RopstenネットワークのEtherが必要です。
MetaMaskを使って、Etherを入手できるサイトで残高を増やしましょう。
MetaMaskはGoogle ChromeのExtensionとして提供されています。
Google Chromeを起動して、エクステンションを追加しましょう。
MetaMask - Chrome ウェブストア
Chromeのステータスバー右にキツネのアイコンが表示されているので、クリックしましょう。
パスワードを入力し、パスワードと復元用の秘密鍵は忘れないように保存しておきましょう。
Etherの入手(MetaMask Ether Faucetへの接続)
MetaMaskの設定が完了したので、RopstenネットワークのEtherを入手しましょう。
MetaMask Ether FaucetをChromeで開きます。
MetaMaskのアイコンをクリックし、Repsten Test Networkネットワークに変更します。
キツネアイコンの右側をクリックすると、ネットワークの切り替えが行なえます。
「request 1 ether from faucet」ボタンをクリックしましょう。
トランザクションを発行され、MetaMaskから1.000ETH取得できたことが確認できます。
Infuraへの登録
Infura - Scalable Blockchain Infrastructure
Infuraは、Gethなどのイーサリアムクライアントを利用しなくとも、テストネットやメインネットにコントラクトをデプロイできる仕組みを提供しています。
Gethでデプロイすることはもちろん可能ですが、各ネットのブロックチェーンと同期する必要があるため、時間とディスク容量を大量に消費してしまいます。
https://infura.io/signup からアカウントを作成しましょう。
登録完了後、各ネットワークのURLが取得できます。
TruffleでのRopstenネットワークの設定
truffle-hdwallet-providerをインストールしましょう。
$ npm install truffle-hdwallet-provider
TruffleのプロジェクトにRopstenネットワークを設定します。
truffle.js
にネットワーク設定を追記しましょう。
|
var HDWalletProvider = require("truffle-hdwallet-provider"); |
|
var mnemonic = $MNEMONIC; |
|
var accessToken = $INFURA_ACCESS_TOKEN; |
|
|
|
module.exports = { |
|
networks: { |
|
development: { |
|
host: "localhost", |
|
port: 8545, |
|
network_id: "10" |
|
}, |
|
ropsten: { |
|
provider: function() { |
|
return new HDWalletProvider( |
|
mnemonic, |
|
"https://ropsten.infura.io/" + accessToken |
|
); |
|
}, |
|
network_id: 3, |
|
gas: 500000 |
|
} |
|
} |
|
}; |
$MNEMONICに、MertaMaskインストール時に保存したニーモニックを入力します。
$INFURA_ACCESS_TOKENは、Infuraにユーザー登録した際にメモしたURLの「https://ropsten.infura.io/」の後ろを入力します。
Gasを明示しないとデプロイに失敗するので、migrations/2_deploy_dapps_token.js
ファイルでGasを明示しておきましょう。
|
var DappsToken = artifacts.require("./DappsToken.sol"); |
|
|
|
module.exports = function(deployer) { |
|
var initialSupply = 1000e18; |
|
deployer.deploy(DappsToken, initialSupply, { |
|
gas: 2000000 |
|
}); |
|
}; |
Ropstenネットワークへのデプロイ
$ truffle migrate --network ropsten
上記のコマンドでRopstenネットワークへデプロイできます。
コントラクトのアドレスが出力されるので、メモしておきましょう。
デプロイ完了後、MetaMaskの画面を表示し、TOKENタブから「ADD TOKEN」ボタンをクリックします。
Token Contract Address, Token Symbol, Decimals of Precisionを入力して「Add」を押して登録しましょう。
MetaMaskのTOKENタブに1000DTKNが表示されて入れば、デプロイユーザーへの付与は完了しています。
Ropstenネットワークでトークンを送信してみましょう。
$ truffle console --network ropsten
truffle(ropsten)> d = DappsToken.at("0x7d20eaf8d2238eabec6fb98fb25f017e38b5d36f")
truffle(ropsten)> d.balanceOf("0x1297Cd103A77f87419a6bd68F56ecBD04d2978A2")
{ [String: '1e+21'] s: 1, e: 21, c: [ 10000000 ] }
truffle(ropsten)> d.balanceOf("0x1931Cb91567e1Ad51215A2a7364C1E263d7CCA85")
{ [String: '0'] s: 1, e: 0, c: [ 0 ] }
truffle(ropsten)> d.transfer("0x1931Cb91567e1Ad51215A2a7364C1E263d7CCA85", 1e18)
{ tx: '0x4824274b48c424332c1b5f868fea0f98f6434fa7e1997d9324afed8dca0551ba',
receipt:
{ blockHash: '0x5314ef977950aa4623fa96ce257871350900406f9c1dfbdfeb88c64724baf2a8',
blockNumber: 3062029,
contractAddress: null,
cumulativeGasUsed: 82408,
from: '0x1297cd103a77f87419a6bd68f56ecbd04d2978a2',
gasUsed: 51839,
logs: [ [Object] ],
logsBloom: '0x00000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000020000001100010000000000000000000000000000000000000000000000000000400000000000000000000000010000000000000000000000000000000000000040000000000000000000000000002000000000000000000000000000000000000000800000000000000000000000000000008000000000000000000000000000000000000000000000000',
status: '0x1',
to: '0x7d20eaf8d2238eabec6fb98fb25f017e38b5d36f',
transactionHash: '0x4824274b48c424332c1b5f868fea0f98f6434fa7e1997d9324afed8dca0551ba',
transactionIndex: 1 },
logs:
[ { address: '0x7d20eaf8d2238eabec6fb98fb25f017e38b5d36f',
blockNumber: 3062029,
transactionHash: '0x4824274b48c424332c1b5f868fea0f98f6434fa7e1997d9324afed8dca0551ba',
transactionIndex: 1,
blockHash: '0x5314ef977950aa4623fa96ce257871350900406f9c1dfbdfeb88c64724baf2a8',
logIndex: 1,
removed: false,
event: 'Transfer',
args: [Object] } ] }
truffle(ropsten)> d.balanceOf("0x1297Cd103A77f87419a6bd68F56ecBD04d2978A2")
{ [String: '999000000000000000000'] s: 1, e: 20, c: [ 9990000 ] }
truffle(ropsten)> d.balanceOf("0x1931Cb91567e1Ad51215A2a7364C1E263d7CCA85")
{ [String: '1000000000000000000'] s: 1, e: 18, c: [ 10000 ] }
truffle(ropsten)>
MetaMask上でも、トークンの残高が変更されています。