Bitcoinの仕組み

Bitcoinは、銀行のような中央を経由せず、直接、1対1で通貨のようなものを取引できる仕組みである。これはつまり、サーバー・クライアントモデルに基づいた信用によらず、取引ができるということである。

この仕組みは、P2P(Peer-to-peer)技術と、公開鍵暗号などの暗号技術を用いて実現されている。このような「通貨」は、Bitcoinによってはじめて実現されたが、現在、同様の仕組みを用いた通貨は、Bitcoinの他にも多数存在する。(Bitcoinの歴史Bitcoinの派生通貨)これらをまとめて、「暗号通貨」(Cryptocurrency; クリプト・カレンシー)と呼ぶ。

ファイル共有VoIPなどで用いられるP2P技術には、様々な凝ったアルゴリズムが存在している。しかし、Bitcoinはそういったアルゴリズムとは無縁の、非常に単純な構造のP2Pのネットワークを形成している。この単純さはBitcoinの堅牢性にも繋がっている。「暗号通貨」という名前に反して通信も暗号化されていない。

取引履歴で通貨を表現

P2Pで、いかにして通貨を表現するかを考えよう。

Bitcoinでは通貨を、コインの経てきた、すべての取引履歴のかたまりとして表現する。具体的には、「トランザクション」(Transaction; 取引)を以下のように定義する。各トランザクションは、前のトランザクションのハッシュ値や、新たな所有者の公開鍵を含み、元のコインの所有者の暗号鍵によって電子署名されている。全てのトランザクションの情報は、P2Pネットワーク全体で共有される。

図: トランザクションの定義

図: トランザクションの定義

一見分かりづらいかもしれないが、取引をこのように表現することで、すでに通貨としての多くの特性を表現できていることが分かる。例えば、あるコインについて、元の所有者の許可なく、コインを本人以外が勝手に譲渡することはできない。また、第三者は、ある人からある人へのコインの譲渡を、客観的に確認することができる。

しかし、この仕組みだけでは、これを通貨として用いることはできない。なぜならば、二重譲渡を防ぐ仕組みがないからである。二重譲渡とは、元のコインの持ち主が二人以上の相手に、全く同じコインを譲渡することである。通貨として用いるためには、どちらの譲渡のみを、ネットワーク全体で、正しい取引として決定する必要がある。一般的には、時系列的に後のトランザクションを無効とみなすのが自然だ。しかし、これらの取引はP2Pネットワーク上でなされるので、ネットワーク全体として見たとき、どちらが先に行われた取引かということを、確実には決定できない。

ブロックチェーンで二重譲渡を防ぐ

重要なのは、ネットワーク全体で、特定のどちらか一方のみを一貫して、正しい取引であると決定できることである。前の節で説明したとおりに通貨を表現することにより、不正を働くことができるのは、コインを持っている人だけとなっている。したがって、矛盾する二つの取引のあるとき、厳密にどちらの取引が先になされたかというのは、あまり重要でない。

そこでBitcoinで導入されたのが、「ブロックチェーン」(Block Chain; ブロック鎖)という仕組みである。それぞれの「ブロック」(Block)は、多数のトランザクションと、あとで説明する「ナンス」(Nonce)と呼ばれる特別な値、そして直前のブロックのハッシュを持っている。「ブロック」に含まれた取引のみを「正しい取引」と認めることにする。そして、ネットワーク全体で「唯一のブロックの鎖」を持つようにする。これによって、一貫した取引履歴を全体が共有できる、というのがブロックチェーンのコンセプトである。

図: ブロックの定義

図: ブロックの定義

しかし、ここで当然のように、誰が「ブロック」を作成するのかという問題が生じる。特定の誰かのみにブロックを生成する権限を与えたら、「特権的立場を持った存在のいない誰もが平等な通貨」という性質が失われてしまう。かといって、誰でも無条件でブロックを生成することができたら、どれが「唯一の正しいブロックの鎖」なのか、誰にも分からなくなってしまう。

仕事の証明によるブロックの生成

