Bitcoin Unlimitedのリード開発者、ゼロ確認と二重支払いについて考察
2018.11.17
BCHNews編集部
こんにちは、BCHNews編集部です。
先日、BitcoinCashのフルノードクライアントの一つであるBitcoin Unlimitedのリード開発者、Andrew Stone氏がyours.orgに、「Identifying and Resolving the Conflict Between 0-conf and Permissionless Innovation」と題する記事を投稿しました。
この記事では、ゼロ確認(0-conf)に対する二重支払い(Double Spending)のリスクと対策について、Andrew Stone氏の考察が記述されています。
以下、記事の内容を簡単に紹介したいと思います。
ゼロ確認(0-conf)とは
Bitcoinのトランザクションは、作成されてネットワークに伝搬されると、マイナーによってブロックに含められます。これで、1 confirmation(1確認)となりますが、多くの場合、偶発的ないし意図的なブロックチェーンの分岐の可能性を考慮して、その後6ブロック以上が連ならなければ、送金が確定したとみなさないといった運用がなされています。6ブロック連なれば6 confirmation(6確認)となり、6 confirmationまでいけば、ブロックチェーンのreorg(巻き戻し)が発生することは、現実的にはないとされています。ただし、以前発生したmonacoinのreorg事件を考えると、マイナーが少ないと6 confirmationでも巻き戻しが発生するリスクがあるようです。
【過去記事】
『Monacoin、reorg対策を含むMonacoin Core v0.16.2をリリース』
(https://bchnews.jp/bitcoincashnews-e/1299)
しかし、通常の小売店などで商品を購入する場合、6 confirmationどころか1 confirmationを待つことも現実的ではありません。なぜなら。1 confirmationされるのに平均して10分の時間を要するためです。コンビニでちょっと飲み物を買っただけで支払いの完了に10分も待たされるというのは現代では受け入れられないでしょう。
そのため、実際には、比較的少額な決済では、0 confirmationの状態で支払いを確定してしまいます。もちろん、0 confirmationということは、まだ未承認のトランザクションであるため、店舗側にとってはリスクがありますが、少額決済の場合は、多少のリスクには目をつぶって利便性を優先しているということになります。
とはいえ、悪意のある買い手がDouble SpendingによってBitcoinを支払わずに商品を購入してしまうといったリスクを無視することはできず、そのための手法が様々議論されています。
Double Spendingとは
Double Spendingとは、既に使用済みのBitcoinを再度使用する不正行為です。方法はいくつかあり、0-confに対するDouble Spendingは次の2つの方法が考えられます。
- Fast Respend
こちらが一般的に言われる手法です。店舗に支払う正当なトランザクションと同時に、同じコインを自分宛てに送金するトランザクションをネットワークに流す方法です。店舗側は即座に支払いが完了されたとみなしますが、後者のトランザクションが先にマイニングされた場合、店舗への支払いトランザクションは破棄されてしまい、結果的に店舗は支払いを受けることなく商品だけ取られてしまうことになります。 - Reverse Respend
こちらはあまり聞かない方法です。予め、非標準トランザクションをマイナーに直接送信した後、店舗に支払う正当なトランザクションをネットワークに伝搬させる方法です。今回のAndrew Stone氏の投稿は、こちらの手法について書かれていますが、この説明では分からないと思いますので、次のセクションで詳しく紹介します。
Reverse Respendとは
Reverse Respendは、上述した通り、0-confに対してDouble Spendingを実施する方法の一つです。
こちらを理解するためには、前提としてStandard Transaction(標準トランザクション)について説明が必要かと思います。標準トランザクションとは、ビットコインプロトコルのIsStandard() 関数によるチェックを通過するトランザクションのことで、具体的には以下の5つのいずれかであることがチェックされます。
- Pay-to-Public-Key-Hash (P2PKH)
- Pay-to-Public-Key(P2PK)
- Multi-Signature
- Pay-to-Script-Hash (P2SH)
- Data Output (OP_RETURN)
これら5つのいずれにも該当しないトランザクションは無効と判断されますが、このチェックは、他のノードへトランザクションを伝搬するかどうかといった判断には使われますが、マイナーはこのルールに縛られません。
つまり、非標準トランザクションは、「他のノードへは伝搬されないが、マイナーの手元にあればブロックに入れられる可能性がある」ということになります。
Reverse Respendは、これを利用しています。まず、マイナーに対して直接、自分宛の非標準トランザクションを予め送信しておきます。このトランザクションは、マイナーによってブロックに取り込まれますが、他のノードには伝搬されないため、店舗側は不正なトランザクションが作成されていることを知りません。その後、店舗宛の正当なトランザクションをビットコインネットワークに流すことで、店舗側は送金が完了したと判断します。しかし、マイナーが既に同じビットコインを使ったトランザクションを保持しているため、後から伝搬されて来た正当なトランザクションは破棄されてしまいます。
このようにして、Double Spendingを実現してしまうのがReverse Respendですが、実際にはこの手法を実現するのは困難です。なぜなら、通常はマイナーのノードは、直接P2Pレイヤーに晒されてはおらず、また、非標準トランザクションを受け取ることはないからです。「マイナーに対して直接送る」というところに無理があるということです。
不注意なイノベーションによるリスク
Reverse Respendは、通常では困難な手法ですが、不注意なイノベーションが、Reverse Respendを容易にしてしまうとAndrew Stone氏は指摘します。
新しい機能を実装するために標準トランザクションの概念に変更を加えたらどうなるでしょうか。変更を適用したノードをA、変更を適用していないノードをBとします。新しいタイプのトランザクションをAノードが受け取った場合、Aノードは他のノードへそのトランザクションを中継しますが、Bノードは新しいタイプのトランザクションに対応していないため中継しません。
そのため、攻撃者は、新しいタイプのトランザクションをAノードに伝搬して、古いタイプのトランザクションをBノードへ伝搬するだけでDouble Spendingが成功する可能性を作ることができます。どちらのトランザクションがブロックチェーンに取り込まれるかは、AノードのグループとBノードのグループそれぞれのハッシュパワーに依存します。
Andrew Stone氏は、これを解決する方法として、以下の3つをあげています。
- IsStandard()ルールを削除してしまう。
- Tom Hardin氏が提案した「Super-Standard Transactions」を実装する。
- BUIP088で提案されているDouble-spend Proofsを実装する。
Andrew Stone氏は、上の二つはどちらも問題を完全には解決できない上に影響が大きいため、Double-spend Proofsまたは同等の技術で解決すべきと結論づけています。
さいごに
今回は、BitcoinUnlimitedのリード開発者Andrew Stone氏の記事を紹介しました。0-confに対するDouble Spendのリスクを軽減する提案には、他にも、Double Spend Alertsがあります。BitcoinCashが実用的な通貨として定着するためには、これらの技術も必要になってくると思われますので今後の開発に期待したいですね。
最新情報はこちら
BCHNewsでは公式のTwitterアカウント(@bchnews_jp)を開設しました。
更新情報を配信しておりますので、よろしければフォローしていただけると嬉しいです。
この記事のカテゴリ
この記事のタグ
BCHNews編集部
BCHNews編集部です。
日々更新される暗号通貨関連のニュースを読者の皆様にお届けします。