Bitcoin入門

この文章は、この記事
https://en.bitcoin.it/wiki/Introduction
を参考にし、部分的に翻訳しつつ、さらに個人的な解釈を加え、加筆したものです。
Bitcoin(ビットコイン)に対して、より正しい理解が、日本語話者の中に広まることを目的としています。


目次

  1. 基本概念
    1. 通貨
    2. 銀行
    3. オンラインバンキング
  2. Bitcoinの基礎
    1. ビットコインの生成
    2. ビットコインの転送方法
    3. 「2重支払い」の防止
    4. 匿名性
  3. 付録
    1. 公開鍵暗号による署名
    2. 「2重支払い」攻撃の具体例
  4. 参考文献

基本概念

通貨

 アリスは、ボブのアルパカの靴下*1が欲しかったとします。そのためには、それに見合う価値のあるものをボブに渡さないといけません。物々交換という手もあるかもしれませんが、最も効率の良い方法は「取引を媒介するもの」を利用することです。このような媒介物を「通貨」と言います。通貨の流通は、国際的であったり、国内に限ったものであったり、場合によっては、一部の地域やコミュニティにおいてのみ行われることもあります。

銀行

 さて、アリスは通貨を、必ずしもボブに直接渡す必要はありません。その代わりに、アリスはまず通貨を銀行にいくらか預けておきます。銀行はアリスに通帳を渡してくれます。通帳には、アリスの預金額が記載されています。そのお金はアリスのものなので、当然アリスは自由に使えます。多くの銀行では、少額の手数料と引き換えに、預けてあるお金をボブに受け渡す、というサービスをしてくれます。つまり、アリスの銀行がボブの銀行に通貨を渡して、その通貨がボブのものであると知らせる、というサービスです。ボブは、次に銀行残高を確認した時に、アリスからの送金を確認することができるわけです。

オンラインバンキング

 今日、銀行の顧客はたくさんいますが、応対する行員を増やすには給料というコストがかかります。なので、最近の銀行では、ATMやホームページが、行員に代わって顧客の相手をしてくれます。この電子システムは、顧客がお金を使って行いたいことを理解し、どの額まで使えるかを把握して、サービスを提供します。例えばATMは現金を引き出してくれます。顧客はいつでも自分の残高がいくらか知ることができるし、通帳に書かれた残高の数字も、パソコンの画面に現れる数字も、銀行から引き出し可能な金額を正確に表していると信じています。こうした信頼感から、そのデジタルな数字を、紙幣と同じように価値のあるものとして受け入れているのです。(ちょうど紙幣を金や銀の代わりに受け入れたのと同じです。)

このシステムには、しかし、短所もあります。

  • 手数料を取られる
  • 時間がかかる。振り込みの確認に1日以上待つこともしばしば
  • 取引が匿名でできない
  • 口座が凍結されたり、銀行が破綻すれば残高の一部や全部を失う可能性がある
  • 銀行と他の支払いシステム(クレジットカードやペイパル等)の取引が、法的理由で拒否されることがある

Bitcoinの基礎

 Bitcoinとは、「ビットコイン」と呼ばれるものを、蓄えたり転送したりできるシステムです*2。その方法はオンラインバンキングと似ていますが、異なるのは、残高を認証する、国家や銀行のような中央機関が存在しないことです。ビットコインの価値は、金や銀などと同様に、その希少性から生まれています。そして、金や銀とは違って、デジタルデータとして手軽にやりとりができるのです。

 Bitcoinのクライアントソフトは互いにP2P接続を行っており、中央サーバは存在しません。ビットコインの貯蓄と転送は、このP2Pネットワーク上で行われます。

ビットコインの生成

 ビットコインを価値のある通貨にするためには、その生成量に制限を与えないといけません。
 新しいコインは、全体で合意を得たルールに沿って、ゆっくりと「採掘」されます。ビットコインを採掘する人は、非常に難しい数学の問題をせっせと解くソフトを動かしています。その問題の難しさは正確にわかっており、しかも難易度を自由に変更することができます。難易度は、全世界で発見される解の数が、一定時間に一定数になるように自動的に調節されます。Bitcoinの場合、平均して1時間に6個の解がみつかるよう調節されています。解がみつかると、発見者は皆にその解を知らせます。この時、解に他の情報を添付してパッケージ化します。これを「ブロック」と呼びます。

 ブロックは25ビットコインを生成します。ブロック報奨と呼ばれるこのコインが、ブロック生成のためにパソコンに演算させた人への見返りになります。およそ4年で、1つのブロック発見に伴う報奨は半減します。最初のブロック報奨は50ビットコインでしたが、2012年11月に半減しました。このルールに従うため、最終的に発行されるビットコインの総量は決まっていて、2100万ビットコインが発行されることになっています。これがビットコインの希少性を保証しています。

 長期的に見ると、ブロック報奨はどんどん減っていってしまうので、採掘者はいつか、採掘コストを転送手数料でまかなうことになるでしょう。ビットコインを転送する人は、任意で少額の転送手数料を支払うことができ、それが次に発見されるブロックの報奨に上乗せされます。ビットコインの転送を希望する人は、手数料を支払うことで、転送の記録がより速やかにブロックに取り込まれるようになり、素早い転送が可能になるというメリットを受けられます。

