読者です 読者をやめる 読者になる 読者になる

kivantium活動日記

プログラムを使っていろいろやります

サルでも分かるビットコイン 〜Bitcoinの仕組みを理解しよう〜

はじめに

世界最大のBitcoin取引所(であった)Mt.Goxの破綻が大きなニュースになっていますが、ニュースを見る限りマスコミ側もBitcoinをよく理解しないまま報じているような印象を受けました。「採掘ができるらしい」「管理する中央機関がないから危ないらしい」などの断片的なことは知っていても、ビットコインが実際にどういった仕組みで動いているのかについて理解している人は少ないのではないでしょうか。そこで、以前私が調べて理解したことをまとめてみることにしました。(なおあくまで「私が理解したこと」なので、誤った情報が含まれているかもしれません。誤りに気がついた方はコメントしてください)

Bitcoinに関する情報源

この文章を書くにあたって参考にしたページを挙げておきます。正確に理解したい方は原典に当たることをオススメします。

前提となる知識

Bitcoinは暗号に関するMLに投稿された論文から生まれたものなので、暗号理論が活用されています。この説明を理解する上で最低限必要な知識だけ解説します。

公開鍵暗号

公開鍵暗号が開発される以前の暗号では、暗号を解読するために必要な情報(鍵といいます)を秘密にするのは当たり前でした。「ニイタカヤマノボレ」が「戦闘行動開始」という意味だと知っているのは味方だけで、敵は知らないはずです。敵に解読できるような暗号なら、暗号の意味が無くなってしまいます。この仲間同士しか知らない情報を使って暗号を作るのは長く使われてきた方法(共通鍵暗号といいます)ですが、鍵の受け渡しを安全に行うのが難しいという弱点があります。送りたい相手と事前に会って鍵の受け渡しができるのならいいのですが、離れた場所にいる相手に鍵を安全に送るのは簡単ではありません。鍵を暗号化せずに送ってしまうと傍受している敵に筒抜けで意味がない、かといって暗号化するには鍵を先に送らないといけない……、ということで鍵を秘密にする方法には限界があります。その限界を解決したのが公開鍵暗号です。

公開鍵暗号が画期的だったのは、「暗号化する鍵」と「暗号を解読(復号化)する鍵」を分離したところです。公開鍵暗号による通信は以下のようにして行われます。

  1. メッセージを受けとりたい人が「暗号化する鍵」(公開鍵といいます)を、メッセージを送りたい人に教えます
  2. メッセージを送る人は、教わった公開鍵を使って送りたい文章を暗号化し、暗号化したメッセージを受け取る人に送ります
  3. 受け取った人は自分の持っている「復号化する鍵」(秘密鍵といいます)を使って、受け取った暗号文を解読します

この方法を使えば、復号化するために必要な情報を相手に知らせることなく暗号通信をすることができます。この時重要なのは、「公開鍵は世界中に教えても問題ないが、秘密鍵は自分以外に教えてはいけない」ということです。後で重要になるので覚えておいてください。

署名

公開鍵暗号の応用に署名という仕組みがあります。これは公開鍵を用いた本人確認のシステムです。公開鍵はその名の通り「公開」されているものなので、「私の公開鍵は〇〇です」と言っている人を無条件に信用することはできません。そこで秘密鍵と公開鍵を入れ替えて使うことができる、という性質を利用して本人確認を行います。流れは以下の通りです。

  1. 秘密鍵を持っている人がある文字列を、秘密鍵で暗号化する
  2. 公開鍵を受け取った人は、暗号化された文字列を復号化して元の文字列と比較する
  3. 一致した場合、「この公開鍵で正しく解読できる文章を作れるのは、秘密鍵を持っている本人だけだ!」というわけで本人確認ができる
ハッシュ

ハッシュとは、与えられたデータに対して数学的処理を行って得られた数値のことです。大きなデータの特徴を短い数字で表したものという理解でいいでしょう。例えば、ネット上のデータを正しくダウンロードできたか確認する時に、データを1bitずつ確認するのは大変なのでハッシュだけを比較する、などといった使い道があります。Bitcoinで重要になるハッシュの性質は「あるデータのハッシュを計算するのは簡単だが、ハッシュを特定の値にするデータを作るのは難しい」ということです。

P2P

P2Pとは、特定の中央サーバーからデータを受け取るのではなく、接続したコンピューター同士が情報を送り合うような情報伝達形式のことです。SkypeTorrentなどが有名な例です。この方法を採用すると中央サーバーが攻撃されてネットワーク全体がダメになるのを防ぐことができます。Bitcoinに参加しているコンピューターはP2Pで作られたBitcoinネットワークに接続しており、伝言ゲームのような形で全体に情報を共有しています。特定の管理機関が存在するのではなく、参加している全てのコンピューターによってBitcoinネットワークが作られているところが大きな特徴です。

