Chapter 8-3: ネットワークへのデプロイ

ネットワークへのデプロイ

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"
},
}
};
view raw truffle.js hosted with ❤ by GitHub

上記のコードは、ネットワーク「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 FaucetChromeで開きます。

MetaMaskのアイコンをクリックし、Repsten Test Networkネットワークに変更します。

キツネアイコンの右側をクリックすると、ネットワークの切り替えが行なえます。

f:id:akifumi-fukaya:20180417212334p:plain

「request 1 ether from faucet」ボタンをクリックしましょう。

トランザクションを発行され、MetaMaskから1.000ETH取得できたことが確認できます。

f:id:akifumi-fukaya:20180417212727p:plain

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
}
}
};
view raw truffle.js hosted with ❤ by GitHub

$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上でも、トークンの残高が変更されています。