ダブルスペンドとは?
ダブルスペンドとは、デジタルキャッシュシステムにおいて、同じ資金が同時に 2 人の受取人に使用されてしまう問題です。適切な対策がなければ、この問題を解決しないプロトコルは根本的に損なわれてしまいます。 ユーザーは、受け取った資金がすでに他の場所で使用されていないことを確認する方法がありません。
デジタル・キャッシュに関しては、特定のユニットを複製できないようにすることが最も重要です。アリスが10個のユニットを受け取り、それを10回コピー&ペーストして、自分のものになってしまうと、システム全体が崩壊してしまいます。 100ユニットを送ることができます。同様に、同じ10ユニットをボブとキャロルの両方に同時に送ることができれば、このようなスキームは機能しません。つまり、デジタルマネーが機能するためには、このような行動を防ぐ仕組みが必要なのです。
ダブルスペンドの防止方法
中央集権的アプローチ
中央集権型のルートは、分散型の代替案よりも実装がとても容易です。これには通常、1 人の監督がシステムを管理し、ユニットの発行と分配を管理する必要があります。ダブルスペンド問題に対する集中型ソリューションの良い例として、 デヴィッド・チャウムのeCashがあります。
このような状況で、ユーザー(ここではダンと呼ぶ)が100ドルのデジタルキャッシュの受け取りを希望する場合、まず銀行に通知する必要があります。彼の口座に残高があれば、彼は乱数を生成します (小額の場合は多数の乱数)。5つの番号を生成し、それぞれに20ドルの値が割り当てられたとします。銀行が特定の単位を追跡できないようにするために、ダンは乱数のそれぞれにブラインディングファクターを加えることで、乱数を難読化します。
彼はこのデータを銀行に渡し、銀行は彼の口座から100ドルを引き落とし、5つの情報のそれぞれが20ドルで換金可能であることを証明するメッセージにサインします。これでダンは銀行から発行された資金を使うことができます。彼はエリンのレストランに行き、40ドルの食事を購入します。
ダンは、ブラインディングファクターを取り除くことで、デジタルキャッシュの”お札”(シリアル番号とよく似ている)に関連付けられた乱数を露出させることができます。ダンが他の商人と取引することを防止するために、すぐに銀行で償還しなければなりません。銀行は署名が有効であることを確認し、問題がなければエリンの口座に40ドルを振り込みます。
使用した紙幣は基本的に焼却されるため、エリンが新しい残高を同じように使用したい場合、さらに多くの紙幣を発行しなければなりません。
チャウムのeCashの仕組みは、個人的な送金に価値があるかもしれません。しかし、銀行は破綻の中心となるため、回復力に欠けます。発行された紙幣は、それ自体には何の価値もありません。顧客は銀行に翻弄され、貨幣が機能するためには銀行の善意に頼らなければなりません。これこそが、仮想通貨が解決しようとしている問題なのです。
分散型アプローチ
管理者が存在しないエコシステムにおいて、資金が二重に使用されないようにすることは困難です。同等の力を持つ参加者が、不正行為を防止し、すべてのユーザーが誠実に行動するようにインセンティブを与える一連のルールを調整しなければなりません。
レストランのシナリオをもう一度見てみましょう。ダンはレストランに戻り、今回は窓に"Bitcoin Accepted Here"のステッカーが貼られているのに気づきました。前回食べた食事が美味しかったので、再度注文しました。彼には 0.005 BTC のコストがかかります。
前述したように、その取引は確認済みのブロックに含まれている場合にのみ有効です。未確認の取引を受け入れることは、先ほどの例であるeCashの40ドルを銀行ですぐに現金化せずに受け入れるのと似ています。送信者は、それを他の場所で使用することができます。そのため、エリンはダンの支払いを受け入れる前に、少なくとも6つのブロックの確認(約1時間)を待つことをお勧めします。
ビットコインでのダブルスペンド
ビットコインは、少なくともプロトコルが想定通りに使用されている場合、ダブルスペンド攻撃を防ぐために慎重に設計されています。つまり、個人がブロック内で取引が確認されるのを待っていても、送信者が簡単に元に戻す方法はありません。そのためには、ブロックチェーンを“反転”する必要があり、非現実的な量のハッシュパワーが必要となります。
しかし、確認されていない取引を受け入れる当事者をターゲットとしたダブルスペンド攻撃はいくつかあります。例えば、低価格の商品を購入した場合、商人は取引がブロックに含まれるのを待ちたくないかもしれません。多忙なファストフード・レストランでは、ネットワークがすべての購入について処理されるのを待つ余裕はないでしょう。そのため、ビジネスが“即時”決済を可能にした場合、ダブルスペンドの可能性が出てきます。誰かがハンバーガーを注文して支払い、その後すぐに同じ資金を自分のアドレスに送るかもしれません。手数料が高くなると、この新しい取引が先に確認される可能性が高くなるため、前の取引が無効になります。
ダブルスペンドを行うには、3つの一般的な方法があります。
- 51%攻撃:単一のエンティティや組織がハッシュレートの50%以上を管理している場合、取引の順序を除外したり変更したりすることができます。このような攻撃はビットコインでは考えにくいですが、他のネットワークでは発生しています。
- レース攻撃:同じ資金を使用して、相反する2つの取引が連続してブロードキャストされますが、確認されるのは1つの取引のみです。攻撃者の目的は、自分に利益をもたらす取引のみを検証することで、支払いを無効にすることです(例えば、自分が管理するアドレスに同じ資金を送るなど)。レース攻撃では、受信者は未確認な取引を支払いとして受け入れることが要求されます。
- フィニー攻撃:攻撃者は、1つの取引をすぐにネットワークにブロードキャストせず、プレマイニングをします。その代わりに、別のトランザクションで同じ通貨を使用し、その後、先にマイニングをしたブロックをブロードキャストするだけで、支払いが無効になる可能性があります。フィニー攻撃は、特定のイベントが発生する必要があり、また、受信者が未確認のトランザクションを受け入れることを条件としています。
このように、ブロック確認を待っている商人は、ダブルスペンドの被害者になるリスクを大幅に減らすことができます。
まとめ
ダブルスペンドとは、電子マネーシステムを利用して金銭的な利益を得るために、同じ資金を複数回利用することです。従来、この問題に対する適切な解決策がないことが、この分野の進歩の妨げになっていました。