Mobile Factory Tech Blog

技術好きな方へ!モバイルファクトリーのエンジニアたちが楽しい技術話をお届けします!

ブロックチェーンの学び方

こんにちは、シニアブロックチェーンエンジニアを名乗っている @koropicot です。

これは 2018年モバイルファクトリーアドベントカレンダー 5日目の記事です。 前日は 元モバイルファクトリーの @karupanerura さんの 非TLS時代のセキュアなデバイス認証の思い出 でした。


はじめに

モバイルファクトリーは2018年より本格的にブロックチェーンに参入し、ブロックチェーン上の分散型アプリケーション(DApps)を広めることを目指すUniqysプロジェクトというものを進めています。 このプロジェクトの中で、ブロックチェーンを勉強しブロックチェーンを作るに至りました。

プロジェクト自体の話はサイトなどに譲るとして、この経験を元に、ブロックチェーンの技術領域のそれぞれについてどう学ぶかを共有します。

ブロックチェーンの全体像を学ぶ

まず、個々の技術領域に触れる前に、ブロックチェーンの全体像をざっくり把握します。 なぜなら単にブロックチェーンといっても、他の多くのシステムと同じく、多くの構成要素が関連しあうことで全体で満たしたい要件を実現しているからです。

では、ブロックチェーンとは何でしょうか。

実は最初に把握したいこの全体像が、ブロックチェーンにおいて1番わかりにくい部分かもしれません。 なぜなら、立場やプロジェクトによってブロックチェーンをどう定義し何を重視するかが異なり、それぞれが何の話をしているのか混乱するためです。 そのため、例えばBitcoinについて学んでブロックチェーンを理解した気になっても、別のプロジェクトについて調べた途端に何も分かってなかった気分になります。(なりました)

これを乗り越えるためには、どのようなレイヤーが存在しそれぞれがどこの話をしているかを意識するとわかりやすいです。 ざっくり書こうと思ったのですが、以下の記事によくまとまっていたので委譲します。 https://magazine.ginco.io/post/kisochishiki_blockchain_ecosystem/

この記事における、ビジネス・事業領域と技術開発領域が、エンジニアの関わる領域となります。 それぞれについて見ていきましょう。

アプリケーション(DApps)領域を学ぶ

ビジネス・事業領域では、エンジニアはこれまでのアプリケーションの開発と同じように、サービスを実現するために使える技術を把握して選択し、それらを用いてアプリケーションを実装することが求められます。 そのため、この領域の学習は既存のアプリケーション開発における技術の習得と同じ方法が有用です。 人によってやりやすい方法があると思いますが、自分の場合はどうしていったかを記します。

選択肢を学ぶ

既存のサービス、例えばWebアプリケーション開発でも、OS・サーバ・DB・言語などの技術を適切に選択するためには、それら自体やその長所・短所を幅広く知っている必要があります。 これはブロックチェーンを用いたアプリケーションでも変わりません。 自分の場合は、事業として技術開発領域にも挑みたいということから、競合としての既存のDAppsプラットフォームについて調べましたが、事業領域でアプリケーションを開発する場合にも、選択肢を事前に把握しておくと良いでしょう。

索引として、DAppsを開発するうえで知っておきたい、選択肢になりうるブロックチェーン(レイヤー2を含む)についてざっくり示しておきます。

  • Ethereum
    • 現在DAppsを実現するプラットフォームとしては最も人気でコミュニティも活発
    • パブリックチェーンは(現在のところ)PoWを用いており処理時間と実行にかかる手数料が課題
    • UX的に受け入れられるアプリケーションでは第一の選択肢
  • Hyperledger Fabric
    • 主にコンソーシアムやプライベートチェーンを実現するための基盤
    • 大手企業がプロジェクトに参入
    • 既存のビジネスにブロックチェーンを適用する場合には有力な選択肢
  • Uniqys Kit
    • (知っておきたいに入れるのは半分ポジショントーク)
    • Ethereumのサイドチェーン(レイヤー2)としてスケーラビリティの改善と容易な開発を目指し開発中
    • サイドチェーンとPBFTベースのコンセンサスによりアプリケーション毎の素早い処理が可能
    • Ethereumをそのまま使うだけではUX的に問題のある場合に選択肢となる
  • Loom Network
    • Uniqys Kitと結果的に同じような感じ
    • My Crypto HeroesというDAppsが利用
    • 素早い処理が可能でEthereumをそのまま使うだけではUX的に問題のある場合に選択肢となる
  • EOS
    • パブリックなDAppsのプラットフォームとしては中国などで人気
    • DPoSによりEthereumよりも高速な処理を実現し開発者がリソースの費用を負担することで利便性を向上
    • Ethereumに比べると発展途上なのと情報が日本だとまだまだ少ないのが課題

他にも関連するブロックチェーンやソフトウェアも多くありますので、上記の選択肢と比較すると理解しやすく、ユースケースにおいて適切な選択肢が見えてきます。 とはいえ、Webアプリケーションなどに比べればまだまだ発展途上なことや、ブロックチェーン特有の課題から、最適な選択肢が見つからないかもしれません。 そのような場合は、一旦下のレイヤー(プロトコルレイヤー)に降りて見ると、ブロックチェーンとしてどのようなトレードオフがあるかが見えてきて、選択の手助けになります。

