要約:
- 「ビットコインは二重支払いが起きづらい構造だ」などと説明されることがあります。この「二重支払い」とは、同一の通貨で2回以上支払うことです。
- 二重支払いを引き起こす行為を「二重支払い攻撃」と呼びます。ブロックチェーンでの二重支払い攻撃には、51%攻撃やRace攻撃、Finny攻撃などがあります。
- 二重支払い攻撃の被害に遭わないためには、「相手から自分に支払われたトランザクションが、ブロックチェーンに記録されるまで待つ」という姿勢が重要です。
二重支払いとは
二重支払いとは、同一の通貨で送金を2度以上実行することを指します。
現金であれば、同じ紙幣で2回支払うことはなさそうです。そのため、二重支払いはデジタル決済が抱える問題だと言えます。
もし2種類の送金両方が行われたら、通貨の数が増えてインフレショーンが起こります。また、その支払いシステムへの信用が落ちて誰も使わなくなりそうです。
二重支払いへの対策は必須と言えますね。
二重支払いの例①
1BTCの残高を保有する人がいたとします。
この人がAさんに1BTCを支払う処理をした直後に、1BTCをBさんに振り込む処理をしたとします。この処理が両方実行されたら、二重支払いが発生したことになります。
二重支払いの例②
1BTCの残高を保有する人がいたとします。
この人がAさんに1BTCを支払う処理をした直後に、間違ってもう一度、1BTCをAさんに振り込む処理をしたとします。両方の処理が実行されたら、二重支払いが発生したことになります。
二重支払いの例③
実際に2つ以上の支払いが実行されなくても、二重支払いと呼ばれることがあります。より具体的には、同じ通貨での支払いが2回以上受理されるケースです(2回受理されただけで、2回実行されてはいない)。
ここでも例を見てみたいと思います。
1BTCの残高を保有する人がいたとします。この人がAさんに1BTCを支払う処理をした直後に、わざと自分宛てに振り込む処理をしたとします。
ブロックチェーン上の支払いは、マイナーやバリデータの承認があって初めて確定します。しかし、Aさんは支払い確定前に「支払い処理が送られているから大丈夫だろう」と考え、「支払いを受理しました」と伝えました。
その後Aさんがどれだけ待っても、1BTCはAさんの元に届きませんでした。
・
・
・
実は、Aさんへの支払いはキャンセルされて、自分宛の支払いが処理されていたのでした。Aさんは大損してしまいました。
上記のようなケースでも、二重支払いが発生したと言うことがあります。
支払い確定を待っていれば、Aさんはこの事態を防げました。
上のように「即座に2回処理を実行する」など、特殊な方法を取った場合に二重払いが発生する可能性はあります(ただし、支払い確定を待てば防げる)。しかし、次に説明するように「コンセンサスアルゴリズム」などの働きによって、特殊な方法を取らない限り、二重支払いは発生しません。
二重支払いの防止方法
デジタル決済サービスは、二重支払いの防止策を実施しています。
中央集権的な防止策
中央集権的な防止策とは、中央管理者がちゃんと支払いが出来ているか、二重支払いがないかをチェックするというものです。例えば、銀行やクレジットカード会社は中央管理者として、二重支払いがないかをチェックします。
中央集権的な防止策は有効ですが、単一障害点の問題は伴います。
単一障害点(single point of failure、SPOF)とは、「ここに不具合が起こると、システム全体が止まる」という部分です。以下はイメージです。
上記は厳密には単一障害点ではありません。中央の電車が止まっても鉄道網全体が停止するわけではなく、北エリア内もしくは南エリア内での移動は引き続きできるためです。
あくまでイメージです!
分散的な防止策
中央管理者を排除して二重支払いを防ぐのは、より難しいとされています。ただブロックチェーンは、分散的な方法で二重支払いを阻止することに成功しています。
具体的には、PoWやPoSなどのコンセンサスアルゴリズム(合意形成の方法)等によって、阻止しています。
でも、ブロックチェーンネットワークにはたくさんの人が参加していて、見ず知らずの人から送金してもらうケースも多いはずです。そんな状況で仮想通貨はうまく機能するでしょうか。コンセンサスアルゴリズムはどのように役に立つのでしょうか。
コンセンサスアルゴリズムの働き
例として、「Aさんが、見ず知らずのBさんから1BTCを支払ってもらう」というケースを考えてみたいと思います。
AさんはBさんが1BTCを送ってくれるのを待つだけなのです。しかし心配性なAさんは、「Bさんには支払えるだけの残高が本当にあるの?」「残高は無いけど不正をして、『1BTC送った』という処理を偽造されたら、、」と不安に感じてきました。
しかしよく考えてみると、上記のようなことは杞憂だとわかります。
ビットコインブロックチェーンでは、全参加者の利用可能残高が記録されています。その残高情報を見たノード(コンピュータ)がチェックするので、存在しない残高を払おうとすれば、その送金処理は拒否されるのでした。
ビットコインは「UTXOモデル」というややこしい方法で記録しているので複雑なのですが、全参加者の利用残高はすべて確認可能です。
ノードが正しくチェックするのかが不安かもしれませんが、ノードは複数存在していて、各ノードがチェックし合っています。1つのノードが不正をしてもばれてしまいます。
また、送金処理を確定させる「ブロック生成作業」は、マイナーというコンピュータが行っているのですが、間違った送金処理を確定しようとしたらマイナーはペナルティを受けます。
このように、ブロックチェーン上の取引は全て記録され、その情報に基づいて実行されます。また、記録をごまかそうとするとバレて罰則を受けるので、二重支払いは基本的に起こりません。
仮想通貨分野における二重支払い攻撃とは
ブロックチェーンは二重支払いを防ぐ仕組みを複数備えています。しかし、その仕組みをかいくぐって二重支払いを起こす手法「二重支払い攻撃」が存在します。
1つはブロックチェーンの仕組み自体を崩壊させる手法で「51%攻撃」と呼ばれます。その他には、「Race攻撃」「Finny攻撃」があります。
Race攻撃やFinny攻撃は、未承認トランザクション攻撃とも呼ばれます。Race攻撃やFinny攻撃は、支払いの受理者が未承認のトランザクションを受理する場合にのみ成功するためです。
51%攻撃
51%攻撃とは、単一のグループがブロックチェーンを支配し、トランザクションの書き換えや複製などを行う攻撃です。
ブロックチェーンの仕組み自体を壊すので、攻撃に成功した人は好き放題できます。
PoWのブロックチェーンの場合、ハッシュレート(計算能力)の51%以上を単一のグループが保有すると、トランザクションの書き換えが可能になります。PoSのブロックチェーンの場合は、ネイティブトークンの総発行数量の51%を単一のグループが保有すると、可能になります。
ビットコインやイーサリアムなどの人気のブロックチェーンでは、理論上起こらないとされています。ブロックチェーンを支配するために必要な費用が莫大であり、得られる報酬よりも費用が上回るとされるためです。
Race攻撃
Race(競争)攻撃とは、同一トークンを使った送金を連続して行い、送金者自身が得をするように操作することです。
例えば、以下のようなケースはRace攻撃に該当します。
- Aliceは車を購入すると決めた
- 2BTCを送金して代金を払うことになった
- Aliceは2BTCを送金するトランザクションを送る
- Aliceは即座に、自分の別の口座に2BTCを送金するトランザクションを送る
- 2BTCはAlice自身の口座に送金される
Race攻撃では上記のように、同一のトークンを使って、ほぼ同時に別々の宛先に送金するトランザクションを実行します。
承認されるのは片方のトランザクションのみです。そこで、自分の口座宛ての送金へのガス代は高めに設定し、自分の口座にのみ送金するというわけです。
同一のトークンを使った未承認のトランザクションが2種類ある場合に、ガス代が高いほうを優先できるのは、「Replace By Fee(RBF)」という仕様のためです。
ただし、Race攻撃は簡単に防げます。車屋がAliceに対して、「トランザクションが承認されるまでは入金を認められません。10分くらい待ってください」と言えば、Race攻撃は成功しません。
Race攻撃を成功させるには、トランザクションの承認前に別のトランザクションを実行する必要があります。しかし、トランザクションは一度マイナーによって承認されると、もう改ざんはできないので、支払いは確定します。
支払い速度を売りにした仮想通貨決済サービスが使われると、Race攻撃が起こるかもしれません。
Finny攻撃
Finny攻撃は、マイナーのみが実行できる攻撃方法です。この手法に最初に言及した、Hal Finney氏にちなんで「Finny攻撃」と名づけられました。
Race攻撃と同様で、Finny攻撃が成功するには料金の受け手が、トランザクションの承認前に支払い完了を認めてくれる必要があります。
Finny攻撃の流れは以下の通りです。
- マイニングを行う
- 生成中のブロックに、2BTCを自分宛で送るトランザクションを含める(トランザクションは他のノードには配信しない)
- ブロック生成処理ができたら、車屋に2BTCを払うトランザクションを配信する
- 車屋が支払いを認めたら、マイナーは生成したブロックを全体に配信する
- 自分宛のトランザクションのみが実行される
コメント