アルゴリズムとかオーダーとか

仕事で勉強したことなどをまとめてます

Ethereumを学習するときのロードマップ

自分がEthereumを学習したときの経験を元にゼロからEthereumを勉強するためのロードマップをまとめてみました。
先人たちは大体この流れで学習を進めていったと思います。

1. Ethereumのnodeを立ててみる

何はともあれEthereumの世界を体験してみたいなーと思ってしまうのは当たり前の流れかと思います。
最初は何らかのnode実装をインストールし、プライベートなnodeを立ててminingや送金txの発行などを試しながらehtereum、blockchainの世界を体験すると良いです。なお、mainnetに接続するnodeを立ててしまうと数十GByteほどのデータを同期しようとするので注意してください。
Ethereumのノード実装はいくつかあるので以下に紹介します。

go-etherem

通称geth。一番主流なEthereumのnode実装です。go言語で作られています。ネット上でも一番情報を拾いやすいと思います。
インストール方法等は下記を参考に。僕もgethしか使ったことがないです。

parity

2番目に有名なnode実装です。ネット上での情報はgethほどは見つかりません。gethよりも安定していて同期も速いです。
インストール方法等は次の記事などを参考にしてください。

その他

あんまり使われてる話を聞かないので名前の紹介だけ。

2. Walletを使ってみる

nodeを入れた後はwalletからETHの送金・受信を試してみると良いと思います。開発に必要というわけではありませんが、end userがどのようにEthereumにアクセスするのかを知るのは今後のアプリの開発などで重要です。

MetaMask

metamask.io
Chrome にインストールして使うタイプのwalletです。だいたいこれを入れておけばOKです。特にÐapps開発・利用時にはほぼ必須と言ってもいいかもしれません。詳しくは後述します。

それ以外の有名なwalletアプリ

  • MyEtherWallet.com : 有名なwalletその1。インストール不要なのですぐに使えます。
  • Releases · ethereum/mist · GitHub: 公式から配布されているwallet アプリ。インストールして使うタイプです。nodeも内臓しているため、別途gethなどを入れる必要なく動きます。ローカルに立てたnodeに接続して動かすことも可能です。walletとmistの2種類がありますが、mistは開発者向けのwalletでもう一方はend user向けです。

3. Ethereumについて深く学習する

nodeを立ててなんとなくEthereumの世界を体験してみた後は、具体的にEthereumというblockchainがどのように動いているのか?というのを調べてみるのが良いと思います。
その技術のバックボーンを知ることで今後の学習の助けになります。
Ethereumの概要については以下の記事をおすすめします。

より、具体的なプロトコルや技術部分についてはwhitepaperとyellow paperを読むのが一番良いでしょう。

ただし、Ethereumは今後もハードフォークが予定されています。つまりまだまだ開発途中のBlockChain technologyであり、常に変化していくため最新の情報を追い続ける必要があります。

4. SmartContractを書いてみる

プライベートnodeでtx発行などを一通り試した後は、やっぱりEthereumといえばSmartContract!なのでSmartContractを書きたくなってきます。

SmartContractを書くための高級言語としてjavascriptライクなSolidityという言語が有名です。
SmartContractを記述するための言語は他にも、vyperがありますが、現状はSolidity一択という状況なのでとりあえずはSolidityについて学んでおけば大丈夫です。

Solidiyの公式ドキュメント

Solidity — Solidity 0.4.23 documentation

ということで、このSolidityを書いてその場ですぐに動かせるツールを紹介します。

Remix (browser-solidity)

Remix - Solidity IDE

Run -> Environmentの設定でローカルに立てたnodeに接続することもできます。ただ、ローカルのnodeにつなげる時は "https://~" ではなく、"http://~" に変えて接続する必要があります。最初はJavascript VMを選んでスタンドアローンでビルド&デプロイするといいと思います。
初めての人には使い方が少し難しいと思うので、参考となる記事を載せておきます。これ以外にもググれば使い方をまとめてくれている記事が見つかると思います。
Smartcontractの開発を効率化するBrowser-solidityの使い方 - Qiita

