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

### Infura.ioを利用する

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

### Infura.ioに登録する

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

![](/files/-LQBNAcBsp9S3SlSePd8)

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

![](/files/-LQBNy0lXYd5yTtrVoOz)

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

![確認画面](/files/-LQBO_A2Mj7epO4fDl8E)

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

![確認メール](/files/-LQBOKEty1TWtFhmMB-9)

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

![](/files/-LQBPcI-Z5ZYCUpAutlP)

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

![](/files/-LQBPyZNNDMMzyGSZE6D)

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

![](/files/-LQBQGiWD6H9hNbrwYWI)

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

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

{% code title="ターミナル" %}

```
 npm install --save truffle-hdwallet-provider@0.0.3 
```

{% endcode %}

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

新しく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です。

{% code title="ターミナル" %}

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

{% endcode %}

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

{% code title="ターミナル" %}

```
(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.
```

{% endcode %}

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

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

![](/files/-LQCjsp1UVzFt3JvV13U)

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

![](/files/-LQCkRLNueSNI94DtkRV)

### RemixでInboxを実行してみる

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

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

![](/files/-LQClByy4cHDcFci29iP)

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

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

![ここのAt Address部分](/files/-LQCm85qpqD1OvoE1JNj)

![](/files/-LQCmYGGn-sZoAxsLQ72)

### callとmethodの違い

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

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

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

![](/files/-LQCnbL6cgw2LFXk1GRK)

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

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

![](/files/-LQCoVYHkLkSff5ZSRyu)

![](/files/-LQCoSqqxYuvmaonYWP8)

![](/files/-LQCod_hnKy8OtvU9VYI)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://24karamawariken.gitbook.io/ethereum-solidity/solidity-programming/ttakontorakutawotesutonettowkudesuru.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