以上で予備知識の説明を終わります。

Bitcoinの仕組み

ようやく本題に入りました。

取引(Transaction)

ここでは、アリスがシノブに50BTC(BTCはBitcoinの単位)を送金する場合を例に、取引について説明します。
まず、アリスが以前の取引で、アヤから25BTC、カレンから20BTC、ヨーコから10BTC、を受け取って現在55BTC持っているとします。この時、アリスは次の情報を含んだ取引(Transaction)というデータを作って、BitcoinP2Pネットワークに送信します。(まだ説明していない単語も登場しますが、それは後で説明します)

  • Input
    • アヤとの取引のハッシュ・その取引のアウトプット番号・アヤの公開鍵と署名
    • カレンとの取引のハッシュ・その取引のアウトプット番号・カレンの公開鍵と署名
    • ヨーコとの取引のハッシュ・その取引のアウトプット番号・ヨーコの公開鍵と署名
  • Output
    • シノブに送金する金額(50BTC)・シノブの公開鍵
    • アリスに送金する金額(4BTC)・アリスの公開鍵
  • アリスの署名

Bitcoinには特定のidのような実体があるわけではなく、「取引の履歴」がBitcoinの本体になっています。つまり、「アリスが55BTC持っている」というのは、アリスが何かを55BTC分持っているということではなく、「55BTC受け取った取引履歴がある」ということなのです。そのため55BTCを送金するためには、まず55BTC以上を受け取った取引履歴を示さないといけません。それがInputに当たります。この仕組みから分かるように、Inputした取引履歴の合計が送金金額に一致しない場合があります。その場合は「4BTCをアリスに送金する」というお釣りのようなやり方で送金額ちょうどを送るようにしています。

また、Bitcoinの特徴の一つは匿名性にあるので個人は公開鍵によって区別しています。詳しくはBitcoin Walletの章で説明します。

お気づきかもしれませんが、この例ではInputの合計が55BTC、Outputの合計が54BTCになっています。この差の1BTCは取引費用(Transaction Fee)として採掘者達の報酬になります。詳しくは次の章で。

採掘(Mining)とブロックチェーン

このような電子マネーの一番の問題点は「二重利用」にあります。先ほどの例でいうとアリスが送ろうとしている55BTCは、もしかしたらもう既に別の誰かに送金してしまったもう使えないBitcoinかもしれない、ということです。これを防ぐ方法が「採掘」になります。

P2Pネットワークに送信された取引は、ネットワークに接続した「採掘者」達によって過去の取引履歴と参照されて不正が無いことを確認されます。不正のないことが確認された取引をいくつかまとめて「ブロック」が作られます。ブロックの中身は次のようになっています。

  • 一つ前のブロックを指す数字
  • 取引をまとめたもの(取引のハッシュツリー)
  • ある特定の数字

Bitcoinの採掘者達が必死になってやっているのはこの「ある特定の数字」を見つけることです。ブロックを完成させるためには正しい数字を見つける必要があります。「正しい数字」とは、その数字を含んだブロックのハッシュを作った時に、ハッシュがある条件(例えば先頭に0が40個連続する)を満たすような数字です。ハッシュの項で説明したように、あるデータからハッシュを作るのは簡単ですが、あるハッシュになるようなデータを作るのは難しい(=時間がかかる)のです。その「正しい数字」を発見した最初の採掘者がそのブロックの生成者になります。

ブロックの中にはそのブロックを生成した採掘者に一定額のBitcoinを与えるような取引を入れることになっています。そのため、ブロックを生成した人はBitcoinを手に入れることができるのです。これがよく言われる「採掘」の仕組みです。またブロックを生成した人はブロックに含まれる全ての取引の取引費用を手に入れることができます。つまり、ブロックを一つ生成するだけで結構なBitcoinが手に入ることになります。そのため、多くの人が採掘(=ブロック生成作業)に参加するようになり、取引の認証が盛んに行われるようになるのです。

新しいブロックを作った人はそのことをBitcoinネットワーク全体に通知し、通知を受け取った採掘者はそのブロックが正当であることを確認すると今やっているブロック生成作業を諦めて、新しく作られたブロックの続きとなるブロックの作成に移ります。