EthFiddle.com

EthFiddle - Solidity IDE in the Browser. Powered By Loom Network

Loom Networkのプロダクトの1つであるEthFiddle.comです。こちらはローカルnodeへの接続などはできませんが、remixと同じくスタンドアローンでその場で書いたSmartContractを実際に動かすことができます。
また、Shareボタンを押すことで作ったSmartContractをブログに貼り付け、読者にも試してもらうことができます。
こちらはremixよりもUIが親切なので直感的に使えると思います。

5.Solidityについて深く学習する

Solidityをある程度かけるようになってくると、次はもう少し複雑な、大規模なSmartContractを作りたくなってくると思います。
ただ、SmartContractではバグの混入が致命的な問題となります。そのため、ここではSolidityのセキュリティーやより安全なコードの書き方などの応用的な使い方に関しての記事を紹介します。

CryptoZombieで体系立てて学ぶ

cryptozombies.io

すでに学習を進めている人も多いと思いますが、今一番Solidityを学習するのにお勧めしたいCryptoZomiesです。
内容が濃いのとSolidityのほとんどすべてのことを触れているため、1度だけだとその全てを咀嚼仕切れないと思うのである程度期間が開いたり、Solidityで気づいてなかった関数や修飾子などを発見した時にまたやり直すと良いと思います。

SmartContractのセキュリティーについて

Ethernaut
過去、SmartContractで起きた実際の事件を元に作られたSmartContractをhackingして問題を解いていくタイプのものです。
自分が攻撃者となって、SmartContractから資金を引き出す方法、及びそれを防ぐ方法を学ぶことができます。

こちらの記事も合わせて読むとより危険なコードについての理解が深まると思います。
推奨する実装方法 - Ethereum Smart Contract Best Practices(日本語訳)

リリースノート

いつからどのmodifierが使えるようになったかとか調べたい時に。セキュリティーとは少し離れますが、過去のSolidityのサンプルやコードを読んでる時たまーに知りたくなったりするので。
Releases · ethereum/solidity · GitHub

自分のブログ記事もおすすめ

ちょっとマニアックな使い方やコードをまとめているので何かの参考にでも。あんまり実用的ではないです。
Solidity カテゴリーの記事一覧 - アルゴリズムとかオーダーとか

6. Truffleを導入してSmartContractのプロジェクトを管理する

Solidityの学習が進んでSmartContractをある程度自由に作れるようになると、次の段階として複数のContractが連携して動くような大きなSmartContractやDappsが作りたくなってくると思います。
なのでSmartContractのバージョン管理やテストを簡単に行うためのプロジェクト管理ツールとしてTruffleの導入をお勧めします。TruffleはSmartContractの単体テストが簡単に行える環境も提供してくれます。
Truffle Suite - Your Ethereum Swiss Army Knife

Truffleの使い方について

Truffle カテゴリーの記事一覧 - アルゴリズムとかオーダーとか

Truffleは利用しているユーザが多いのでググれば色々情報が出てきます。自分も一通り過去記事でまとめていますので、そちらを参考にしてみてください。

7. Ethereumのfrontendとして利用するlibrary

Ethereumにtxを発行したり、SmartContractの状態を確認するために毎回 geth consoleを開くのは大変です。
そのため、次にEthereumのJSON-RPC clientとして利用できるlibraryを紹介します。
Truffleがjsで実装されているため、js系のlibraryとの親和性が高いです。また僕もjs系のlibraryしか使ったことがないためここではjs系のlibraryを紹介します。

web3.js

EthereumのJSON-RPC clientといえばこれです。go-ethereumのconsoleコマンドやTruffleでも内部ではweb3.jsを使っています。
GitHub - ethereum/web3.js: Ethereum JavaScript API

web3.jsは1.0.0系と0.2x系の2バージョンが同時に開発されています。truffleなどが利用しているのは基本的に0.2x系です。
npm install web3.js とバージョンを指定せずにインストールした場合は1.0.0系がインストールされます。
0.2x系と1.0.0系ではインターフェースがかなり違うのでどちらのバージョンを使うかは決めておいた方が良いかと思います。
僕としては1.0.0系をお勧めします。