開発を学ぶ

DAppsの実装は、それぞれのブロックチェーンによってプログラミング言語やアーキテクチャ、開発ツールが異なるのでそれらに合わせて学ぶことになります。

Ethereumを用いる場合は、CryptoZombiesという学習サービスが有名です。 アプリケーションによっては検証可能にするためコードを公開しているものも多く、これらも参考になります。 例えば、CryptoKittiesというEthereum上のDAppsのコードはここで確認できます。 また、ブロックチェーンとやり取りするクライアントとしてはWeb3というものがデファクトスタンダードで、バージョン1.0が絶賛開発中で、インターフェイスが変更されているので、今から始めるならこちらがおすすめです。(ただしバグも多いです。コントリビュートチャンス!)

またこれは宣伝ですが、Uniqys Kitを使う場合はDAppsを既存のWebアプリケーションのように作成できます。 そのため最初の学習のハードルは低くできていると自負しています。

いずれにしても、この領域は結局のところ既存のアプリケーションの学習とほぼ同じです。 開発だけなら特に仮想通貨もいらないので、実際に作ってみるのが良いと思います。

ただし、特有の注意点として、サービス自体や全体の設計に関わる以下の特徴は最初から意識しておくと良いです。

  • パブリックチェーンの場合は処理は誰でも確認できてしまうこと
  • チェーンによって異なるが処理に数秒から数十分かかること
  • チェーンとの接点となるノードは信頼しないといけないこと(場合によっては管理下にノードを構築する)
  • アカウントの認証は多くの場合秘密鍵に依存していてその管理は自己責任であること
  • ブロックチェーン外の情報は基本的に扱えないこと
  • 誰にも操作されない乱数も容易には実現できないこと
  • サービスを展開する地域の法律(日本の場合は資金決済法など)によっては規制があること

プロトコルレイヤーを学ぶ

技術開発領域はプロトコルレイヤーとも呼ばれ、コンセンサスアルゴリズムなどの分散システムや暗号理論、インセンティブ設計、オフチェーンやサイドチェーン、コントラクト検証などの数多くの部分からなります。 これらの領域は課題が多く存在していて、チャレンジのしがいがありますが、一方で事業には直結し辛い部分のため人口も少ない印象があります。 しかし、課題を解決しないことには事業を含めたブロックチェーンの発展に限界があるため、ぜひとも多くの人に興味を持ってほしい領域です。

この領域を学ぶ場合は、理論を学ぶことと、それらをどう実装していくかの両面が必要です。

理論を学ぶ

理論を学ぶ際には、まずは何はともあれBitcoinの原論文を読むと良いです。 PDFをこちらから読むことができます。 また、日本語での解説も多くあります。

ここで注意しなければいけないのは、前述したようにBitcoinがブロックチェーンの全てではないということです。 しかし、Bitcoin以後に登場したブロックチェーンはBitcoinの課題を解決したり適用範囲を広げるために変化しているので、基準として知っておくのは有用です。

この次に何を学ぶかですが、概要さえわかっていればより深い部分は興味や必要がある場合に応じて進めていけばいいと感じています。 例えばUniqys Kitを作る上では、スケーラビリティの課題を解決する必要があったことから、レイヤー2の部分を調べ、必要に駆られてコンセンサスアルゴリズムについて学ぶという過程を経ました。 それ以外の部分は、何のためのどういうものかと言うのを知っている程度です。

では、それらをどのように学ぶのが良いでしょうか。 分散システムや暗号理論、形式的検証などはブロックチェーンの登場のはるか以前から存在している分野です。 またインセンティブ設計などもゲーム理論として捉えることができるでしょう。

そのため、これらの分野の既存の論文を当たるのが良いと考えています。 プロジェクトのホワイトペーパーなどを読むのも良いですが、やはり理論はちゃんとした土台があってこそ活きてきます。 また、今後のブロックチェーンの発展のためにはいかに既存の専門家をブロックチェーン界隈へ連れてくるかが重要になってくると思います。

実装を学ぶ

理論が理解できても、それを現実にしなければ利用することはできません。 また、理論も実際に手を動かしてみるとより理解できることもあります。

これらの実装の理解には、近しいプロダクトのソースコードが1番勉強になります。 ペーパーやドキュメント、参考書を読んでも理解できない部分や、腑に落ちないことはどうしてもあります。 そういったときに、もっとも具体的で、現状を反映しているのがソースコードです。 自分がUniqys Kitを実装した際にも、EthereumやTendermint, NEOといったブロックチェーンのソースコードを読んで参考にしました。

とはいえソースコードを読むためには、大規模すぎて取っ掛かりが分からなかったり、言語やプロダクトの文化や歴史が分からなかったりするなど難しい部分もあります。 そこで、これも宣伝なのですが、Uniqys Kitの実装は比較的分かりやすい(らしいという id:odan3240 さんの意見)ので、ぜひとも参考にしてほしいと思います。

まとめ

  • ブロックチェーンは複数の領域からなるのでどの領域についての話かを意識して学ぼう
  • ブロックチェーン上のアプリケーションはいままでと同じように手を動かせばわかる
  • 理論に興味あれば既存の研究をちゃんとちゃんと追って巨人の肩の上に立とう

やっていきましょう。


明日は6日目 id:mp0liiu さんです!