3. Blockchain Basics & Cryptography
MIT OpenCourseWare で公開されている【Blockchain and Money】の授業を日本語で解説しています。第3回のテーマは、ブロックチェーンの基礎と暗号化技術です。
今日のStudy Question
ビットコインの特徴は?
ハッシュ関数、デジタル署名、公開鍵暗号方式とは何か?
第三回の授業では、サトシ・ナカモトが2008年に発表した論文、
Bitcoin: A Peer-to-Peer Electronic Cash System
の内容をもとに、ビットコインの技術的な特徴を解説しています。今日はハッシュ関数・ブロックヘッダー&マークルツリー、デジタル署名、公開鍵暗号方式がどのようにビットコインを構成しているかを見ていきます。
今回の内容は “How Blockchain Works” と題した別記事で、ビジュアルデモを用いて詳しく紹介しているので、ぜひそちらもご覧ください。
ビットコインの特徴
ビットコインが世に初めて現れたのは、2008年にサトシ・ナカモトという人物によって発表された論文でした。よくある誤解として、ブロックチェーン = ビットコインと思われがちですが、実は彼の論文に「ブロックチェーン」という言葉は一回も出てきません。
ブロックチェーンというのは、いくつかの技術が集まったものです。実際サトシ・ナカモトによる論文には、それらの技術がビットコインにおいてどのように働いているのかが書かれています。
ビットコインに使われている技術は、大きく3つに分けられます。
暗号化技術関連
- ハッシュ関数
- ブロックヘッダー&マークルツリー
- 公開鍵暗号方式&デジタル署名
コンセンサス・プロトコル関連
- プルーフ・オブ・ワーク
- ノードによるネットワーク
- 独自トークン(通貨)
トランザクション台帳関連
- 取引のインプット&アウトプット
- UTXO(未使用トランザクションアウトプット)
今回は1つ目の暗号化技術関連について見ていきましょう。
ハッシュ関数
第一回の授業で取り上げましたが、暗号学というのは敵前でのコミュニケーションとして発展してきました。古代スタキュレー暗号から、第二次大戦中ナチスのエニグマ暗号機、そして今日の公開鍵暗号方式に至ります。
ハッシュ関数とは、デジタルデータの証明方法のひとつで、いかなるサイズのデータも一定のサイズの文字列にして返す関数です。
わかりやすい例が郵便番号です。郵便番号は、日本中のどんな住所でも7桁の数字にして表すことができるという点で、ハッシュ関数の仲間です。
また、データ内容が全く同じである場合、常に同一のハッシュ値が返ってくるのも特徴です。このような作業を一瞬で計算してくれるためハッシュ関数は極めて効率的なアルゴリズムと言えます。
ハッシュ関数の特性
原像計算困難性(プリイメージ・レジスタンス)
ハッシュ関数は一方通行の関数です。ハッシュ値からは元のデータを求めることはできません。これを原像計算困難性と言います。
衝突耐性(コリジョン・レジスタンス)
同じハッシュ値をもつ2つの異なるデータは存在しません。このように、どのデータにも唯一固有のハッシュ値があり、これを衝突耐性と言います。
アバランシェ効果
データ内容を少し変更しただけでも、ハッシュ値は大幅に変更されます。アバランシェとは「雪崩」という意味で、初期の状態が少しでも変わると、結果が著しく変わってしまう効果のことです。
パズル親和性
ハッシュ値と入力されたデータの一部がわかっていても、データ全体を求めることはできません。これをパズル親和性と言います。
ゲンスラー教授は講義の中でこれらの特性を開発するとき、“impossible” ではなく “infeasible” という言葉を使っています。ブロックチェーンに「100%不可能」ということはなく、量子コンピュータなどによってこれらの暗号が破られる可能性も示唆していました。
ちなみに、これまでの中で世界最長のハッシュ関数は、ビットコインではありません。1991年、スチュワート・ヘイバーというアメリカ人研究者が “Surety”という会社を立ち上げ、彼らの出したハッシュ値がニューヨークタイムズに毎週掲載されていました。つまり、ビットコインの発表以前にタイムスタンプ付きハッシュ関数が存在していたのです。
この “Surety” については、サトシ・ナカモトの論文で実際に参照されています。
ブロックヘッダー&マークルツリー
ブロックヘッダー
ブロックヘッダーというのはブロックを構成する要素の1つですが、そこにはさらに5つの要素が含まれています。
- ブロックのバージョン番号
- 1つ前のブロックのハッシュ値
- タイムスタンプ
- ナンス
- マークルルートのハッシュ値
以上の5つの要素をあわせてブロックヘッダーと言います。
そして、このブロックヘッダーだけを検証するのをライトノード、全ての取引を検証するのをフルノードと言います。
ちなみにゲンスラー教授曰く、ナンスというのは
一度しか使えないランダムな数字(Number of ONCE)
だから、ナンス(Nonce)みたいです。わかりやすい覚え方ですよね。
マークルツリー
マークルツリーとは、上記の図のような取引データの二分木のことです。2つのハッシュ値を1つにまとめる作業を最後の1つ(マークルルート)になるまで行うのです。では、
前のブロックのハッシュ値が変更されれば、マークルルートも変化するのでしょうか?
答えは、Noです。
マークルツリーとは、1つのブロックにある1000個の取引をまとめたものでした。仮にブロック(A) → ブロック(B) の順番だとすると、マークルルートはあくまでもブロック(B)内の取引を1つにまとめたものなので、前のブロック(A)のハッシュ値が変わっても、マークルルート自体に変更はありません。
ブロックヘッダーの要素にある「1つ前のブロックのハッシュ値」と「マークルルートのハッシュ値」は違うのです。なので、マークルルート自体に変更はなくても、最終的なブロックBのブロックヘッダーには影響してきます。
公開鍵暗号方式&デジタル署名
公開鍵暗号方式
ビットコインで使われている公開鍵暗号鍵方式に対して、従来の暗号技術は共通鍵暗号方式と言います。これはその名の通り、送る側と受け取る側が同じ鍵をもっている暗号方式です。
しかし、双方が同じ鍵しか持っていなかったら敵に奪われてしまったときに取り返しがつきません。そこで1970年代、ある技術者が
「送る側と受け取る側の鍵を、数学的な関係で繋がった異なるものにできないか?」
と考えました。そして生まれたのが公開鍵暗号鍵方式です。
この暗号方式では、「公開鍵」「秘密鍵」という2つの鍵が出てきます。以下のようなプロセスによって、片方によって暗号化されたメッセージがもう片方に送られます。
- アリスはボブに対して、 “Hello, Bob!” という文章を送りたい
- アリスはこの文章を、ボブの公開鍵を使って暗号化しボブに送る
- ボブは送られてきた暗号を、ボブの秘密鍵を使って解読する
これにデジタル署名が加わります。
デジタル署名
デジタル署名とは、送られてきたデータが間違いなく本人のものであるのかを証明するのための技術です。ハッシュ関数と同様に一方通行で、公開鍵から秘密鍵を特定することはできません。
ビットコインでは、公開鍵暗号方式とデジタル署名を組み合わせることによって、より安全な暗号化技術を構築しています。
公開鍵&秘密鍵のペアを生成
送る側が署名(署名するにはメッセージ+自分の秘密鍵が必要)
受け取る側が検証(検証するにはメッセージ+送る側からの公開鍵)
実際に行われているプロセスはこんな感じです。
今日はビットコインの3つの特徴のうち「暗号化技術」を解説しました。ハッシュ関数・ブロックヘッダー&マークルツリー、デジタル署名、公開鍵暗号方式を取り上げました。
今回の講義を含め、これからあと2回の授業を通してサトシ・ナカモトの論文を解説していきます。次回のテーマは、「ブロックチェーンの基礎とコンセンサス」です。