https://www.google.com/search?q=btc-atm+double+spender
本日は二重支払い攻撃(double spending attack)のお勉強です。
サトシナカモトが書いたビットコインのホワイトペーパーには二重支払いを防止するためのプルーフオブワークの精密なアルゴリズムが提案されていましたが、マイニングにより追加ブロックが生成される頻度は約10分に1回と設計されていました。送信されたトランザクションがブロックチェーンに組み込まれるには、最短でも平均して10分の時間を要する設計だったのです(勿論、1分とか2分で組み込まれる場合もあります)。
これでは瞬時に決済しなければならないファーストフード店とかビットコインATMの用途には対応することができません。仕方なく、瞬時決済が必要な場面では、未使用トランザクションUTXOがメモリプールに投入されたことを確認して、それで支払いの有効性を認めて、コーヒーやハンバーガーを提供したり、ATMの現金支払いを行っていたりしたのです。
ビットコインネットワークに、送金トランザクションを送信した時に、それを受信した各ノードは、そのトランザクションの有効性を審査して、入力トランザクションがUTXO(未使用トランザクション出力)リストに含まれているかどうかをチェックします。
新しく受信されたトランザクションの入力欄に、使用済みのトランザクション出力(ビットコインアドレス)が含まれていた場合は却下されます。使用済みのトランザクションであっても、RBF(replace-by-fee)と言って、送金手数料が従来のものより高額であれば、古いトランザクションを破棄して新しいトランザクションを受け入れる(つまりトランザクションを入れ替える)という処理を行います。RBFはトランザクションの承認スピードをアップさせるために手数料を増額できるようにする仕組みです。
1vbyteあたり1satoshiの最低送金手数料で作成され送信されたトランザクションは、ビットコインマイナーにとって「儲からないトランザクション」であり「仕方なく受け入れるトランザクション」となります。特に「手数料嵐」が吹き荒れている時期(送信トランザクションが増えて手数料が高騰している時期)には、そのような低額手数料トランザクションは、なかなかビットコインネットワークの中に伝播されていかないことになります。上記の画像のトランザクションは、ビットコインネットワークの中でわずか14のメモリプールにしか含まれていないとレポートされています。
このような状態で、このノードから物理的に離れている場所にあるノードに、同じUTXOを使った手数料の高額なトランザクションを送信したらどうなるでしょう。そのUTXOは、そのノードでは未使用のままなので、問題なく受け入れられる、ということになります。そして、その隣のノードへのリレー(伝播)される場合でも、UTXOとして認められることになります。そして、ビットコインネットワーク全体で、最初の低手数料トランザクションと2番目の高額手数料トランザクションが伝播されていく場合に、2番目のトランザクションが優勢になって、ついにマイナーが作成する追加ブロックにも入ってしまうということになってしまうわけです。後出しジャンケンで勝ってしまう、という状況です。
※最初のトランザクション(置き換わって消えてしまう)
入力1→出力1(おつりアドレス=支払者の所に戻る金額)
→出力2(支払い先アドレスに0.1BTC)
→マイナーへの送金手数料0.0001BTC
※2番目のトランザクション(ブロックに組み込まれる)
入力1→出力1(おつりアドレス=支払者の所に戻る金額)
→出力2(支払い先アドレスに0.001BTC)
→マイナーへの送金手数料0.001BTC
どうでしょう、難しいでしょうか。ゆっくり考えてみてください。ビットコインの仕組みの根幹に関わる部分です。ちなみに現在では、このような弊害を防止するために、ビットコインATMにUTXOの二重支払いが無いかどうかをチェックする手順が追加されたり、ライトニングネットワークと言って、10分に1回のブロックチェーンの手前で、即時決済を確認する仕組みも整備されています。ATMからのトランザクション送信を全てNon-RBFトランザクションにする対策も考えられます。RBFを禁止にするのです。
しかし、完全に二重支払いを防止するためには、トランザクションがブロックチェーンに組み込まれて、それが6個繋がったこと、組み込まれたブロックのあとに5個のブロックが追加されたことを以って「二重支払いの心配の無い決済」と認められることになります。しかし、これは最低でも1時間以上掛かってしまう条件です。
孤児ブロック
承認されたブロックでも、悪意のあるノードが作成したブロックは孤児ブロックとして破棄されますが、過去に4ブロックまでは接続された実績があります。
一番新しい孤児ブロックは、2019年8月26日の591848です。この番号のブロックがmainchain と orphan で2つあるのです。採掘難易度が上昇しており、孤児ブロックといえども作成することは困難となっているのです。
ビットコインネットワークの特性を理解して、安全に利用したいですね。
コメントを残す