【Ethereum】実務で使う開発環境

この記事は [Ethereum Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ethereum) の4日目の記事です。

SolidityでのEthereum DApps開発環境について書きます。

# IDE(統合開発環境): IntelliJ IDEA
![image.png](https://qiita-image-store.s3.amazonaws.com/0/50056/c2511541-26f3-8fcb-777f-ad7103456057.png)

Ethereumに初めて触るとき、Remix(旧browser-solidity)から入る方は多いでしょう。  

- [手軽に“Solidity”言語でスマートコントラクト開発、開発環境「Remix」ってどう使う？](http://www.atmarkit.co.jp/ait/articles/1711/27/news009.html)

しかし習熟としては最適なのですが、実際に業務として腰を据えて開発を行おうとすると色々な面で厳しくなってきます。
私は、Solidityの開発に汎用IDEとして定評のある[IntelliJ IDEA](https://www.jetbrains.com/idea/)を使用しています。

## Solidityプラグイン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/50056/19e52174-75cf-33c1-5395-87c9f31d2510.png)

IntelliJ には[intellij-solidity](https://github.com/intellij-solidity/intellij-solidity)というSolidity用プラグインが存在します。
意欲的に開発が進められており、現時点でも実務でSolidity開発を行うための充分な品質を備えています。
デフォルトのカラースキーマでは少々コードを読みづらいので、自分好みに少しいじるとぐっと可読性が上がるのでおすすめです。
<img width="629" alt="スクリーンショット 2017-12-04 10.48.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/50056/3f93a88d-71d2-e2c9-c11d-ec6d51a12e3b.png">


IntelliJ IDEAは[JetBrains社](https://www.jetbrains.com/)の製品でそれなりの値段がしますが、私はSolidity開発だけでなくあらゆる開発に同社のIDEを使用しています。安定性・カスタマイズ性が高くよくできており、 **お金を払う価値のあるプロダクト** だと感じています。

# 統合テスト: Mist
DAppsの開発において品質の担保は何よりも重要です。
作成するアプリケーションにもよりますが、1つのバグが致命的な損失へ繋がる可能性がWEB開発等に比べて極めて高いからです。

- 参考: [Smart Contract ベストプラクティス・Ethereum Contract セキュリティ・テクニック＆Tips](https://github.com/sot528/smart-contract-best-practices/blob/master/README-ja.md#general-philosophy)

[truffle](https://github.com/trufflesuite/truffle)等のフレームワークを使用して開発を行い、デプロイしたコントラクトは必ず手動でテストを行う必要があります。
[Geth](https://github.com/ethereum/go-ethereum)等のターミナルですべてを完結させてもよいのですが、Ethereum公式DAppsブラウザである[Mist](https://github.com/ethereum/mist)を用いてGUIでテストすることも可能です。
GUIには非エンジニアでもテストに参加できるという利点があります。ここではMistを使用する手順を記載します。

## Mistの入手
[公式](https://github.com/ethereum/mist/releases)から入手します。
必ず最新版を使用し、実際の業務では **更新をウォッチしてすみやかにアップデートを適用する** よう心がけてください。

## Mistの起動
Mistはデフォルトで裏で[geth](https://github.com/ethereum/go-ethereum)をfastモードで起動します。
もし既にローカルでgethを使用していたら、先に起動しておけばそちらを使用してくれます(細かいオプションの調整などが可能)。
最初に起動した時は同期にかなり時間がかかるので注意してください(1晩寝かせる必要があるかもしれません)。容量も数十GB〜 必要です。
場合によってはlight clientモードでも良いのかもしれません(ゴリゴリ開発することが可能なのかは未検証)。
light clientモードはうどんさんによる↓のエントリがわかりやすいです。

- [Gethのlight Clientモード+Mistによる安定したETH環境](http://udon-cryptocurrency.hatenablog.com/entry/2017/07/26/174740)


## デプロイされたコントラクトの確認と操作
コントラクトを確認するには **アドレス** と **ABI** が必要です。
truffleでビルドした場合の取得方法は以下の通りです。操作はメインネットでもテストネットでもプライベートネットでも変わりません。

### アドレス
コントラクトのETHアドレスです。
デプロイ時にターミナルに出力されます。

### ABI
[ABI](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI)はコントラクトを使用する上でのインターフェイスの情報です。
truffleでビルドした場合は、`/build/` ディレクトリ以下に生成された対象コントラクトの.jsonファイルの `abi` キーの値となります。以下の画像の例では赤枠のデータです。
<img width="1108" alt="スクリーンショット 2017-12-04 11.37.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/50056/760eaa38-fd52-f91f-1427-70f701146eec.png">

### コントラクトの確認と操作
1. Mistのコントラクト画面を開き「コントラクトを見る」をクリック
   ![スクリーンショット 2017-12-04 11.24.28.png](https://qiita-image-store.s3.amazonaws.com/0/50056/7759557d-5826-7642-3086-373ace83ada0.png)


2. 「コントラクトアドレス」に上記で取得したETHアドレス、「コントラクト名」はただのラベルなので適当に、「JSONインターフェイス」にABIをそれぞれ入力して「OK」。
<img width="582" alt="スクリーンショット 2017-12-04 11.24.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/50056/0a71d5d4-5849-9702-0611-58c7589af459.png">
3. コントラクトが一覧に表示されて操作できるようになっていればOK。
   操作方法はそう迷うことは無いと思うのですが、いろいろクセはあるので需要があればまた書きます(たぶん)。

## 補足: Moon Browser
先のDevcon3でMistの後継である[Moon Browser](https://github.com/ethereum/moon-browser)が発表されました。
2018年にリリース予定で、今後MistはこのMoon Browserへ置き換わってゆくものと思われます。

## 補足: Ganache
![image.png](https://qiita-image-store.s3.amazonaws.com/0/50056/310bd9b7-4b31-570b-4dcd-32db55648f02.png)

truffleの開発チームが新しいEthereum開発環境として[Ganache](http://truffleframework.com/ganache/)をリリースしています。
良さそうなので、今後こちらを利用してゆくかもしれません。

- [Ethereum のローカル開発環境 Ganache を使ってみる](https://qiita.com/kyrieleison/items/8ef926faa4defa8fe930)

# 統合テスト: プライベートネット
フロントはMistを使うとして、じゃあブロックチェーンは何を使用するのかというと私はプライベートネットを構築して使用しています。
最終的にはメインネットや公式テストネットのRopstenでのテストも必須なのですが、作業効率を考えるとプライベートネットを立てるのが一番です。
ちょうどこのAdventCalendarで昨日 @umidachi さんが良い記事を書いてくださいましたのでご参照ください :smiley: 
(記事ではラズパイ上ですが私は開発環境のMacに構築しておりました)。

- [【Ethereum】Raspberry piを使用してプライベートネットワークを作ってみた（コントラクト実行〜LCD表示まで）](https://qiita.com/umidachi/items/7bfedcf7f1764f78d47e)

# ユニットテスト: ganache-cli(test-rpc)
手作業でのテストはもちろん、自動テストもコントラクトの品質を担保する上では必須です。CIで動かすためにも重要であり、またコントラクト開発時にいちいち手作業でテストしていては非常に効率が悪いのですが自動テストがあればテンポ良く開発が可能です。

検索すれば記事は出てくるので詳細割愛しますが、test-rpc(2017/11にganache-cliに名称変更しました)を使用しています。
![スクリーンショット 2017-12-04 12.42.20.png](https://qiita-image-store.s3.amazonaws.com/0/50056/9da619c3-7534-2864-c268-11a4631fad97.png)


# CI環境: CircleCI
![image.png](https://qiita-image-store.s3.amazonaws.com/0/50056/0513355d-5985-5435-f191-e50718df76d8.png)

[CircleCI](https://circleci.com)上でtest-rpc(ganache-cli)を使用しています。
参考までに、以下は[ALIS](https://alismedia.jp/)の[ICO用コントラクト](https://github.com/AlisProject/ico-contracts)のCI環境です。

- https://circleci.com/gh/AlisProject/ico-contracts/tree/master

# 備考
- 粒度を細かくすると他にもいろいろあるのですが、量が多いので一旦ざっくりとまとめました。需要があればまた追記or別記事を書きます。
- ブロックチェーン、特にEthereum周りは極端なまでの速度で進化しているのですぐに情報が古くなってしまいます。お気をつけを。
    - だからこそ面白いんですが :wink: