二重支払いは新しいビットコインを作ることではありません。送金者が、以前受け取った資金の少なくとも一部を、二つのトランザクションで重ねて使おうとします。両方がネットワークを流れることはあっても、同じ履歴で両方が有効になることはありません。未承認の支払い、つまり zero-conf を受け入れると、どちらが残るか明確になる前に行動することになります。
トムが以前受け取った 100 000 sat の出力を持っているとします。sat はビットコインの最小単位で、まだ使われていない出力は UTXO と呼びます。トムはアリスに 99 000 sat を送り、1 000 sat を手数料にする支払いを用意します。しかし、同じ UTXO を使いながら別の宛先に送るトランザクションにも署名できます。同じ資金を使うので、二つは競合します。ファイルのコピーとは違い、ルールを検証するコンピューターである Bitcoin ノードは、有効な一つのチェーンで同じ出力を二度使わせません。アリスが最初の支払いを信じて商品を渡したのに、採用された履歴には二つ目だけが残れば、詐欺は成功です。新しいコインが生まれたのではなく、アリスが負けた方の支払いを信頼したのです。技術的には、入力は以前のトランザクションの識別子 txid と出力番号で対象を指定します。この組を outpoint と呼びます。 [1] [3] [7]
アリスには数秒で入金が見えるかもしれません。ですが、ブロックに記録されたとは限りません。Mempool は各ノードが未承認トランザクションを保管する場所です。世界共通の Mempool も、全ノード共通の到着順もありません。別のノードは競合する方を先に受け取ったり、アリス宛ての方をまだ見ていなかったりします。first-seen は、中継時に先に受け取った版を優先する方針です。マイナーがその版をブロックに入れるという約束ではありません。したがって、ウォレットの画面や txid だけでは決済の証明になりません。信頼できる検証済みチェーン上で、その支払いがどの状態にあるかが重要です。 [2] [5]
逆に、アリスが正当な支払いを送ったものの、長く待たされている場合もあります。Replace-by-Fee(RBF)は未承認トランザクションを置き換える仕組みで、通常は手数料を上げます。txid が変わっても、受取人には同じ金額を送れます。置き換えは少なくとも一部の同じ資金を使うので技術的には元の取引と競合しますが、それだけで受取人をだます意図があるとはいえません。見るべきなのは RBF の表示そのものではなく、新しい支払いの内容と事情です。ただし、同じ仕組みで別の宛先に資金を向けることもできます。Bitcoin Core はバージョン 28 から Full-RBF を標準としており、元の取引が置き換え可能であると通知している必要はありません。置き換え後もノードの手数料や悪用防止の規則を満たす必要があります。RBF の通知がない未承認取引でも、取り消せない支払いになるわけではありません。 [5] [6] [15]
支払いがノードの受け入れた有効なブロックに入ると、一つの承認を得ます。その後にブロックが続くほど、通常は履歴の差し替えが難しくなり、詐欺の成功リスクが下がります。ただし、どんな場面にも安全な承認数はありません。コーヒー代を失う場合と、車を渡す場合や取引所の大口出金を認める場合では、損失が違います。よく挙げられる六承認は慣行であり、Bitcoin のルールではありません。金額、損失を取り戻せるか、チェーンの異常、情報源の質を考慮します。ノードを孤立させる Eclipse Attack は、そのノードのネットワーク認識をゆがめます。待つことは検証と組み合わせるもので、検証の代わりではありません。 [2] [10]
ノードが別の有効な分岐に移ることを再編と呼びます。Proof of Work はブロック生成に必要な作業を示し、分岐の累積作業量を chainwork と呼びます。 支払いが承認された後は、Mempool 内のトランザクションの置き換えで取り消すことはできません。有効な別の分岐が、元の支払いを除外してもう一方の支払いを含み、受取人のアクティブなチェーンよりも多くの累積作業量、すなわち chainwork を獲得する必要があります。チェーンの再編は詐欺がなくても起こり得ます。ほぼ同時に採掘されたブロックや、ソフトウェアまたはネットワークの不具合が例です。被害者に対する二重支払いの成功と呼べるのは、競合取引が勝つことによって攻撃者が価値を得たときです。Bitcoin Core は、ウォレット内の負けた取引について、confirmations フィールドに負の承認数を、walletconflicts フィールドに関連する競合を表示する場合があります。 [4] [7] [8]
Hashrate は採掘時の計算速度です。割合が大きいほど履歴をめぐる競争に有利ですが、他の規則から免除されるわけではありません。 秘密裏に採掘した分岐が正直に採掘されたチェーンに追いつく確率は、攻撃者が持つネットワーク全体の計算能力の割合や承認数などに左右されます。得られる価値は、主に攻撃が割に合うかどうかに関わります。割合が 50 % 未満でも成功率はゼロではありません。過半数を継続して維持すれば、もう一方の分岐に追いつく可能性は大幅に高まります。ただし、過半数があっても、マイナーは署名を偽造したり、他人の UTXO を使ったり、発行ルールに違反したり、フルノードに無効なブロックを受け入れさせたりはできません。攻撃を評価する際は、計算能力や電力に加え、正直に採掘していれば得られた報酬も考慮します。使える資金、失敗のリスク、発覚する可能性も重要です。利益には金融市場のポジションから得るものもあり得るため、採掘機器のレンタル料金だけでは見積もれません。 [1] [10] [12]
ここでの race はタイミングの競争です。受取人とマイナーが先に見るトランザクションは異なる可能性があります。 race attack は、支払いの受け入れと競合取引の承認の間で先を争う攻撃です。支払人は一方のトランザクションを加盟店に送り、競合する取引をマイナーや別のノードに送ります。ブロックによって一方が選ばれる前に、加盟店に取り消せない形で商品を引き渡させようとします。結果は、取引の伝播、加盟店から見えるネットワークの状況、マイナーの選択、商品の引き渡し時点に左右されます。独立した複数のノードでネットワークを監視すれば競合を見つけやすくなりますが、取り消せない決済が保証されるわけではありません。race、Finney、Vector76 という名称は攻撃のシナリオを表し、トランザクションのデータ項目や別のコンセンサスルールを表すものではありません。 [2] [11]
Finney attack は、攻撃者が支払いだけでなく採掘能力も持つ場面の名前です。ウォレットによる通常の手数料引き上げではありません。 Finney attack では、採掘できる攻撃者が、価値を自分に戻す競合トランザクションを含むブロックを、まず非公開で採掘します。その後、同じ UTXO を使って未承認の支払いを受け入れる加盟店に代金を払い、商品を受け取ってから隠していたブロックを公開します。成功するには、そのブロックが引き続き使える状態にあり、正直に採掘された競合ブロックが準備を無駄にする前に、ネットワークに採用される必要があります。攻撃者はブロック報酬と採掘費用を失うリスクを負います。加盟店へのトランザクションが検証済みのブロックに入るまで待てば、この古典的な手順は阻止できます。ただし、その後にチェーンが再編されるリスクまではなくなりません。 [1] [11]
RPC はノードをプログラムから操作するためのインターフェースです。以下の名称は支払いシステム開発者向けの命令や項目で、別種の承認ではありません。 加盟店のシステムは、自前のフルノードで Mempool 内の競合する支出を監視し、gettxspendingprevout を呼び出し、walletconflicts フィールドを読み、アクティブなチェーンの最新ブロックを比較し、承認の喪失を通知できます。接続するノードや独立したノードを増やせば死角を減らせますが、競合が見つからないことは安全性の弱い根拠にしかなりません。攻撃者は競合取引を公開せずに待ったり、別の経路に送ったりできるからです。ブロックエクスプローラーも、自身のノードから見える情報を表示しており、遅れが生じる場合があります。競合の発見によって商品の引き渡しを止めることはできます。しかし、マイナーに採用する取引を指示したり、未承認の支払いを承認済みの支払いと同等にしたりはできません。 [8] [9] [11]
実際に届いた支払いの宛先、金額、承認数を確認しましょう。送金者が用意した受領証では代用できません。自分のフルノードならルールを直接検証できます。他社のサービスを使うなら、誰の情報や資金管理に依存しているのか理解しておく必要があります。店舗のシステムは注文と特定の出力を結び付け、置き換え取引も追跡すべきです。競合や承認の喪失があれば、取り消せない引き渡しを止めます。未承認のお釣りを使う次の支払いも、元の取引に依存しており、その安全性を独立して証明するものではありません。Lightning Network は Bitcoin の取引で資金を入れたチャネルを通じ、高速な支払いを可能にします。チャネルの参加者は、資金の配分を記録した署名済みの commitment トランザクションを交換します。更新時には、後で古い状態を公開した場合に相手がペナルティを科せる秘密情報を渡します。このように古い状態を無効化する仕組みを revocation と呼びます。保護を受けるには、不正な公開を見つけて期限内に対応する必要があります。未承認のオンチェーン送金を見て商品を渡す場合とは異なる仕組みです。承認なしで開く zero-conf channel は資金提供者を意図的に信頼しており、その資金の二重支払いリスクをなくすものではありません。 [13] [14]
理解を深めるには、この項目とあわせて次もお読みください トランザクション, 承認, Mempool, Proof of Work, Replace-by-Fee (RBF), Bitcoin. 次の項目からも参照されています 承認, Reorg, Stale Block, Replace-by-Fee (RBF).