Bitcoinには中央サーバーがないので、ネットワーク上で複数のブロックがほぼ同時に生成される場合があります。その場合、各コンピューターは先に受け取った方に続くブロックを生成する決まりになっています。しばらくして、より多くのブロックがつながっている方(正確にはハッシュ生成の難易度が高い方)が正当なチェーンとして認められます。


新しいブロックが生成される、つまり公式に取引が記録されるまでには平均10分かかります。そのため安全な取引を行うためには取引と取引の間に最低でも10分の間隔を開けることが勧められています。なお、長く待てば待つほど安全性は向上します。この認証されるまでの時間差を突いた攻撃がMt.Goxに仕掛けられたという説もあります。(後述)

51%攻撃

Bitcoinを不正利用しようとした人がBitcoinネットワーク全体の51%以上の計算能力(=単位時間に調べられる「ある数字」の数)を手に入れたとすると、Bitcoinの安全性に問題が生じます。攻撃者が51%以上の計算能力を持ったときにできることは、

  • 特定の分岐点以降のブロックを全て自分で生成して莫大な利益を得ること
  • 自分の取引履歴を無かったことにして、過去に自分が持っていたBitcoinを二重利用する
  • 特定の取引をブロックに入れないようにして、認証されないようにする

などです。逆に出来ないことは、

  • 他人が持っているコインを勝手に使う
  • 他人の取引を禁止する(認証されなくなるだけ)
  • ブロック生成報酬以上のコインを手に入れる

などです。

採掘を行っているコンピューターの数は膨大なので、51%以上の計算能力を手に入れるのは現実的にはほぼ不可能です。また、強力な計算能力を持っているなら通常の採掘を行ったほうが利益になりやすいのも事実です。51%攻撃が起こる可能性はかなり低いですが、ゼロではないことに気をつける必要があります。

財布(Bitcoin Wallet)

以上の説明で分かるように、Bitcoinでは取引の履歴が世界中に公開されます。そこで匿名性を守るために個人は公開鍵だけで識別することになっています。しかも、取引の度に別々の公開鍵を作るという力のいれようです。この公開鍵とそれに対応する秘密鍵のペアの束のことを財布(Bitcoin Wallet)といいます。「取引」の項を見てもらえれば分かるように、取引は「署名」さえすることができれば誰でも作ることができます。署名するには秘密鍵があればいいので、秘密鍵を入手すればその人のBitcoinが使い放題ということです。
ビットコイン、盗難に備えてプリントアウトする動きなどに書いてある「印刷したBitcoin」というのは秘密鍵のことです。秘密鍵を印刷して金庫に保存し、秘密鍵のデータをパソコンなどから削除してしまえば、ハッキングされたとしても秘密鍵を盗まれることがなくなり、自分のBitcoinを勝手に使われる心配が減るのです。

よくある質問(技術編)

  • 1satoshi=0.00000001(10のマイナス8乗)BTC って聞いたけど、お金の単位に小数を使うってどういうこと?
    • 逆です。つまり、1BTCが100000000satoshiと定義されています。satoshiが基本単位で、BTCは利便性のために導入された補助単位です。
  • Bitcoinの総数に上限があるのはなぜ?
    • 1ブロックを生成して得られるBitcoinの額が4年毎に半減するからです。得られるBitcoinが1satoshiを下回ったらもう何ももらえなくなります。その時点までBitcoinが存続しているとしたら、おそらくBitcoinでの取引は盛んになっているはずなので、取引費用をもらうだけで十分採算が取れると考えられています。

Bitcoinのメリット

  • 管理する機関が存在しない
    • 今の世界で主に使われている貨幣や電子マネーは、国やクレジットカード会社などの一組織によって支配されています。適切に運用されているうちはいいですが、その組織がつぶれてしまえば価値が無くなってしまいますし、組織が悪いこと(過剰に発行してインフレを起こすとか)をする可能性もあります。その点Bitcoinは管理主体が存在しないので、Bitcoinネットワークが存在する限り動作し続けると考えられます。
    • キプロス共和国など政府が信用できなくなった国でBitcoinの利用が進んでいるのはこういうところに理由があります。
  • 取引手数料が安い
    • 取引費用がかかるとはいえ、クレジットカードなどによる決済よりはずっと安くて済みます。
  • 匿名性が高い
    • クレジットカードで買うと取引履歴が全て残ってしまいますが、Bitcoinでは取引をした個人の特定が不可能です。独裁国家を打倒するための武器の購入などには最適でしょう。