ethereumjs系

web3.jsで足りない部分を補完するために使うことが多いです。よく使う2つのlibraryを紹介します。

  • ethereumjs-tx:txを自分で作成したり署名をつけたい時に使います。
  • ethereumjs-util:色々便利なメソッドを提供してくれるものです。そのままですね。。。Solidity <-> javascriptでbyte配列のやりとり部分を簡単にするために使うことが多いです。

truffle-hdwallet-provider

Ethereumでhdwalletタイプのアカウントを扱う場合に必須となるlibraryです。MetaMaskで作成したアカウントを共有したい時とかに使うことになります。
GitHub - trufflesuite/truffle-hdwallet-provider: HD Wallet-enabled Web3 provider

ganache

Ganache | Truffle Suite

旧TestRPCです。テスト用に特化したethereumのnode実装です。tx発行と同時に自動で即miningされたり、timestampを任意の時間に設定するための専用のJSON-RPCコマンドが用意されていたりします。
truffleもdevelopモードで動かした時はganacheのnodeが起動します。こちらはfrontendで使うものではないですが便利なので紹介しました。

8.Ðappsを作成してみる

最後はやはりエンドユーザ向けのアプリケーションの作成になります。EthereumのSmartContractを利用したアプリケーションのことを一般的にÐappsと呼びます。(Truffle + Ganache + Metamask を使って Ðapps の世界に旅立とう - Tech Inside Drecomより)

Ðappsはアプリケーションなので千差万別なため、こうやったら作れますというのは言えません。なのでここではÐappsを作る時に使うと便利なツールやサービスを紹介します。

Infura.io

infura.io
EthereumのJSON-RPCのエンドポイントを提供しているサービスです。Infura.ioを使うことで、自分でnodeを立てる必要がなくなります。mainnetやtestnetと同期するだけでも結構時間がかかる作業なので、自前でnodeを立てる明確な理由がない場合はinfura.ioを使うと良いと思います。

MetaMask

metamask.io

Chrome ExtensionのEthereum Walletです。Walletと言いつつ、内部ではInfura.ioと接続しており、また、MetaMaskをインストールしたChromeでアクセスした場合そのページ上にはweb3.jsがMetaMaskによって提供されます。
つまり、MetaMaskをインストール済みのユーザにアクセスしてもらうことを前提にすることで、ユーザの秘密鍵の管理、nodeへの接続設定の2つについて何も処理をする必要がなくなります。そのため、Javascriptで書いたフロントエンドアプリだけ用意すればÐappsとして動くものも作れてしまいます。
現状、ローンチされたÐappsはMetaMaskをインストールしていること前提で作られているものがほとんどです。

EthereumKit

github.com
iOS用のEthereum SDKです。iOSのMetaMask的なものになります。
僕はiOSの開発自体をしたことがないので残念ながらまだ利用したことはないのですが、基本的にmobile Ðappsを作るために必要な機能は一通り揃っています。なので、mobileで何か作ってーと言われたらethereum-kitを利用すると良いです。

その他の便利なツール

Solidityのセキュリティーチェックや、チーム開発の助けとなるリファレンスドキュメントの自動生成ツールなどを紹介します。

9. 便利なサイト

Ethereum Networkの状態をリアルタイムにすることができるサイトや、現在動いているÐappsの一覧を載せているサイトなど、Ethereumの開発を行う上で知っておくと便利なサイトを紹介します。

まとめ

これから勉強を始める人〜最近勉強を始めた人向けに学習のためのロードマップをまとめてみました。書き始める前に想定してよりもかなりボリューミーになってしまったなぁというのが正直な感想です。
学習のための入り口としては十分な内容担ったのではないかな?と思います。この記事で紹介した物やキーワードを元に検索をすればより深い内容の記事もいっぱい出てきますので、それらも参考にしながら学習を進めていくと良いと思います。