Ethereumの学習フローを整理した

ブロックチェーンの勉強を始めて、そろそろ1年です。
最初はBitcoinを動かしてみたり、API使って、簡単な送金アプリを作ってみたりしました。
去年の春から夏にかけては業務の関係でFabricを中心にHyperledgerプロジェクトのブロックチェーンを触っていました。

しかし、Fabricだけ分かっててもな〜と思い、9月からEthereumの勉強を始めました。
これが運の尽きでした...

「...Ethereum、めっちゃ楽しいじゃん！！！！」

Ethereumにどっぷりとハマってしまいました。学習しても、しても終わりが見えない感じが楽しいですね（笑）

学習を始めてからもう少しで半年、一通りEthereum周辺の技術を触ったので、備忘の意味を込めて、学習の流れを整理してみました。
なお、今後も新しい技術を触ったら、随時更新していく予定です。

他にも、これやった方がいいよというものがあればぜひ教えてください！
よろしくお願いします！

##1. 基礎知識の習得

###1. Ethereumの基本的な用語や仕組みについて理解する
- gas, EVMといった用語の意味がわかれば良いのでは？
- おすすめの本「ブロックチェーン　イーサリアムへの入り口」　  
（ただし、Ethereumの仕組みについては結構ディープなところまで書かれているので最初は流し読み程度でいいかも）

##2. 開発環境の構築
###1. gethのインストール
- gethのインストール後、プライベートネットを立ち上げて、miningしたり、transactionを実行したりする
- gethコマンドでこんなことができるんだなということがわかればよいのでは？  
https://github.com/ethereum/go-ethereum

###2. parityのインストール
- 基本はgethを使うがtestnetのチェーン同期はparityの方が早いらしいので、これも入れておく  
https://github.com/paritytech/parity

##3. Solidityプログラミング
###1. Solidityを使ったsmart contractの開発を学ぶ
- IDEはRemixかな
クラウド環境
https://remix.ethereum.org/#optimize=false&version=soljson-v0.4.19+commit.c4cbbb05.js
ローカルに導入
https://github.com/ethereum/browser-solidity

- おすすめの本「はじめてのブロックチェーン・アプリケーション」

###2. ConsenSys/smart-contract-best-practicesを全部読む
- 日本語訳あり
https://github.com/sot528/smart-contract-best-practices/blob/master/README-ja.md

- CryptoKittiesのコントラクト
（トークン、ICO以外のコントラクトを学ぶにはCryptoKittesのコントラクトが一番参考になる）
https://medium.com/loom-network/how-to-code-your-own-cryptokitties-style-game-on-ethereum-7c8ac86a4eb3
https://qiita.com/blueplanet/items/fa005a1c9457169a7391
https://qiita.com/blueplanet/items/e257450834a5a32f0f10
　
※ただし、最初はCryptoKittiesのコントラクトを読んでもさっぱりわからないと思われるので、一通り学習してから見てみることをおすすめする

##4. 開発フレームワーク
###1. truffleのインストール
- Solidityを使ったWebアプリケーション開発用のフレームワークを導入する
- truffleのコマンドでSmart Contract開発のための雛形を作ることができる
- truffle.jsでネットワークの設定を行う。ここを理解すれば、開発の幅が広がる（色々なネットワークに接続できるようになる）

【Reference】
https://qiita.com/amachino/items/8cf609f6345959ffc450

- truffleがなんとなく分かってからICOのコントラクトを参考にスマートコントラクトの勉強を集中的に行った

【参考にしたプロジェクト】
「OpenZeppelin/zeppelin-solidity」
https://github.com/OpenZeppelin/zeppelin-solidity
※ ICOのコントラクトを描く場合、zeppelin-solidityの理解は必須！

「gnosis/MultiSigWallet」 
https://github.com/gnosis/MultiSigWallet
※ MultiSigWalletの理解のために
（でも、実はあまり理解できていないかも...）

「AlisProject/ico-contracts」 
https://github.com/AlisProject/ico-contracts
※ テストコードが非常に豊富

「DRI-network/RICO」 
https://github.com/DRI-network/RICO
※ダッチオークションやPoDなど、ICOに必要な要素を体系的に学ばせていただきました

この段階で以下のAdvent Calendarを全部読むことをお勧めする
https://qiita.com/advent-calendar/2017/ethereum

test netへデプロイする方法
https://tech.pepabo.com/2017/12/06/erc20-token-on-ropsten/

truffleで接続するプライベートはganacheが早いかも
http://truffleframework.com/ganache/

- ホスティングサービス「infura」

【Official】 
https://infura.io/ 
【解説】 
https://wakuwaku-currency.com/virtual-currency/ethereum/about-use-hosting-service-infura.html

これを使えば、truffleで簡単にtest netにコントラクトがデプロイできるようになる

###2. web3.jsの理解
・Webアプリ開発に必要なAPIを理解する

※1 truffle, web3.jsともjavascript, Node.jsを使用している
※2 ただし、自分の場合はRoRで開発したかったので、ethereum.rbを使った
https://github.com/EthWorks/ethereum.rb
https://qiita.com/shiki_tak/items/1fdac873e35c5257a4d7

##5. Walletの理解
###1. EthereumのWalletについて学ぶ
- MetaMaskを使用

インストール方法 
https://business-infinity.jp/metamask-how-to-use/  

※1 基本的にRopstenのテストネットを使いました
https://ropsten.etherscan.io/

※2 SEED情報のメモをお忘れなく

##6. セカンドレイヤーの学習へ
###1. Raiden Network
- 文献は少ないが公式ドキュメントだけでも十分学習できる
- APIを試して、Web UIで実行するところまでできればやってることがなんとなく分かるようになる

【Official】
https://github.com/raiden-network/raiden
http://raiden-network.readthedocs.io/en/stable/index.html
　
【Qiita】
チェーンの同期で非常に参考になりました
https://qiita.com/tomohata/items/21e33b0d68374090a697#comment-a0a88db459dc093139d3