Bitcoinのデメリット・弱点

  • 価値の裏付けがない
    • Bitcoinは金のようにそれ自体に価値があるものでもありませんし、紙幣のように国の後ろ盾があるわけでもありません。そのため、価値は取引の状況によって大きく変わってしまいます。一瞬で無価値になる可能性が常につきまとうのです。
  • 犯罪の温床になる
    • Bitcoinの匿名性を正しく活用してくれるならいいのですが、高い匿名性は犯罪者にとっても便利なものなので悪用される可能性があります。実際に密売サイトで使われていた例もあるようです。
  • 犯罪に対して脆弱
    • Bitcoinの高い匿名性により、秘密鍵を盗まれて不正利用されたとしても誰が盗んだのかは分かりません。クレジットカードならカードを停止する、保険で保障してもらう、などの犯罪対策ができますがBitcoinにはできません。全て自己責任になります。
  • 自由な新規発行ができない
    • Bitcoinは自由な新規発行ができません。柔軟な経済政策を行うために金本位制を捨てて管理通貨制度が導入されたという時代の流れに逆行しているようにも思えます。

ここまではよく言われていることですが、以下は単なる私の憶測です。

  • 発行数に上限がある
  • Bitcoinは使わない方が儲かる
    • 私はこれがBitcoin最大の弱点だと思っています。基本的にBitcoinの価値は時間とともに上昇していきます。ということは、今持っているBitcoinを支払いに使って他の人に渡してしまうよりは、今使わないで将来価値が上がった時に使った方がいいと多くの人が判断するはずです。極論するとBitcoinコインなのにコインとして使ってはいけないという存在自体に根本的な矛盾がある存在なのです。通貨は多くの人が使うことで価値が発生します。コインなのに誰も使わないBitcoin……こんなコインが普及して日常生活で利用されることがあるでしょうか?現状のシステムでBitcoinが普及するのは難しいと思います。

で、Mt.Gox事件って結局何だったの?

Mt.Goxの倒産を受けて、「ビットコインは終わった」という意見をよく目にするようになりましたが、Mt.Goxは単なる取引所に過ぎません。Bitcoinのシステムに問題が発生したわけではないのでこれからもBitcoinの取引は続いていくと思われます。

Mt.Goxって何してたの?

Mt.Goxは円やドルなどの既存の通貨とBitcoinの交換を行っていました。株式市場でいうと証券会社にあたります。利便性のために利用者はMt.Goxに口座を開設し、Bitcoinと既存通貨を預けていました。この預けていたBitcoinが今回の事件で失われたものです。

Mt.Goxは何されたの?

まだ全容は分かっていないようですが、Mt.GoxはTransaction mutabilityという脆弱性を突かれたようです。先ほど述べたように、取引が認証されるまでに10分ほどかかります。この間にハッカー側がBitcoinの再送信を求めるとMt.Goxは送ったことを確認できずに無限にハッカーBitcoinを送り続けることになります。こうしてMt.Goxは手持ちのBitcoinを全てハッカーに送ってしまい倒産に追い込まれたようです(詳しいことは僕も理解していません。分かったらまた書きます)現在ではこの脆弱性は修復されたようです。これに関しては既知の脆弱性を放置していたMt.Gox側に落ち度がありそうです……。

Transaction mutabilityについて説明していただいたので追記します。(nuさま、何度もありがとうございます)

                  • -

Transaction mutabilityについてですが、これはある取引データを複製して、秘密鍵なしにそのIDだけを書き換えることができてしまうという問題です。

Mt.Goxが出金のための取引 T をブロードキャストしたとき、攻撃者はそのIDを書き換えた T' をブロードキャストします。
もし T' のほうが先にチェーンに組み込まれた場合、内容は同じなので取引自体は成立しますが T は不正な取引(二重支払い)と判定され無効になります。
その場合は T のIDがチェーンに現れないので、Mt.Gox側は支払い自体が成立していないと判断します。

                  • -

終わりに

なんとなく書きはじめたBitcoinの解説ですが、思ったより長くなってしまいました。重ねて書きますが、あくまでこの記事は「Bitcoinについて僕が理解したこと」なので誤りが含まれている可能性があります。また、経済の専門家でもないので分析にも誤りがあると思われます。間違っているところ、分かりにくいところなどがあったら遠慮なく指摘してください。

改定履歴

  • 3/3 9:55 nuさんの指摘を元にブロックチェーンに対する攻撃の記述を削除。代わりに51%攻撃について記述
  • 3/3 13:54 Transaction mutabilityの説明を追加
  • 3/3 14:13 ハッシュの記述を微修正
  • 3/3 17:36 ブロックチェーンの記述を追加
  • 3/5 21:05 ブロックの記述を微修正