『仮想通貨の教科書』 第1章 暗号理論と仮想通貨入門
『仮想通貨の教科書』の 第1章暗号理論と仮想通貨入門 を読んだのでメモ。
前回のはじめにでは仮想通貨の歴史とサトシ・ナカモトについて簡単に説明しました。
第1章では、仮想通貨に基本となる暗号の説明と「Goofycoin」と「Scroogecoin」というふたつの単純な仮想通貨を例に、仮想通貨を実現するためにはどんな難しさがあるのかを説明しています。
第1章 暗号理論と仮想通貨入門
あらゆる通貨は、供給をコントロールするための手段と不正行為を防止するための機能が求められる。
仮想通貨も同様で暗号理論を多用しているため、暗号通貨とも呼ばれている。
暗号理論は難しい分野だが、仮想通貨に利用されているものは比較単純でよく知られている少数の暗号要素だけである。
第1章では「暗号学的ハッシュ」と「電子署名」の2つの暗号要素について学ぶ。
あとの章で「ゼロ知識証明」などのより複雑な暗号スキームについて紹介する。
1.1 暗号学的ハッシュ
この本では一般的なハッシュ関数ではなく、暗号学的ハッシュに絞って説明する。
具体的に以下の3つの要素について紹介。
(1)衝突耐性
(2)秘匿性
(3)パズル親和性
特に(3)パズル親和性は仮想通貨だけで役に立つ属性である。
1.1.1 属性1:衝突耐性
衝突とは2つの異なる入力が同じ出力を生成することである。
2つの値x, y が x ≠ y の時に H(x) = H(y) が見つけられるときに衝突となり、
見つけられない場合に衝突耐性があるといえる。
具体的なハッシュ関数の説明はここでは省略。
私が知らなかったこととしては、衝突耐性があることが証明されたハッシュ関数は存在しない、ということだ。
現在利用されているものはまだ衝突が見つかっていない関数というだけ、ということだ。
1.1.2 属性2:秘匿性
秘匿性はハッシュ関数の出力 y = H(x) を見たときに入力xが何かわからないという性質である。
秘匿性の応用として「コミットメント」が挙げられている。詳しくは本書をお読みください。
1.1.3 属性3:パズル親和性
この部分がビットコインのマイニングの時に利用するハッシュ関数の属性である。
パズル親和性とは、
「ある出力値 y を得たいと思ったとしても、入力の一部が適切な程度に無作為に選ばれていれば、 y を得られるような入力値 x を見つけるのが難しい」
という性質である。
数式で表すと
H(id || x) ∈ Y
H:ハッシュ関数
id:無作為に選ばれた値(乱数)
x:入力
Y:ターゲット集合(ビットコインでいう先頭17個0が続く値など)
となる。
この時にYの集合の範囲を調整することで難易度を変えられるようだ。
1.2 ハッシュポインタとデータ構造
ハッシュポインタは通常のポインタの機能(ポインタが指している情報を取り出す)に加えて、情報が書き換えられていないことを確認できるものである。
ハッシュポインタを使った連結リストが「ブロックチェーン」である。
ブロックチェーンはチェーン(連結リスト)の中間を改ざんしようとしたときに端から端まで改ざんしなくてはいけなくなるという性質を持つ。
1.2.2 Merkle木
Merkle木はハッシュポインタを使った二分木のことで、発明者のRalph Merkleの名前が由来である。
Merkle木もブロックチェーンと同様に一つを改ざんしようとするとその上のレベルのデータと一致しなくなるため、改ざん検知ができる。
ブロックチェーンにない特徴としては「メンバーであることの証明(proof of membership)」が簡潔にできることである。
特定のブロックが木の含まれるかどうかを短時間(おおよそlog(n))で証明できる。
同様に「メンバーでないことの証明」もこのMerkle木を使えば可能となる。
1.3 電子署名
電子署名は2つの属性がある。
1.あなたの署名をすることができるのはあなただけだが、署名を見た人は誰でもそれが有効だということを確認できる属性
2.署名と署名をした文章は密接に結びついているため、その署名を別の文章に使えない属性
属性1は署名がそもそも利用できるために必要なもので、属性2は「偽造不可能性」でほかの人に偽造できないことを証明する必要がある。
「偽造不可能性」を証明するときには、「攻撃者」と「挑戦者」で「ゲーム」を使って
定式化するのが一般的。
電子署名は公開鍵と秘密鍵を利用して署名する公開鍵暗号の技術を利用するが詳しくは
こちらを読んでほしい。
ここで気になったのはビットコインは「楕円曲線DSA (ECDSA) 」を利用しているのが、より具体的にいうとsecp256k1という標準のECDSAを利用している。
しかし、これはビットコイン以外では使われているものがとても少なく、一般はsecp256r1曲線を利用しているらしい。
なぜ、このようなあまり一般的でないものを選択したのか。
この本には書かれていなかったので「secp256k1」と「secp256r1」とにどのような違いがあるのか簡単に調べたところ
「secp256r1」はNISTによって開発されたものだが
「secp256k1」はNISTではなくカナダを拠点とするCerticom社に開発された
という違いがあるらしい。
スノーデンの事件からNISTの開発した暗号方式にはバックドアが仕掛けられている可能性があるなどの不安などからこのような選択が取られたのではないかと思う。
1.5 2つの単純な仮想通貨
2つの単純な仮想通貨を例に取り上げ、暗号理論を使ってどのように仮想通貨でできているのか、どんな問題にぶつかるのか、について書かれている。
1.5.1 Goofycoin
もっとも単純な仮想通貨の例「Goofycoin (間抜けなコイン)」。
いつでも好きなときに新しいコインを鋳造でき、新しく鋳造されたものは作成者のものになるというもの。
新しくコインを鋳造するGoofyは鋳造したときにコインに署名をする。そうすることでそのコインはGoofyが鋳造した有効なコインであることがわかる。
GoofycoinをGoofyがアリスに送るときには、「アリスにこのコインを送る」というメッセージを作成してGoofyが署名することで行うことができる。
実際には「アリス」の部分がアリスの公開鍵の情報となり
「このコイン」がGoofycoinのハッシュポインタになる。
Goofyによって署名されているので有効性を誰にでも証明できる。
アリスがボブにコインを送るときも同様に行い、誰でもハッシュポインタをたどればハッシュの作成時に到達できるのでコインの有効性も確認できる。
しかし、この単純なGoofycoinでは「二重支払い攻撃」に対応できない。
アリスがボブにコインを送り、同じコインをチャックに送り、そのメッセージにも同様に署名をすることがこのコインではできてしまうのだ。
1.5.2 Scroogecoin
二重支払いの対策として「Scroogecoin (守銭奴コイン)」を新たに考える。
Scroogecoinの重要なアイデアは、Scroogeがすべての取引の履歴を記録する追記専用台帳を公開することである。
取引を完了するためには台帳への記入が必要であるならば二十払いの対策にもなる。
追記専用台帳を作成するためにブロックチェーンのデータ構造を利用する。
個々のブロックに、取引ID、取引内容、前のブロックを指すハッシュポインタを持つ。
Scroogecoinでは、Scroogeが署名したブロックチェーンのみを正しい取引とするため
Sroogeの署名があるかどうかをチェックするだけですでに利用されていないかの確認もできる。
二重支払いの対策ではあればScroogeが署名をすれば防げるのに何故ハッシュポインタを利用したブロックチェーンを利用するのか。
それは、Scroogeが取引を追加、削除しようとしたり、既存の取引を書き換えようとしたりできないようにするためである。
もし書き換えようとしてもハッシュポインタのために、その後のすべてのブロックに影響を与えることになる。
最新のポインタを利用者が監視し続けていればScroogeによって書き換えられたりしていないことを確認できる。
しかし、Scroogecoinにはまだ大きな問題がある。
それはScroogeの影響力が大きすぎる点である。取引の偽造はできないが、一部の利用者の取引を承認しない、サービスを利用できないようにするなどのことはできてしまうからだ。
この問題は中央集権的システムの問題である。実際の通貨では政府による中央集権型で上手く行っているが、今までの仮想通貨では中央に権威者を置く形で失敗してきた。
失敗の理由は多くがあるが、ひとつにはやはり中央に権威を持つ形を利用者が受け入れることができなかったからだと考えられる。
次の第2章ビットコインが非中央集権を実現している仕組みについてまとめたいと思う。