ここで用いられるのが「仕事の証明」(proof-of-work, PoW; プルーフ・オブ・ワーク)と呼ばれる仕組みである。 それぞれのブロックについて、SHA-256ハッシュを取ることを考える。このハッシュの先頭に、一定の数以上の0が並んでいるブロックのみを、「正しいブロック」として、ネットワーク全体で認めることにする。ブロックには、ナンスと呼ばれる特別な値が含まれていたことを思い出してほしい。ナンスを変えることで、ブロック全体のSHA-256ハッシュを変化させることができるので、条件を満たすようなハッシュを持ったブロックを作ることができる。

図: 頭に0の並んだ、実際のブロックのハッシュ

図: 頭に0の並んだ、実際のブロックのハッシュ(Blockchain.info

SHA-256などのような暗号学的ハッシュ関数は、ハッシュ値から、簡単にデータを逆算できないように設計されている。(必要な予備知識)したがって、全探索・総当り以外の方法で、条件を満たすようなナンスを探すことはできない。これは、計算資源を使わないと、条件を満たすブロックを生成することができないということである。これによって、ブロックの作成に「誰でも作成できる訳ではないが、特定の誰かのみが作成する権限を持っている訳でもない」という性質を持たせることができた。P2Pネットワーク上の各ノードは、ナンス値を変化させながら、全探索・総当りをし、条件を満たすブロックを発見しようと努力する。そして、これをみつけたノードは、そのブロックを他ノードに配信し、ネットワーク上の全てのノードがこれを認めるのである。

ブロック生成の難易度は、過去のブロック生成速度に応じて、およそ10分に1個のブロックが発掘されるよう、適切な値が設定されるようになっている。(Bitcoinの細部) コンピュータの性能は爆発的に向上してきていることが知られている。これは、もし探索の難易度(つまり、ハッシュの先頭にいくつ0が必要か)が一定のままだとすると、やがてブロックはただ同然の計算資源で生成できるようになってしまうということを意味する。また、ネットワークに参加するノードが増えるにつれてブロックの生成速度が次第に速くなっていってしまうということも意味し、これも同様に望ましくない。したがって、難易度を変化させる必要がある。

実際のブロックチェーンのデータは、Blockchain.infoなどで閲覧することができる。

マイニングによる利益

前の節で、ブロックの生成には計算資源を使う必要があることを説明した。しかし、ブロックの生成に見返りがなければ、わざわざコストをかけてコンピュータや機材を買って、ブロックを生成してくれる人はいないだろう。したがって、ブロックの生成には報酬がある。

報酬は、それぞれのブロックの先頭にある、コインベース(coinbase)と呼ばれる、特殊なトランザクションによって実現されている。このトランザクションは、誰かから誰かへのコインの譲渡を表すのではなく、コインの生成を表すトランザクションである。受取先はブロックの生成者である。この特殊なトランザクションのおかげで、ブロックを生成すると生成者は、一定額の定められたコインを報酬としてもらうことができる。

Bitcoinを金などの鉱物になぞらえたとき、ブロックの生成は採掘作業ともみなせる。よって、ブロックを生成することは一般に「マイニング」と呼ばれている。

正しいブロックチェーンの決定

以上の仕組みによって、中央を持たずとも、Bitcoinネットワークは正しいブロックチェーンを作り上げていくことができる。しかし、ここまでの仕組みだけでは、ブロックチェーンが絶対に分岐しないことを保証するには不十分である。そのためBitcoinは、分岐点から先がより長いほうのブロックチェーンを、常に正しいブロックチェーンとして認める、という規則を導入している。

図: ブロックチェーン

図: ブロックチェーン

これは単純な方法であり、一見してまだ不十分であるようにも見える。しかし、Bitcoinの原著論文では、これについて、確率論的な説明がなされている。(論文(PDF)の11章)論文によると、攻撃者とブロックチェーンの伸ばし合い競争をした場合、善意のノードの持つ計算資源が、攻撃者のそれより少しでも多いかぎり、攻撃者がブロックチェーンを乗っ取れる可能性はきわめて低いとされている。

まとめ

Bitcoinは、

以上がおおまかなBitcoinの原理の説明である。登場した概念の中で、本当の意味で、多くの人々にとってなじみのないものは、仕事の証明ぐらいだろうと思う。Bitcoinの原理自体は決して難解でないという事がご理解いただけただろうか。

Bitcoinウォレットの比較」につづく