最近ようやくブロックチェーンの技術的側面に関する勉強を始めることができた。まず最初に読んでみたのが、2017年春頃発売されて以降、アメリカなどでベストセラーになっている『Blockchain Basics』という本。大ヒットをきっかけに様々な言語に翻訳されているようで、日本語訳も今年の夏に発売された。日本のタイトルは『徹底理解 ブロックチェーン』で技術書の翻訳などを手がけている株式会社クイープさんによって翻訳されている。
これがすごいわかりやすくて感動したので、ブログでも紹介しておきたい。ブロックチェーンのビジネス本だと技術にはほとんど踏み込まずに、応用先の話しか取り上げられないことが多い。また技術的部分が説明されていても、いまいちピンとこないレベル感の説明しか行われない。(もちろん、ビジネス書なのでそれは悪いことではない。)
そこで技術により踏み込んだ本として今回この本を読んでみた次第である。技術書・教科書としてはMastering Bitcoinなどがバイブル扱いされているのをよく見聞きするが、「その本に入る準備として良い」とブロックチェーンに詳しい下記ブログでも紹介されていたのも私を後押ししてくれた。
この本のAmazonの書籍紹介ページによると、
どのようなデータの固まりがどのようにつながっているか。その機能や仕組みはどうなっているのか。分散システム、P2P、所有権、二重支払い、ハッシュ、非対称暗号鍵、分散コンセンサス…ブロックチェーンの重要ポイントを1つ1つ説き明かす!「非対称暗号鍵は郵便箱」「データ格納は蔵書管理」といった例えを用いて技術の仕組みをイメージしやすくしています。取り上げるテーマは、ブロックチェーンの目的、可能性、必要性、各種機能、限界/克服など。本書はブロックチェーンの基礎的な概念をしっかりと理解したい人に格好の一冊です。─原著への読者の声─「理解を確実にするのにたいへん役に立つ」「徹底的な理解が目的なら上位3冊に入る」「ブロックチェーンのベストブック」─原著は米Amazonの複数カテゴリーで第1位。
とのこと。技術を理解することに主眼があるものの、数式はほとんど登場しないので、まさに最初の1歩という感じだ。上のブログにも書いてあるとおり、デベロッパーへの第一歩としても使えるし、ビジネスサイドの人がちゃんとした知識を身につけるためにも使える。
「25のステップ」という形で進められる本で、一つひとつのステップで、あるテーマを扱う方式になっている。ブロックチェーンは実に様々な技術が融合される形で用いられているので、それらを一つ一つ解説したり、融合させたり、さらに別のコンポーネントを解説したりと、無理なくステップアップしていく構成になっていた。ちなみに私は読み通すのに6〜7時間ぐらいかかったと思う。「ステージ3」の部分がメインディッシュ。わからないところがあっても、2回ぐらい読み直せばだいたい「なるほど」と腹落ちできる。前提知識も、ブロックチェーンのビジネス書を1,2冊読んだことがある人であれば大丈夫なはず。
雰囲気が伝わるように、各ステップの内容を簡単に紹介していこう。さらに内容が知りたくなった方は、ぜひ本書を読んでみてはいかがでしょう?
Stage1 ブロックチェーンの目的と可能性を知る
Step1 レイヤと機能面/非機能面について考える
ソフトウェアエンジニアリングの一般的な原理を紹介することから始まる。具体的にはソフトウェアシステムのレイヤの話で、
- アプリケーション層(ユーザーのニーズに関連しているか)と実装層(ニーズを実現することに関連しているか)の軸
- 機能面(データ送信や写真撮影、音楽再生など)と非機能面(きびきびとした動作、GUI、機密性など)の軸
という2種類の軸でソフトウェアの特徴や機能を整理していくことができる。
非機能面の大事なことの一つに「完全性」があり、ブロックチェーンを議論する上で頻繁に登場する概念。「完全性」をさらに分解すると、データ完全性、振る舞い完全性、セキュリティの3つの項目が挙げられる。
Stage2 ブロックチェーンはなぜ必要か
Step4 問題の核心を明らかにする
純粋な分散型のP2Pシステムにおいて、「完全性の維持」が大きな課題となるのだが、それはなぜか?
1つ目の理由は技術的な障害があるからで、例えば構成要素がダウンしたり、エラーを起こすかもしれない。2つ目の理由は、悪意を持つピアがいるからで、悪意を持つピアがいれば、他のピアがシステムから撤退してしまう、リソースを提供するノードがいなくなるから。
すべてが最悪の状態にある分散システムにおいて、どうすれば完全性を達成し、信用を獲得できるのかに関心がある。これをブロックチェーンを用いて行いたい。
Step5 用語の定義を明確にする
ブロックチェーンという用語の定義。人によって異なる意味で利用していることが多々あるとのこと。
Step6 所有権の性質を理解する
ブロックチェーンの応用例の一つとして、「所有権の管理」を紹介。「何かを所有していると言えるのはなぜ?」という疑問に答える。
例えば、自分のカバンにあるスーパーで購入したリンゴが入っているのだが、それを持って別のスーパーに入ったときに、店員にカバンの中のリンゴについて指摘されたとする。自分は万引きしていないことを証明するにはどうすればよいだろうか?
一つは購入したもとのお店の店員に証人になってもらう方法。でももしかしたらお金を払って嘘の証言を頼んでいる可能性もあるじゃない?なので一人では説得力が欠けるが、大勢の証人がいたら説得力が増すし、全員が嘘をついている可能性は少なくなる。あくまで比喩であるが、これが後に説明するブロックチェーンの基本概念の一つに関連してくる。
所有権の証明には
- ①所有者の識別
- ②所有する物品の識別
- ③所有者と物品のマッチング
の3要素がある。所有権は台帳に記録することが多いが、破損したり破壊されたりするリスクがある。なので複数の台帳を管理すれば良い。台帳の大多数が同意する真実に基づいて所有権に関するリクエストを解決すれば良い。
Step7 二重支払い問題とは
二重支払い問題を取り上げる。これはAさんがBさんに家を売る、より抽象的には所有権を譲渡したときに、そのことをすべての台帳に書き込まなければならない。ピアが情報を伝達していくが、先回りして情報が届いていない台帳を見つけて、AさんがCさんに家を売ったと記述する。そうるとAさんが二人に一つの家を売ったことになってしまう。これが二重支払いの1種。
他には、デジタル資産のコピーの問題(通貨をコピーして何度も使う)もある。これらの解決策として、ブロックチェーンを用いることができる。
Stage3 ブロックチェーンはどう機能するか
Step8 ブロックチェーンの設計を考える
所有権を管理するために「複数の台帳からなる純粋な分散型のP2Pシステム」を設計する上では、7つのタスクがある:
- 所有権を記述する
- 不正アクセスから所有権を保護する
- トランザクションデータを格納する
- 信頼できない環境に分散される台帳を準備する
- 分散型の台帳からなるシステムを構築する
- 台帳に新しいトランザクションを追加し、検証する
- 真実を表している台帳を特定する
この本の大部分は、これらのタスクをいかに行うか、ということを説明することに割かれていて、そこが本書の魅力。
Step9 所有権の文書化
ブロックチェーンで所有権を文書化することに話が移る。トランザクションデータというのは所有権の譲渡を表す情報で、様々な情報が含まれる。この完全な履歴は監査証跡となり、証拠になる。トランザクションデータの完全性はシステム全体の完全性に影響する。
Step10 データのハッシュ化
あらゆる種類のデータに対する「指紋」があれば便利。そのデータが唯一無二であることを証明することに利用できるからである。そのためにハッシュ関数を用いる。入力としてデータを一つだけ受け取り、ハッシュ値を生成する。ハッシュ値から元データを予測することはできなく、一方向性関数や不可逆であると言われる。入力データが同じならハッシュ値も同じになる。まったく異なるデータから同じハッシュ値が生成される可能性は非常に低い。衝突耐性があると言う。もし同じハッシュ値になってしまったら、それはハッシュ衝突と呼ぶ。
データをハッシュ化する様々なパターンを紹介
- 独立ハッシュ
- 繰り返しハッシュ
- 結合ハッシュ
- 逐次ハッシュ
- 階層型ハッシュ
Step11 ハッシュ化の使用パターン
- ハッシュ値があれば、データを比較したり、計算パズルを作ったりすることができる。
- データの比較とは、2つのデータのハッシュ値を生成しておき、それらのハッシュ値が同じであるかどうかを検証すること。元データを直接比較せずに検証していることがポイント。
- これはデータの変化検知にも使える。Beforeのハッシュ値とAfterのハッシュ値が同じかどうか検証すれば良い。これはデータベースへ格納する前後だったり、時間の経過の前後だったり。
- ハッシュ参照:手荷物預かり所の引換券のようなもの。引換券は荷物が入っている場所を示している。ハッシュ参照は、暗号ハッシュ値を活用し、データの在り処を指すこと。参照先のデータが変更されていれば、ハッシュ参照は無効になる特徴がある。誤って変更されてしまったデータをユーザーが取得しないようにすることもできる。
- 引換券をまた別の荷物とともに預かり所に渡せば、別の引換券がもらえる。このようにデータの連鎖を作ることもできる。各データに別のデータへのハッシュ参照が含まれており、リンクリストとも呼ぶ。一番最後にある引換券のことを「チェーンのヘッド」と呼ぶ。
- マークルツリー(木)と呼ぶ形式:ハッシュ参照を2件ずつまとめてハッシュ参照を作ることを繰り返す。
- ハッシュパズルは4つのパーツでできている
ここの仕組みの説明はわかりやすくて感動した。ハッシュパズルはプルーフ・オブ・ワークとも呼ばれるヤツ。
Step12 ユーザーアカウントの識別と保護
ここは暗号学入門。
暗号化、復号化、対象鍵暗号や非対称鍵暗号、公開鍵と秘密鍵などが解説されていき、こちらもわかりやすい。ブロックチェーンでは非対称鍵暗号を利用している。一つはユーザーアカウントが公開鍵暗号に相当する。トランザクションの承認では「秘密鍵から公開鍵」方式を利用。
Step13 トランザクションの承認
資産譲渡に対して所有者が同意していることを証明するにはどうすればよいのか?を扱う。
トランザクションデータに対してハッシュ値を作成し、秘密鍵でデジタル署名に変換する。元データとセットにしてメッセージを送信する。受け手は公開鍵で復号化し、もとのメッセージのハッシュ値と一致すれば、この公開鍵に対応する秘密鍵の持ち主が同意していることの証明になる。
Step14 トランザクション格納の仕組み
ついにブロックチェーンデータ構造に踏み込んでいく。
各ブロックの構成要素(ブロックヘッダーとマークル木)、ブロック同士の連鎖が解説されていく。ブロックヘッダーは前のブロックヘッダーのハッシュ参照になっている。マークル木はトランザクションデータを表している。
Step15 データの追加と変更の仕組み
Step16 追加専用のデータストアにする
不誠実なピアが偽造しないようにするために、トランザクション履歴を変更できなくし、不変性(イミュータビリティ)をもたせたい。そのためには、トランザクション履歴を変更すると法外なコストがかかるようにすればよい。
ここでハッシュパズルの出番!どのようにハッシュパズルをそれぞれのブロックヘッダーに組み込むのかが、説明されていく。この結果、あるデータを変更しようとすると、ヘッドまでのすべてのデータに付随するハッシュパズルを解かなければならなくなり、高コストすぎて割に合わなくなる。面白くなってきたヨゥ!
Step17 データストア分散の仕組み
トランザクション履歴が一つだけでなく、情報を共有する方法として純粋な分散型P2Pシステムを確立するにはどうすればよいか?という点に技術的に踏み込んでいく。
インターネットを通してシステムを構築し、ゴシップスタイルで情報が送信される方法が紹介される。ノードがそれぞれ他のノードとの接続を確認し合うping pong、新しい接続を確立するときの詳細、また新たな情報を配布するときのプロシージャも示されていてわかりやすい!
Step18 トランザクションの検証と追加
どうすれば有効なトランザクションだけをブロックチェーンデータ構造に追加できるだろうか?という課題を取り上げる。
検証ルール、報酬、罰則、(速さと品質の2つの)競争、ピアコントロールなど、ブロックチェーンの重要概念が次々と解説されていく。すべてのノードがトランザクションを性格に処理し、他のピアを監視して間違いを指摘することに意欲的になる仕組みになっている。過半数のノードが誠実であれば、不誠実なノードが紛れ込んでいても不誠実な行動は失敗する話。
Step19 トランザクション履歴の選択
- 矛盾する2つのトランザクションがあればどちらを選択すればよいのか?
- 分散コンセンサスとはなにか?
などに答えていく。
「最も重いチェーン」「最も長いチェーン」という基準が紹介される。パスを選択するということに従って、「孤立ブロック」が出てきたり、報酬を回収する必要が生じたりする。深い位置にあるブロックがなぜ信頼できるのか、自然に理解できる。
Step20 完全性の代価
貢献してくれたピアに対して補償に手数料を渡す仕組みが必要。支払手段は完全性、開放性、分散性を備えているか?デジタル形式で、世界のどこでも使えて、価値が安定している、信用があるもの、中央の組織に管理されないものが望ましい。ここでクリプトカレンシーという概念が浮上してくる。
Stage4 制限とその克服方法
Step22 制限を明らかにする
ブロックチェーンはオープンだがプライバシーの欠如が生じるし、ハッシュパズルという計算コストがかかるのでスケーラビリティに欠けるなど、様々な制限がある。他にも隠れた中心性(一部のピアによる寡占状態になる可能性)や柔軟性の欠如、クリティカルマスが解説されていく。軸としては技術的制約と非技術的制約(ユーザーが受け入れてくれるか、法規制についてなど)に分けられる。