ビットコインの転送方法

 第三者が勝手にビットコインを転送しないように、Bitcoinでは公開鍵暗号によってデジタル署名認証を行っています*3。このシステムでは、各ユーザ(アリスやボブ)が、ひとつ以上の「アドレス」を持っており、それぞれが公開鍵と秘密鍵のペアと関連づいています*4秘密鍵は、Bitcoinクライアントのウォレットの中にしまわれています。秘密鍵を持っている人だけが、転送記録に署名をすることができます。そして、その署名が本人によるものであることは、公開鍵によって誰からも確認することができるのです。

 例として、アリスがボブに1ビットコインを送りたかったとしましょう。その手続きは次のようになります。

  1. ボブがアリスにアドレスを教える
  2. アリスは、ボブのアドレスと、転送したいビットコインの量をひとまとめにします。これを「トランザクション」と呼びます
  3. アリスはトランザクション秘密鍵で署名します。そして公開鍵を公開します。
  4. トランザクションBitcoinネットワークに公開し、誰もが参照できるようにします。

(実際に人間が行わなければならないのは2までで、あとはBitcoinクライアントが自動的にやってくれます)

 この手続きを第三者から見てみましょう。アリスとボブのアドレス*5を知っている人なら誰でも、アリスが1ビットコインをボブに送ることを了承したのだと確認できるでしょう。なぜなら、アリス以外にアリスの秘密鍵を持っている人はいないからです。もちろん、アリスがおバカで、秘密鍵を他の人に教えてしまったら、勝手に彼女の名前で署名されてしまい、資産を奪われてしまうわけですが。

 さてその後、ボブがそのビットコインをチャーリーに転送したいと思ったとしましょう。ボブも同じ手続きを踏みます。

  1. チャーリーがボブにアドレスを教える
  2. ボブはチャーリーのアドレスと転送したいビットコインの量をまとめ、トランザクションを作る。
  3. トランザクション秘密鍵で署名し、公開鍵を公開する。
  4. トランザクションBitcoinネットワークに公開し、誰もが参照できるようにする。

この操作をボブだけができるのは、ボブだけが彼の秘密鍵を持っているからです。

 第三者は、アリスのトランザクションの中のボブのアドレスを書き換えることで、ビットコインを不正に入手することはできません。なぜならば、そのトランザクションは、アリスの秘密鍵で署名されているからです。このトランザクションが、かつてアリスの持っていたビットコインが、今はボブのものであることを保証しています。その後チャーリーがそのビットコインを受け取るということは、アリスからボブ、ボブからチャーリー、という2つのトランザクションが正しく行われたということを意味します。

「二重支払い」の防止

 上で述べた手続きだけでは、アリスが同じビットコインを2度以上転送してしまうことを防げません*6。そのため、次のようなアルゴリズムBitcoinは採用しています。この部分が、Bitcoinの最大のイノベーションです。

  • トランザクションは可能な限りP2Pネットワークに浸透される
  • 連続して生成されるブロックには、すべてのトランザクションが記録されている。このブロックの「チェーン」は、すべてのP2Pノードが保持している。
  • 新たなブロックがチェーンに加わる際には、それが正しい計算を経て生成されたものであるかチェックされる。
  • チェーンの途中のあるブロックが改変されると、それ以降のブロックはつじつまがあわなくなり、再計算される必要がある。
  • もしも複数の正しいブロックのチェーンがネットワーク上に存在した場合、最も長い方のみが受け入れられ、さらに長さを伸ばしていく。

アリスからのトランザクションがブロックに含まれているのをボブが確認した時、そのブロックが最も長く、最も早く成長するチェーンの一部になっていれば、彼はアリスからのトランザクションP2Pネットワークに受け入れられ、永久に記録されたと確信が持てるのです。つまり、アリスが同じコインを使ってもう一度トランザクションを作ることを阻止できるわけです。アリスがシステムを誤魔化して同じコインで2重支払いをしたいならば、全Bitcoinユーザを上回る計算能力をかき集めなければなりません。

