密林の図書室

人生は短く、経験からのみ得られることは限られます。読書から多くのことを学び、アウトプット化も本との対話の一部として大切なものだと考えてきたので、このブログを立ち上げて日々読んできた本の備忘録として活用しています。過去に別名でAmazonのレビュー欄に掲載したものとそちらには未掲載のものがあり、後者は「Amazonレビュー欄未掲載」タグをつけてあります。

EthereumとQuorumの基本がよくまとめられた技術解説書。参考URLも豊富。『ブロックチェーン イーサリアムへの入り口 第二版 (ブロックチェーン技術書籍)』

著:日本電気株式会社、コンセンサス・ベイス株式会社

 

 

1.概要

 ブロックチェーンの一つであるイーサリウムについて技術的に解説した本。一般の人向けではなく、完全に技術寄りの本であり、ITとブロックチェーンに関する知識を持っているエンジニア用の本である。イーサリウムだけでなく、JP Morgenが開発したコンソーシアム型のQuorumについての解説も後半で登場する。

※以下に登場する図は、すべて本書よりの引用です。気に入ったら、買ってあげてください。

 

2.イーサリウムについて

 イーサリウムは、処理・蓄積・通信の3つの機能をネット上で完全に分散して行えることを目指して開発された。本書では、以下のようにコンポーネントを図にまとめて示している。

f:id:ColdSnap:20190421153355p:plain

 

 本番環境のMainnetは2018年9月現在でMetropolisまでリリースされている。Testnetの方は様々な種類がある。コントラクト作成言語としてはSolidity以外は奨励されていない。CLIはgeth。GUIとしてMistもあるが、本書では機能一覧のみ。

 

 イーサリウムのDappは、フロントエンド(HTML/Javascript)<->Web3.js API<->バックエンド(geth)という構成になっており、gethはイーサリウムネットワークに参加するノードとなる。

 gethは、「ネットワーク通信機能」「外部インターフェース機能」「管理機能」「マイニング機能」を持っている。また、コマンドライン、コンソール、JSON RPCサーバの3種類のインターフェースを提供している。プロセス間通信の仕組みとしては、IPC, Web Socket, JSON RPCがサポートされている。以下のgethの参加者の図はわかりやすい。

f:id:ColdSnap:20190421153430p:plain

 

gethコマンドの使い方や一覧は以下のURLで詳細が説明されている。

https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options

geth APIはDapp API( Web 3. js)と管理用API が あり、 JavaScript や geth コンソールで実行する。それぞれ以下のURLに詳細な説明がある。

https://github.com/ethereum/wiki/wiki/JavaScript-API

https://github.com/ethereum/go-ethereum/wiki/Management-APIs

 

3.アカウントとトランザクション

 イーサリウムのアカウントには、一般的なアカウントを示す「Externally Owned Account(EOA)」とコントラクトが配置されている先を示す「Contract Account」の2種類がある。

 

 トランザクションは、メッセージまたは新規コントラクトのプログラムを含み、 外部の操作者によって作成・署名される。トランザクションは処理の起点となり、その処理は ブロックチェーンに記録される。

 処理の分類とアカウントとの関係を示した本書の以下の図はわかりやすい。トランザクションの作成、ブロードキャスト、採掘者のトランザクション受け入れ、採掘に成功した採掘者からの有効なブロックの伝搬、という流れも別途説明されている。

f:id:ColdSnap:20190421153519p:plain

 

 Dappのクライアントプログラム例、プライベートチェーンのインストと立ち上げ例、EOAの管理についても記載されている。

 

 コントラクトの呼び出し方法いは、sendTransaction と callの2種類がある。コントラクトを利用停止するには、該当コントラクト内で SELFDESTRUCTを実行する。コントラクトは他のコントラクトにメッセージを送ることができる。コントラクトにはeventを仕掛けてその実行時に外部へ情報を伝達することができる。

 

 Solidity言語によるコントラクトコードの記述についても、具体的なプログラミングコードの例を示した説明がある。開発手順についても書かれている。また、Solidity言語の詳細については以下のサイトが紹介されている。

https://solidity.readthedocs.io/en/latest/

ただ、公式ドキュメントに記載のない仕様もあり、以下のフォーラムの参照も推奨されている。

https://forum.ethereum.org/categories/solidity

 

4.採掘とコンセンサスアルゴリズム 

 採掘においてはgasが必要になる。実行されたすべての命令が消費したgasの合計値がgasUsedになる。Mainnetにおけるgasの情報は以下のサイトでわかる。

https://ethgasstation.info/index.php

 採掘者とUncle(フォークして非メインチェーンとなった方)の採掘者への報酬は、以下のロジックで計算される。

  • 採掘者への報酬 = 5. 0 + Uncle 数* 5/ 32 + (gasUsed * gasPrice)
  • Ether Uncleに対する報酬 = 5. 0 * (7/ 8) = 4. 375 Ether

 

 イーサリウムでは、“Ethash PoW”という合意形成アルゴリズムを使用する。ブロック生成間隔は平均して15秒に1回なのでフォークの発生が多発する。また、Casperと呼ばれるProof-of-Stake(PoS) への移行が計画されている。

 

 イーサリウムのコントラクト実行環境はEVM(Ethereum Virtual Machine)と呼ばれ、すべての計算ステップはgasを必要とし、セキュリティについて考えられた構造になっている。World Stateはすべてのアカウント( EOA、 コントラクト)の状態をアドレス( 160ビットの識別子)として保持するKey-Value ストアデータベースであり、次の図ような構造を持っている。

f:id:ColdSnap:20190421153810p:plain 

 

5.Quorum

 Quorumは2018年9月にVersion2.02がリリースされた。Quorumはgethの機能をそのまま生かしながら、パブリックとプライベートの情報の分離、コンソーシアム型向けのコンセンサスアルゴリズムの採用(Raft Based/Istanbul BFT)、許可制、性能向上を行っている。

 

 Quorumはgethに相当するQuorumノードと、プライベートトランザクション用のConstellationノードから成る。さらに、ConstellationノードはTransaction Managerとデータの暗号化を行うEnclaveから構成される。また、ステートデータベースは、パブリック用とプライベート用に分けられている。

 A, B, Cの3つのパーティから構成されるQuorumネットワークでAとBの間のトランザクションのやり取りを、以下の図を用いて例示した解説もある。

f:id:ColdSnap:20190421153920p:plain

f:id:ColdSnap:20190421155749p:plain

尚、Quorumについては、以下のURLが紹介されている。

https://www.jpmorgan.com/country/US/EN/Quorum

 

6.よくまとまった技術解説書

 少なくともこれを書いている時点では、この第2版はKindle専用のようである。ここで紹介した内容はあくまでも一部。1000円以下で、日本語で書かれた解説に触れられる。図解も豊富だし、基本的なレベルとはいえプログラムサンプルもいくつかある。参考になるURLサイトもたくさん紹介されている。

 一部の専門家向けではあるが、EtherumやQuorumについて日本語での技術本を必要としていたので、とても役に立った。

ブロックチェーン イーサリアムへの入り口 第二版 (ブロックチェーン技術書籍)

ブロックチェーン イーサリアムへの入り口 第二版 (ブロックチェーン技術書籍)

  • 作者: 日本電気株式会社 金融システム開発本部 金融デジタルイノベーション技術開発室,コンセンサス・ベイス株式会社
  • メディア: Kindle版