ビットコインアドレスの衝突の可能性は?
ビットコインを発明し、未だその正体が分かっていないサトシ・ナカモト。そんなサトシが残した約2年間の文章を、小宮自由氏の解説と共に紹介する連載「サトシ・ナカモトが残した言葉〜ビットコインの歴史をたどる旅」の第33回。
まずサトシのメールの前に、本連載の元になっている書籍『ビットコイン バイブル:サトシナカモトとは何者か?』の著者フィル・シャンパーニュ氏の解説も掲載する。
フィル・シャンパーニュ氏の解説
ビットコインアドレスは公開アドレスのハッシュ出力値から作成される。ここでは、異なる二人の個人に偶然、同一のビットコインアドレスが割り当てられる衝突の可能性について懸念が示された。ここで注意すべきなのは、160ビットのハッシュは、2^160 または 1.46 x 10^48 のパターンがあるので *1、衝突が起きる可能性が極めて低いということである。
【訳注】
*1 2^160 ≒ 1.46 x 10^48 なので、表記方法の違い。
サトシ・ナカモト 2010年02月23日 午前09時22分47秒
それではサトシの投稿をみていこう。
========================
Re:ビットコインアドレスの衝突
(注:斜体部分は、サトシ以外の者の質問を指す)
NewLibertyStandardは書きました:
極めて可能性が低いことですが、二つのビットコインクライアントが同一のビットコインアドレスを生成したらどうなりますか? 支払を最初に見たクライアントに送金されますか? 衝突を予防するメカニズムがあれば説明して下さい。
各ビットコインアドレスには異なる公開鍵と秘密鍵のペアがあります。一つの秘密鍵で全てを開錠することはできません。ビットコインアドレスは公開鍵の160ビットハッシュ値で、システムではそれ以外のものは全て256ビットです。
衝突が起きると、衝突を起こした本人は、そのアドレスに送られるお金を全て使えるようになります。ただし、アドレスへ送られるお金のみであって、ウォレットの全額ではありません *1。
自分で意図的に衝突を起こそうとすると、現在のシステムでは、衝突するビットコインアドレスの生成には、一つのブロックの生成時間の2^126 の時間がかかります。これなら、ブロックを生成していた方がずっと多くのビットコインが手に入ります。
ランダムシードは極めて完璧です。ウィンドウズでは、ランダムシードは、ディスク・パフォーマンス、ネットワーク・カードのメトリックス値、CPU時間、ページングなど、全ビットを計測するパフォーマンス・モニター・データを全て利用します。Linuxではエントロピー・コレクターが内蔵されています。
これに加え、ビットコイン・ウィンドウの内部にマウスを移動させると、そのたびにエントロピーが生成され、エントロピーはディスク操作のタイミングから捕捉されます *2。
========================
【訳注】
*1 セキュリティやプライバシーを十分に考慮したビットコインのウォレットでは、1つではなく複数のアドレスを送受金に用いている。したがって、そのうちの一つのアドレスが他人と衝突しても、その他人が処分できる資産は衝突した1アドレスのみとなる。
*2 bitaddress.org を使えば、この文章が直感的に理解できる。
解説
ハッシュが入力に応じてランダムな文字を生成するものである以上、偶然アドレスが重複してしまうことは理論上起こり得ます。アドレスは秘密鍵を何度か変換することによって生成されるため、この場合重複したアドレスに存在する資産は全て利用できることになります。他人の資産を盗めてしまうのです。
しかしこれは、天文学的に低い確率です。意図的にやろうとすれば、マイニングより遥かに巨大なマシンパワーが必要ですし、偶然当たるにしても通常のコンピュータでは10,000回分の人生の時間すべてを使おうが当たりません。したがって、これは杞憂と言えます。
小宮自由