2019年11月、オライリージャパン社より『マスタリング・イーサリアム―スマートコントラクトとDAppの構築』が発売されました。
と同時に、ブロックチェーンコンサルティング企業BUIDLのメンバー(当時)であり、当著の監修を務めた宇野雅晴さん(Twitter)より献本いただきました。
ありがとうございました!
イーサリアムの学習の際には必須と言われながら、長らく英語版しかなかった『マスタリング・イーサリアム』の日本語版がついに出版されました!
BUIDLの宇野さん @Masa_Ukov 、献本ありがとうございました!#meganbooksオライリー・ジャパン『マスタリング・イーサリアム』https://t.co/B6QC0CQcPo pic.twitter.com/a7YBcETOv4
— megan㌠ (@sunteam097) December 15, 2019
本著はビットコイン開発者のバイブルである「mastering bitcoin」の作者であるAndreas M.Antonopoulosと、イーサリアムの共同創業者であるGavin Woodによって公開された「mastering ethereum」の日本語翻訳版であり、翻訳メンバーには日本のイーサリアムコミュニティを初期から支えてきた技術者が多く参加しています。
レベルが高く非常に細かい部分までカバーしているため、初心者の段階で読む際には時間がかかるかと思いますので、以下で書評も兼ねて本著の各章について簡単にまとめていきたいと思います。初めて読む際のガイドになれば幸いです。
『マスタリング・イーサリアム』の対象読者と全体像
本著は網羅性が高くオリジナルの執筆者はイーサリアムの第一人者であるため、どんな方でも読んで損はないと思います。具体的には
- イーサリアムを利用したアプリケーションの開発をしたいエンジニア
- ビジネスサイドだが、イーサリアムを利用したプロジェクトが立ち上がるので、概要を把握しておきたい
といった読者が想定されます。
また構成として前半でイーサリアムの沿革や概要を説明しつつ、後半にいくにつれ、徐々に実際の開発で必要となるtipsを増やしていく構成になっています。個人的には9~14章は読み込むためにコンピュータサイエンスの知識が必要になることがあると感じました。そのため、ビジネスサイドであり、関数レベルでのイーサリアムの把握は不要である方や、アーキテクトの把握のみすれば十分という方であれば、前半を中心に読んでいけば目的は十分達成できるのではないかという気がします。
では概要をまとめていきます。
1章 イーサリアムとは何か
イーサリアムの沿革に関する章です。
イーサリアムの創設者Vitalik Buterinはかつてbitcoinに関しても研究していましたが、bitcoinが送金のみに特化したプロトコルであったことから、より汎用性の高いイーサリアムを開発するに至りました。そのような経緯や、イーサリアムはナカモトコンセンサス等一部のビットコインの性質を引き継ぐもののチューリング完全な汎用ブロックチェーンである点、Dappsという分散型アプリケーションをもたらし、開発風土はビットコインに比べオープンで急進的である点など、ビットコインとの相違点・類似点を中心にまとめられています。
2章 イーサリアムの基礎
イーサリアムの開発のベースとなる「通貨イーサ(ETH)」「ウォレット」「ワールドコンピュータ/EVM」「スマートコントラクト 」の話がまとめられています。
ウォレット
種類をあげ、特に代表的なMetamaskの利用方法について、画像付きで解説しています。
イーサリアムにおけるウォレットは秘密鍵を管理し、トランザクションを作成、ネットワークにブロードキャストすることができる、いわばイーサリアムネットワークへの接続部分です。 そして通貨「イーサ/ETH」はワールドコンピュータEVMの上でスマートコントラクトを実行する際に使用されます。
アカウントはmetamaskをはじめとする外部所有アカウント/EOAと、コントラクトアカウントの2種類に大別されます。
EOAとコントラクトアカウントはいずれもaddressとstate(トランザクションによって偏移する状態)を持ちますが、役割が異なります。EOAは秘密鍵で管理され、EOAはトランザクションを生成することで他のEOAやコントラクトアカウントへメッセージを送れますが、スマートコントラクトのコードは含まれません。
一方でコントラクトアカウントではコントラクトコードで制御され、コントラクトアカウントへメッセージを送るとコントラクトアカウントに紐づけられたコードを走らせます。このコードの実行でEthereum上でトークンの発行や送信、ストレージへの書き込みができ、これをスマートコントラクトと呼びます。
ビジネスサイドの方であれば、ここまでの章を読むだけでも十分なのではないかと個人的には感じました。
※スマートコントラクトについてより詳しい解説は以下の関連記事をご覧ください。
関連記事:仮想通貨・ブロックチェーンにおける「スマートコントラクト」の単語の本質とは?
3章 イーサリアムクライアント
イーサリアムの仕様とクライアントについてまとめられています。
仕様
ビットコイン(ここでは便宜的にBitcoin Coreを指すものとします)は開発者により合意され実装された内容を、それすなわち仕様として受け入れますが、イーサリアムは対照的に、すでにイエローペーパーで数学的に仕様が定義されており、加えてEIP(Ethereum improvement Proposals)による改善提案を受け付けます。イーサリアムネットワークはイエローペーパーで定義された仕様に準拠したネットワークです。
クライアント
イーサリアムクライアントとは、イーサリアムの仕様を実装し他のイーサリアムクライアントとP2Pネットワークを介して通信するソフトウェアアプリケーションです。Parity,Gethが代表的です。
イーサリアムのトランザクションを全て同期する=フルノードを建てることはイーサリアムのネットワークに貢献できることではありますが、マシンコストも時間も膨大にかかるため、リモートクライアントも準備されています。モバイルウォレット(trust)、ブラウザウォレット(Metamask,MyEtherWallet)もこれに含まれます。
4章 暗号化
ブロックチェーンを語る上では欠かせない公開鍵暗号、秘密鍵、楕円曲線を応用した公開鍵の生成、ハッシュ関数に関する解説です。
暗号に関してはこちらの記事もご覧ください。
関連記事:仮想通貨の基礎、「暗号」の歴史を概観する。シーザー暗号からエニグマ、量子コンピュータまで。
イーサリアムとしてはハッシュ関数にKaccak-256を利用、公開鍵からイーサリアムのアドレスを生成します。秘密鍵は1から2^256の間の数字を無作為に選択します。今ではゼロ知識証明や準同型暗号も活用に向け準備されています。
5章 ウォレット
ウォレットは秘密鍵を保管し、自分の資産を保管するkeychainの役割を果たします。
ウォレットの種類には非決定性ウォレットと決定性ウォレットがあり、現在ではもっぱら決定性ウォレットが用いられます。この決定性ウォレットとは1つのマスター鍵もしくはシードから導出された秘密鍵が格納されており、バックアップ・復元のための秘密鍵のエンコードとして英単語などのニーモニックフレーズを利用することが一般的になっています。
個人的にはイーサリアムに関する日本語版の書籍では、ウォレットに関する記述は少ない本が多いように感じていましたが、マスタリング・イーサリアムに関してはウォレットに多くのページが割かれており、特にこの章は必見です。
6章 トランザクション
EOAから発信された署名付きメッセージ=トランザクションには構造として
- nonce
- Gas Price
- Gas limit
- 受信者のイーサリアムアドレス
- value(送金額)
- データ
- ECDSAデジタル署名のためのv,r,sの3要素
を格納していますが、これらの各要素に関しての解説が加えられています。
特にイーサリアムではスマートコントラクトを実行するために支払われる「Gas」は非常に重要な概念であり、本章と第13章で詳細に解説が加えられています。
7章 スマートコントラクトとSolidity
スマコンを実行するための高級言語solidityの紹介です。具体的には
- データ型
- 定義済みのグローバル変数とグローバル関数
- コントラクト
- コンストラクタ
- 継承
- エラーハンドリング
- イベント
などについて解説されています。特にトランザクション、ブロック、アドレス周りのグローバル変数・グローバル関数が多く、イーサリアムを記述するためだけに開発されたsolidityの醍醐味を感じられました。
8章 スマートコントラクトとVyper
Solidityに代わりセキュアにEVMでスマコンを動かすための言語、Vyperに関しての解説です。
現在イーサリアムを用いたアプリケーション(Dapps)を開発する際には一般的にSolidityが用いられることが多いですが、Solidityの脆弱性をついたハッキング事件(The DAO事件など)もあることから、Vyperにも一定の需要が見込まれています。
Pythonライクな言語で、複雑性を排除することを原則としており、Solidityと異なり継承、修飾子、無限ループ、再帰呼び出しがありません。また事前条件、事後条件、状態変化を明示的に扱うことに特徴があります。
9章 スマートコントラクトセキュリティ
セキュアなスマートコントラクトを記述するためのtipsについての章です。
スマートコントラクトは一度デプロイすると巻き戻すことができず、デプロイしたスマートコントラクトに脆弱性が見つかった場合にはアップデートも困難で、これを突いてアセットを流出させたThe DAO事件なども発生しています。
そのため最初からセキュアなスマートコントラクトを記述すること、またデプロイ前にバグを発見することが非常に重要であり、本著では脆弱性の種類、実際の事例について解説されています。
10章 トークン
トークンの種類とトークンの標準についての、一般論とイーサリアムに関する具体論がまとめられています。
そもそもトークンには証券性を有するエクイティトークンと日常的な決済に用いることを想定しているユーティリティトークンがあり、イーサリアムにおいては両方の実装が可能で、トークンの標準規格としてERC20,ERC721を中心に解説されています。
なおイーサリアムにおいては、トークンはスマートコントラクト上で処理されますが、そのスマートコントラクトを実行するための通貨イーサ/ETHの残高はプロトコルレベルで処理されることに注意する必要があります。
本章ではトークンの実装まで紹介しており、フレームワークTruffleが使用されています。
11章 オラクル
スマートコントラクトに外部データを提供するための「オラクル」に関する章です(データベースを作っている米国のIT企業ではありません)。
オラクルはトラストレスを実現することを目的としており、セットアップ方法としてはリクエストーレスポンス型、出版ー購読型、即時読み込み型があること、またデータ認証のための真正性の証明やTEE、 計算オラクルについて解説されています。難易度は高いですが、オラクルについての解説は多くないため、非常に有用です。
12章 非中央集権型アプリケーション(Dapp)
Dapp(Decentralize Application)とはバックエンド、フロントエンドのソフトウェア、データストレージ、メッセージ通信、名前解決のうち一部・全てが非中央集権化されたアプリケーションのことです。イーサリアムのスマートコントラクトを活用することで、Dappの開発が可能になりました。具体例としてオークションサービスをあげ、アーキテクチャと一部のソースコードが記載されています。
DappではDNSの代わりにENS(Ethereum Name Service)が使用されています。
Dappsの開発においては、以下の本がオススメです。ブロックチェーンを用いた開発をしたいと思うエンジニアの方であれば、以下の著書と合わせて読むのをお勧めします。
13章 イーサリアム仮想マシン(EVM)
イーサリアム仮想マシンに関する章です。個人的には、ここまでくるともはや開発自体に直接的に役立つというよりも、コンピュータサイエンスの勉強をしている、という感覚が強くなってきますが…
イーサリアムにおいては、バーチャルマシンといってもVirtualBoxのようなハイパーバイザーというよりも、JVMと同じように、計算処理とストレージの抽象化を規定する側面が強く、状態(ステート)の遷移を更新する役割を果たします。
またチューリング完全に起因する停止性問題の解決のため、イーサリアムでは手数料としてGasが利用されます。
14章 コンセンサス
複数のコンピュータによる合意形成手法に関する章です。ビットコインではProof of Work(PoW)が利用されており、イーサリアムも当初はこのPoWを活用していましたが、現在では自身の保有量によってブロック生成確率が変動するProof of Stake(PoS)への移行を目指しています。
特にイーサリアムにおけるPoSのことをCasperと呼び、Ethereum2.0で実装されます。
なお本著の末尾にはフォークの歴史、EIP/ERC一覧、EVMオペコードとガス消費、開発ツール一覧などが付録として掲載されています。
少々長くなってしまいましたが、以上が各章の概要になります。マスタリング・イーサリアムに関してはかねてから邦訳の要望が多くありましたが、本著は待望の日本語版ということで、非常に濃く充実した内容でした。オリジナル版が公開されてから2年が経とうとしている今でも非常に新鮮で勉強になる内容が多いので、ぜひ皆さんもこれを読んでイーサリアムへの理解を深めてみてはいかがでしょうか?読後にはきっと「イーサリアムって面白い!」と思えるようになるでしょう。
開発者の方であればこちらの本もお勧めです。