匿名性

 Bitcoinネットワークでビットコインを貯めたり支払ったりするのには、口座も、メールアドレスも、ユーザ名も、パスワードも必要ありません。残高は公開鍵と秘密鍵のペアのみに紐付けられています。ビットコインは、トランザクションに署名できる秘密鍵を持っている人のものです。さらに、それらの鍵は、どこかで前もって登録しなければならないものではありません。トランザクションをしたいときになって、初めて必要となるものだからです。P2Pネットワークを構築している人々は、現金で支払いをする客の名前を知らない店主と同じで、お互いの個人情報を知る必要はありません。

 数学的に言うと、Bitcoinアドレスは公開鍵に相当します。例えばこんな感じです*7
1LThbmgT7qtyJwoNqa1fxv3B53aKCG8XY8

 だれでも複数のアドレスを持つことができ、それぞれがそれぞれの残高を持ちます。このことが、誰がどれだけのビットコインを持っているかを知ることを難しくしてくれます。プライバシー保護のため、ボブは個々の取り引きの度に新しい公開鍵・秘密鍵のペアを生成できます。Bitcoinクライアントは、デフォルトでそれを推奨しています。先ほどの例で言うと、チャーリーがボブからビットコインを受け取った時、チャーリーは誰がボブの前にビットコインを持っていたのかわからなくなるのです。

付録

公開鍵暗号による署名

 ごく大雑把な説明をすると、次の3種類のアルゴリズム(ソフト)を用いることで、任意のファイルに本人確認署名を行うことができます。

  • 鍵生成ソフト
  • 署名作成ソフト
  • 署名検証ソフト

 ユーザは最初に鍵生成ソフトを実行します。すると、「公開鍵」と「秘密鍵」と呼ばれる2つで1組のファイルが生成されます。このうち、公開鍵は全世界にむけて公開します。一方で、秘密鍵は大切に保管しておきます。重要なのは、公開鍵から秘密鍵を推測することが極めて難しいという性質です。
 さて、ユーザが任意のファイルにデジタル署名をしたいとします。そのファイルと秘密鍵をまとめて署名作成ソフトに入れると、暗号化されたファイルが生成されます。これが、元のファイルに署名をした状態です。
 この署名された(暗号化された)ファイルを読むためには、署名検証ソフトに、署名されたファイルと公開鍵を入れる必要があります。署名するのに使った秘密鍵と、署名検証ソフトに入れた公開鍵がペアをなしているならば、ファイルは正しく復号されます。
 ファイルの復号を確認することで、ファイルに署名をしたのが公開鍵を公開した人=秘密鍵を持っている人、と確認できるわけです。
 詳しくはwikipediaでも読みましょう。

2重支払い攻撃の例

 アリスは1ビットコインを持っていて、それをボブに支払いました。しかし、しばらくしてから、その1ビットコインを取り戻して、チャーリーに支払いたくなりました。そこで、アリスは次のような電子攻撃を行うことにしました。

  • ブロックチェーンのトランザクション記録を見ると、アリスがボブに1ビットコイン支払った情報は、10000番目のブロックに記録されていた
  • この時、ネットワーク上のブロックチェーンは10010まで伸びていた

-アリスは自分のノードに保存してある10000番目のブロックの情報を改ざんし、ボブへのトランザクションを、チャーリーへのものに変更した

  • (訂正)アリスは9999番目のノードから、トランザクション先をボブからチャーリーへ変更した10000番目のブロックを作った
  • すると、すでに計算済みの10001から10010までのブロックは無効になり、アリスが改ざんしたブロックチェーンの長さは10000になった
  • ネットワークのブロックチェーン長は10010だから、「多数決の原理」によって、アリスのチェーンは拒否される
  • しかし、アリスは諦めずに、自分のチェーンに継ぎ足す形でブロック生成を試みる
  • もちろん、その間にもネットワーク上でのブロック生成は行われているので、アリスはそれを圧倒する計算力を持っていないといけない
  • アリスがネットワーク上の誰よりも早く、改ざんされた10000番ブロックからチェーンを伸ばし、それがネットワークで最も長いチェーンとなった時、改ざんは成功し、ボブへの支払いは無効になって、ビットコインはチャーリーのものになる

 この攻撃を成功させるためには、アリスは自分以外のP2Pネット上の総計算能力を上回る計算資源(全体の50%以上)を持っていないといけません。これが俗にいう51%攻撃です。

*1:Bitcoinコミュニティのお決まりネタ

*2:システムやソフトとしての名称をBitcoin, そのシステムで用いられる通過および通貨単位をビットコインと表記します

*3:補足参照

*4:実は、アドレスは公開鍵そのものです

*5:つまり公開鍵

*6:この点、ややイメージを掴みづらいので補足参照

*7:もちろんこれは著者のアドレスです