RemixとMetaMaskを使って、Smart Contractの開発環境を整えてみた

EthereumのSmart Contractを開発するのに使える開発環境って、色々と用意されてますよね。
truffleとか、Remixなどなど...

Solidityの学習を始めたての頃は、atomにプラグイン入れて、ローカル環境でプライベートネット立ち上げて、デプロイして...って流れで十分でした。（←今までRemixはJavaScript VMしか使ったことがない）

しかし、Solidityにも慣れたし、そろそろtest netにデプロイして、コントラクトを動かしてみたい！となったときに思いました。

「コンソールでコントラクトの実行って面倒だな〜何とかできないかな〜
...あれ？そもそもtest netへのデプロイってどうやるんだっけ？」

ってことで、今回はRemixとMetaMaskを使って、test net(Ropsten)へコントラクトをデプロイして、実際に動かしてみるところまでやってみました。

##1.MetaMaskのインストールする

Chromeブラウザのプラグインとして動くEthereumのウォレットであるMetaMaskをインストールします。
色々なサイトでインストールの方法は解説されていますので、そちらをご覧ください（↓例えば以下のページ）
https://business-infinity.jp/metamask-how-to-use/

※途中で出てくるSEED情報を晒しているページもありますが、晒さない方がよいかと思います...


##2.MetaMaskにetherを入金する

以下のサイトで「request 1 ether from faucet」をクリックすると、簡単にMetaMaskに入金できます。
https://faucet.metamask.io/

これで、MetaMask側の準備は完了です。

##3. Remixをインストールする
クラウド環境でも使えますが、今回はローカルにクローンして、使います。
https://github.com/ethereum/browser-solidity

1.　Set up

```
git clone https://github.com/ethereum/browser-solidity
cd browser-solidity
npm install
```

ちなみに...自分が試したときは、npm installのさいに、以下のようなエラーが出ました。

```
Error: Cannot find module './helpers/traceHelper' from '/Users/user1/Desktop/workspace/browser-solidity/node_modules/remix-core/node_modules/remix-lib'
```
[Issuesの922](https://github.com/ethereum/browser-solidity/issues/922)を参考に、一度node_modulesを削除し、npm install makeを行い、もう一度npm installを実行すると、うまくいきました。

2.　Remixを起動する

```
npm start
```

localhost:8080にアクセスすると、Remixが表示されます。

<img width="1438" alt="remix_top.png" src="https://qiita-image-store.s3.amazonaws.com/0/129706/808ad339-973b-0e44-b803-0663b8ea18db.png">


右側のRunのタブでEnvironmentが「injected Web3」になっていることを確認する。
<img width="401" alt="remix_run.png" src="https://qiita-image-store.s3.amazonaws.com/0/129706/aa053645-a764-0d8c-30a5-db6d0b98dfa6.png">

##3.コントラクトをデプロイする

今回は以下のようなコントラクトをRopstenにデプロイして動かしてみました。

```
pragma solidity ^0.4.15;

contract HelloWorld {
    string public greeting;
    
    function HelloWorld(string _greeting) {
        greeting = _greeting;
    }
    
    function setGreeting(string _greeting) {
        greeting = _greeting;
    }
    
    function say() constant returns (string) {
        return greeting;
    }
}
```

1.　デプロイ
右側のテキストボックスに"Hello, World"と入力して「create」ボタンを押します。

<img width="466" alt="remix_create.png" src="https://qiita-image-store.s3.amazonaws.com/0/129706/49da6fc7-6fc0-1656-1905-94641762442f.png">

すると、MetaMaskのsendTransactionの画面が表示されるので、「submit」ボタンを押す。

<img width="1439" alt="metamask_send.png" src="https://qiita-image-store.s3.amazonaws.com/0/129706/2604b36b-1878-a122-ae6a-0941dd116eee.png">

2.　Ethersacnでトランザクションの情報を確認する。
一番上のトランザクションです。

<img width="355" alt="metamask_sendafter.png" src="https://qiita-image-store.s3.amazonaws.com/0/129706/7236f4c6-8263-d45c-35a0-7dda955b75aa.png">

クリックすると、Etherscanのページに遷移します。
<img width="1171" alt="etherscan.png" src="https://qiita-image-store.s3.amazonaws.com/0/129706/be516f18-739b-402e-c2ae-da7dd2c4cc0a.png">

デプロイが成功すると、「TxReceipt Status」がSuccessになります。

「To:」にあるコントラクトのアドレスからデプロイしたコントラクトの情報を見ることができます。

<img width="1433" alt="etherscan_contract.png" src="https://qiita-image-store.s3.amazonaws.com/0/129706/c9f62aa6-065d-e026-0015-e06c5f8c33b7.png">

まだ、トランザクションは「Contract Creation」しかありません。

再び、Remix見てみましょう。

<img width="1436" alt="remix_sendafter.png" src="https://qiita-image-store.s3.amazonaws.com/0/129706/8e32f2f5-0996-d16a-0c6a-c457aa774faf.png">

これで、右側にあるコントラクトで定義した関数を操作して、コントラクトの動きを確認することができるようになりました。

##4.コントラクトを実行する

実際にRemixからコントラクトを実行してみましょう。

1.　say function
まずは、コントラクタで定義した"Hello, World"を出力してみます。

<img width="1434" alt="remix_say.png" src="https://qiita-image-store.s3.amazonaws.com/0/129706/9f7d0192-e057-944e-83f7-fbd74cf5477b.png">

うまくいきました。

ここで、Etherscanでコントラクト情報を更新してみてください。say()はconstantで定義しているため、トランザクションが発生していないことが分かります。

2.　setGreeting function
次はsetGreeting()を実行します。greetingの変数には"Hello, Ethereum!"を入れました。

ボタンをクリックすると、トランザクションが発生するので、再びMetaMaskの画面が表示されるので、同じように「Submit」ボタンを押して、トランザクションを実行します。

トランザクションの実行が成功すると、トランザクションの数が2つに増えます。

<img width="1194" alt="etherscan_set.png" src="https://qiita-image-store.s3.amazonaws.com/0/129706/58066341-0934-914a-60a1-984e61728b82.png">

トランザクションの情報をみて見ると、

<img width="1162" alt="set_transaction.png" src="https://qiita-image-store.s3.amazonaws.com/0/129706/3081c1f5-2cfe-501e-ca57-4ab48661f253.png">

ちゃんと、setGreetingが実行されていることが分かります。

3.　say function
再び、say()を実行してみます。

<img width="1435" alt="remix_say2.png" src="https://qiita-image-store.s3.amazonaws.com/0/129706/20f780d0-b191-b360-9244-959e7a80239d.png">

"Hello, Ethereum!"が出力されました！！

##5.まとめ

今回はRemixとMetaMaskを使って、test netにコントラクトをデプロイして、実際に実行するところまでやってみました。
やってみた率直な感想は...「なにこれ？便利すぎちゃうん」です。（笑）

今までtruffleでローカル環境にデプロイして、コンソールで動きを見ることしかできなかったので...
この組み合わせで開発のスピードが段違いに速くなると思います。

今までSolidityの学習でそこまで手が回らなかったという方はぜひ試してみてはいかがでしょうか？