Ethereumのブロックチェーンには大きく分けて「プライベートネットワーク」「テストネットワーク」「メインネットワーク」の3つの環境があります。今回は、テストネットワークのひとつであるRopstenテストネットワークにコントラクトをデプロイし、web3.jsを利用してブラウザからそのコントラクトに対してアクセスしてみます。
※Truffle v5 によるデプロイは設定ファイル等の仕様が違います。関連ページをご覧下さい。
関連ページ
Truffle v5でINFURAのROPSTEN Testnetにコントラクトをデプロイする
開発環境
macOS High Sierra
Truffle v4.1.8
Ropsten用のアカウントおよびEtherの管理はウォレットであるMetaMaskを利用します。テストネットワーク用のEtherはMetaMask Ether Faucetからもらうことが可能です。
コントラクトのデプロイは、EthereumノードのホスティングサービスであるINFURAを利用します。INFURAに登録して取得したAPIキーを利用してコントラクトをデプロイすることができます。つまりINFURAを利用すれば、GethなどのEthereumノードをダウンロードすることなくテストネットワークやメインネットに接続することが可能となります。
デプロイ自体の作業はフレームワークであるTruffleを利用します。
以下箇条書きによる説明です。
1 Ropstenテストネットワークを利用する。
2 RopstenのアカウントとEtherの管理はMetaMaskで行う。
3 EhterはMetaMask Ether Faucetからもらう。
4 INFURAに登録してAPIキーを取得する。
5 コントラクトのデプロイをINFURAに対して行う。
6 デプロイの作業はTruffleフレームワークを利用する。
MetaMaskとRopstenの準備
まずMetaMaskをインストールし、Ropsten上で必要となるアカウント(アドレス)とEtherを取得します。MetaMaskのインストール方法は割愛します。
Ropstenテストネットワーク内で利用するEtherは、MetaMask Ether Faucetからもらいます。このEtherはコントラクトをデプロイする際のGasとして必要となります。MetaMaskでRopstenテストネットワークを選択したら、下記リンク先の「request 1 ether from faucet」をクリックします。MetaMask上でEtherが送られたことが確認できます。
次にRopstenテストネットワークにコントラクトをデプロイするために利用する、EthereumノードのホスティングサービスであるINFURAのAPIキーを取得します。下記サイトの登録フォームで登録完了すると「API key」が表示されます。
Truffleでのコントラクト作成とデプロイ
Truffleを利用してコントラクトをRopstenテストネットワークにデプロイします。Truffleについては下記の関連ページもご覧下さい。
「HelloProject」ディレクトリを作成し、初期化します。
1 2 3 |
mkdir HelloProject cd HelloProject truffle init |
初期化によって生成されたcontractsディレクトリ内にHelloWorld.solを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
pragma solidity ^0.4.23; contract HelloWorld{ string public word; constructor(string _word) public{ word = _word; } function say() constant public returns(string){ return word; } } |
migrationsディレクトリに下記のマイグレーションファイル(2_deploy_contracts.js)を作成します。コントラクト生成時のコンストラクタの引数として”こんにちわ”を渡しています。
1 2 3 4 5 6 |
const HelloWorld = artifacts.require("HelloWorld"); module.exports = function(deployer) { const word = "こんにちわ"; deployer.deploy(HelloWorld, word,{gas:2000000}); }; |
5行目
適切な「Gas Limit」を明示的に設定しておくと、マイグレーション時にGasによるエラーが発生しません。ここでは設定するのは個々のコントラクトためのGas Limitです。
次にtruffle.jsにRopstenテストネットワークの設定をします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
const HDWalletProvider = require("truffle-hdwallet-provider"); const mnemonic = "MetaMaskのニーモニック(12個の英単語)"; const accessToken = "INFURAのAPIキー"; module.exports = { networks: { ropsten: { provider: function() { return new HDWalletProvider( mnemonic, "https://ropsten.infura.io/" + accessToken ); }, network_id: 3, gas: 500000 } } }; |
1行目
INFURAはユーザーに対してセキュリティの関係上、トランザクションの署名に必要となる秘密鍵を提供していません。しかし、このHDWalletProviderを利用することによって署名を行うことができます。
デプロイする前にHDWalletProviderもnpmでインストールしておきます。
1 |
npm install truffle-hdwallet-provider |
コンパイルし、Ropstenテストネットワークにマイグレーション(デプロイ)します。
1 2 |
truffle compile truffle migrate --network ropsten |
成功すると下記のようなメッセージが表示されます。HelloWorld: 〜の部分がコントラクトのアドレスとなり、RopstenのEtherScanで確認することができます。
https://ropsten.etherscan.io/address/0x0423fcb70d7ada78cb532bd3446f6c5e133b425d
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Using network 'ropsten'. Running migration: 1_initial_migration.js Deploying Migrations... ... 0xc34f5594ac2027374cd786b05ed81a0ea327b6c5e561cb4f6f0d5449afc3b7d5 Migrations: 0xa7917d2d0d30a3d6c117bff5e6bd41f4f7e2d65e Saving successful migration to network... ... 0xb14a757ba78350f3bf1a274c920236d71b4b6586bad5821a4978d2a127306cd5 Saving artifacts... Running migration: 2_deploy_contracts.js Deploying HelloWorld... ... 0x92fd0a993b6cae2076be44794723ac598d9c22dd7072e8e8375c3352bb258e15 HelloWorld: 0x0423fcb70d7ada78cb532bd3446f6c5e133b425d Saving successful migration to network... ... 0x3fd21821607f1523e6420d91796a49d7c5c7760cee1d1ef8fd8f605bd40f0d36 Saving artifacts... |
web3.jsでコントラクトにアクセスする
web3.jsについての説明は、下記の関連ページをご覧下さい。
web3.jsでブラウザからコントラクトにアクセスする[Ganache]
Ropstenのコンソールを起動します。
1 |
truffle console --network ropsten |
デプロイしたコントラクト(今回はHelloWorld.sol)のABI情報については、下記コマンドで取得することができます。
1 |
truffle(ropsten)>JSON.stringify(HelloWorld.abi) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script src="https://cdn.jsdelivr.net/gh/ethereum/web3.js/dist/web3.min.js"></script> <script type="text/javascript"> const web3 = new Web3(new Web3.providers.HttpProvider("https://ropsten.infura.io/APIキー")); //コントラクトのアドレス const address = "0x0423fcb70d7ada78cb532bd3446f6c5e133b425d"; //ABI情報 const abi =[{"constant":true,"inputs":[],"name":"word","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_word","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"constant":true,"inputs":[],"name":"say","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]; //コントラクトのインスタンスを生成 const contract = web3.eth.contract(abi).at(address); //コントラクトのsay関数を呼び出す const word = contract.say.call(); console.log("word:",word); //"こんにちわ" </script> </head> <body> </body> </html> |
8行目
APIキー取得時にメールでも届きますが「https://ropsten.infura.io/〜」の〜の部分にはAPIキーを設定して下さい。
13行目
JSON.stringify(HelloWorld.abi)コマンドで表示された文字列を設定します。
参照ページ
TRUFFLE
USING INFURA (OR A CUSTOM PROVIDER)