作ったコントラクタをテストネットワークで利用する

Infura.ioを利用する

ethereumの開発を進めようとするとローカルにノードを立てなければいけなかったり、結構容量が必要だったりします。そこで、infura.ioでは、ethereumのノードのホスティングサービスとなっています。様々なテストネットワークにも対応しているため便利です。

Infura.ioに登録する

https://infura.io/にアクセスして「GET STARTED FOR FREE」を押して進めましょう。

登録時には、名前、メルアド、パスワードが必要です。

すると、下記のような画面になり登録したメールアドレスに確認用のメールが送信されます。

届いた確認メールの「CONFIRM EMAIL ADDRESS」をクリックして登録を進めましょう。

チュートリアルが始まりますが、「SKIP」で飛ばしましょう。下記のようなトップになったあと、「CREATE NEW PROJECT」をクリックしてプロジェクトを新規作成します。

infura.ioのテストネットワークに繋ぐためのプロジェクトのため「RINKEBY API」の名前にしましょう。

プロジェクトが作成されましたら、次に繋げるネットワークの種類を変更します。「ENDPOINT」のネットワークを「RINKEBY」に設定するとエンドポイントも少し変更されます。rinkeby.infura~~のエンドポイントの右にある青いアイコンをクリックしてコピーしましょう。

これでテストネットワークをローカルの容量を食わずに開発で利用することができます。

ハードウォレットのプラグインをインストールする

ターミナル
 npm install --save truffle-hdwallet-provider@0.0.3 

作成したコントラクタをテストネットワークにてデプロイするためのプログラムを作成する

新しくdeploy.jsを作成して下記のコードを書いていきましょう。重要なポイントは、providerを作成するときに、まずは、MetaMaskで12個のキーワードがありましたね。それとinfura.ioでコピーしたrinkebyのネットワークに繋げるためのAPI KEYを入れましょう。

const HDWalletProvider = require('truffle-hdwallet-provider');
const Web3 = require('web3');
const {interface, bytecode} = require('./compile');

const provider = new HDWalletProvider(
  '12個キーワード',
  'https://rinkeby.infura.io/v3/あなたのコピーしたリンク'
);

const web3 = new Web3(provider);

const deploy = async () => {
  const accounts = await web3.eth.getAccounts();
  console.log('Attempting to deploy from account ', accounts[0]);
  const result = await new web3.eth.Contract(JSON.parse(interface))
  .deploy({ data: bytecode, arguments: ['Hi there!'] })
  .send({ from: accounts[0],gas:'1000000' });

  console.log('Contract deployed to ', result.options.address);
};
deploy();

これをnode deploy.jsで実行することで、MetaMaskのアカウントが取得することができたらOKです。

ターミナル
* node deploy.js
Attempting to deploy from account  MetaMaskのアドレス
Contract deployed to コントラクタのアドレス

下記のようなエラー表記が出たら、gasが口座から引けない状態のため、「MetaMask rinkebyのネットワークでetherを取得する」にでetherを所持したアドレスで行いましょう。

ターミナル
(node:80230) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: insufficient funds for gas * price + value
(node:80230) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will
terminate the Node.js process with a non-zero exit code.

デプロイされたコントラクタの内容を確認する

deploy.jsにてコントラクタが作成されてデプロイされました。テストネットワークを見ることでコントラクタが正常に発行されたかを見ることができます。https://rinkeby.etherscan.io/にアクセスしましょう。

このページで先ほどの結果で出たコントラクタのアドレスをページの右上に貼り付けましょう。すると、コントラクタの内容が表示されて正常に発行されたこととトランザクションの内容が表示されます。

RemixでInboxを実行してみる

ローカルでdeployまでを行いました。内容としてテストも正常に通したため今度は、Remixで実行してみたいと思います。Remixにアクセスしたあと、Environmentの設定を「Injected Web3」に設定してみましょう。するとMetaMaskのアドレス内容がしたのAccountに表示されていることがわかります。

これは、Injected Web3がMetaMask から供給される Web3 のアカウントを使用するという設定です。

作成されたコントラクタのアドレスを入れる

Inboxの下にある 「At Address」にローカルで表示させたコントラクトのアドレスをコピペし、At Addressボタンを押すと、そのコントラクタの内容にフォーカスすることができます。

callとmethodの違い

ここで、callとmethodの違いがはっきりわかります。今までVMの中で閉じられていた世界では、messageボタンもsetMessageボタンも押すとすぐに反応しました。しかし、今回はrinkebyネットワークに存在しているコントラクタにアクセスして更新するため行いが大きく異なります。

messageボタンはcallするだけなのですぐにHi thereが表示されます。

しかし、setMessageボタンに"hey"などの文字列を入れて行うと新しいウィンドウが表示されてきます。

コントラクトの中身を変えることで新しくトランザクションが発生しそのときにgasが必要となるための確認が必要となります。確認ボタンを押しましょう。

確認ボタンを押したあと、すぐにmessageボタンを押してcallしてみてください。まだ「Hi there」のままだと思います。これがネットワークでトランザクションを新しく発行している処理です。MetaMaskのポップが表示されたことでトランザクションが正常にできたことがわかりますので、その後messageをcallしてみましょう。すると「hey」に変更されているはずです。

Last updated