2022年にビットコインの世界でにわかに盛り上がったトピックの1つにゼロ承認取引がありました。具体的には、Bitcoin Core 24.0からFull RBFという設定項目ができ、既定で有効化されていないにせよゼロ承認取引をもって決済とするリスクがより広く認知されました。こちらの記事で解説したとおりです。

未承認トランザクションを置き換え可能にするRBFが既定ではない理由と、既定にするメリット
先月、bitcoin-devメーリングリストで「Bitcoin Core 24.0にFull RBFを導入しよう」という提案が話題になりました。これは機能自体の歴史的経緯のほかにも、レイヤー2の設計やコンセンサスの変更 (ソフトフォーク・ハードフォーク)とは異なる「ポリシールールの変更」がネットワーク利用者に及ぼしうる影響という面で興味深い提案です。 今日はRBFとはなにか、なぜ現状ではすべてのトランザクションがRBFではないのか、そしてすべてのトランザクションがRBFになるメリットをまとめます。 RBFとは RBFとはReplace-by-Feeの略で、あるトランザクションがブロック…

その一方で、原理的にセキュアではないゼロ承認取引を、よりセキュアな形に改変しようという提案がありました。Mutually Assured Destrcution (MAD)トランザクション、訳して相互確証破壊トランザクションです。物騒な名前ですね。

今日はそのMADトランザクションについて、トレードオフの中身などを見ていきます。

MAD Transactions: Mutual Assured Destruction Transactions.
An attempt at better zero confirmation transactions in a full-RBF world.

ゼロ承認取引のリスクプロファイル

ゼロ承認取引で支払いを受け取った側(以下「店主」とします)が損をするのは、自分の目で確認したはずの支払いのトランザクションがブロックに取り込まれなかったときです。これは細かく分けると以下の場合になります:

① 店主が確認したトランザクションの入力UTXOが別のトランザクションに先に使われたとき(二重支払いされたとき)。確かに自分のメモリプールにトランザクションが着金したが、その後違うトランザクションに置き換えられた、など。

② 店主が確認したトランザクションが偽物だったとき(シビル攻撃)。自分のノードやウォレットで確認したが、ノードのピアが全て攻撃者で情報統制されていた、など。

③ 店主がトランザクションを確認していないとき。客の見せた画面を信じた、など。

ビットコインは二重支払いを防ぐシステムですが、ゼロ承認取引は定義的にブロックチェーンに取り込まれていないため、二重支払いされるリスクがあります。

現実には①と③が多く、②は必要なコストと難易度がほとんどの場合リターンに対して大きすぎるでしょう。また、③はリテラシーの問題であるため、ビットコイン側の工夫で防げるのは①のみでしょう。

さて、MADトランザクションとは何者なのでしょうか。

PayjoinをベースにしたMADトランザクション

Payjoinは以前紹介したことのある、店舗決済等のトランザクションにおいて客に加えて店主もUTXOを1つ提供することでオンチェーン分析に用いられる"Common Input Ownership Heuristic" (CIOH)という知見を騙す1つのプライバシー機能です。CIOHは「1つのトランザクションにおいて、入力側はすべて同一のユーザーである」という知見で、実際にほとんどのケースでそうであることは感覚的に裏付けられるでしょう。Payjoinは店側と客側が共同でトランザクションを生成するとオンチェーン分析が難しくなる、というものです。

Payjoinについて詳しくは以下の記事からどうぞ。

CoinJoinの進化版としてのPayJoin
先日、コロナウイルスの影響もあってかVRが流行しているビットコイナーたち数十名が、Altspace VRというアプリを使って学会発表のようなものを行っていました。そこでのプレゼンテーションはPayJoinというCoinJoinの新形態についてでしたが、興味深い内容でしたので共有させていただきます。ちなみに、このようなイベントの企画が行われているBitcoin VR Degeneratesというテレグラムグループがあるので、参加したい方はどうぞ。 COINJOIN ご存知の方も多いかもしれませんが、CoinJoinとは複数の主体が1つのトランザクションに参加して、outputが誰のコインかわ…

MADトランザクションはPayjoinと同じく、客側と店側が共同でトランザクションを作成します。この際、まず店側がUTXOと送り先アドレスを客に伝え、客は通常通りのPayJoinトランザクションに加え、それと1つ以上の入力UTXOを共有するMADトランザクションを作成します:

(店側UTXO、客側UTXO(複数可)) → (店側アドレス、客側お釣りアドレス)

この際、客側UTXOの総額は商品価格の2倍以上にします。そして署名時に「あるカラクリ」を利用します。

MADトランザクションのカラクリは客側が入力するUTXOについて、署名時にSIGHASH_SINGLEフラグやSIGHASH_NONEフラグを活用して「店側が客の署名後に送金先を変更できるようにする」というものです。客側がコミットする唯一の出力は自分へのお釣りの送金です。

SIGHASH_SINGLE: このUTXOは1つの送金先と金額を指定して使用を許可します。署名後に他の送金先の追加と削除や順番の変更が誰にでもできます。
SIGHASH_NONE: このUTXOは送金先に関わらず使用を許可します。署名後に送金先の追加や削除が誰にでもできます。

したがって、このMADトランザクションは以下の性質を持ちます:

・客側は入力UTXOおよび自分へのお釣り出力(自身の入力UTXO総額-支払金額の2倍)にのみコミットしている
・客側は商品金額の2倍について店側に処遇を任せている(以下、預託金額)
・店側はMADトランザクションに使用した入力UTXOにのみコミットしている
・店側は預託金額の処遇を決定できる

店側は受け取ったPayJoinトランザクションに署名し配信し、客が署名したMADトランザクションは保管します。

二重支払いを検知→相互確証破壊開始

①のケースで店主が二重支払いとなるトランザクションをメモリプールに検知した途端、保管していたMADトランザクションが火を吹くことになります。

MADトランザクションにおいて客側は店側に支払金額の2倍について送金先を任せている状態であったため、同じ入力を利用したPayjoinトランザクションが二重支払いされても、ブロックに取り込まれる前であれば店側は最大でこの全額を送金手数料として消費することができます。すると客は支払金額の2倍を支払って商品を手に入れ、店は商品を失い、お互いに損失を出していることがわかります。これが相互確証破壊という名前の由来で、提案者は客側の入力が全て手数料となってしまうこの終着点をNuclear Transactionと呼んでいます。

MADトランザクションのリスク

果たしてMADトランザクションは二重支払いのインセンティブを十分に減らせるのでしょうか。一番大きいのは提案者も記事の後半で検討している「二重支払いトランザクションがマイニングプールに直接提出されるなどして、店側が検知できないリスク」です。MADトランザクションはあくまでブロックチェーンに取り込まれる前に配信されなければ意味がないためです。

提案者はマイナーにとってこれを公表してNuclear Transactionを引き起こしたほうが旨味が大きいという点を指摘しています。二重支払いの客側の期待利得「支払金額×1 - 預託金額×Nuclear Transaction発生確率」に対して、Nuclear Transaction発生時のマイニングプール側の期待利得は「預託金額×ハッシュレートのシェア」なので、客側がマイニングプールと利益を分配すると考えると前者が後者を上回らなければマイニングプール側はNuclear Transactionを引き起こしたほうが得になります。

預託金額が商品価格の2倍以上というのは客側が二重支払いで受け取る価値の期待値が0を上回るラインで、マイニングプールのシェアが小さいほどNuclear Transactionを採掘できる確率が小さくなるため、マイニングプールと客の共謀を防ぐのに必要な預託金額が大きくなります。

仮にハッシュレートの10%を占めるマイニングプールとの共謀を阻止したいのであれば商品価格の10倍以上を預託させなければなりません。

毎回商品価格の20倍を預託させるのは現実的ではないので、小規模なマイニングプールとの共謀で5%以下の確率で二重支払いを成功される可能性があります。店主の自腹ですがPayPayのキャンペーンみたいで市場が選好しそうな結果ですね。
この可能性を排除できない時点でMADトランザクションの保証する安全性はかなり限られていることがわかります。(通常のゼロ承認取引よりはマシですが)

提案者は競合する(恐らくよりシェアの大きな)マイニングプールが客側と共謀しているマイニングプールに接続し、二重支払いトランザクションを盗み見てネットワークに配信することでNuclear Transactionを発生させるから大丈夫だと主張しています。不特定多数に開かれているマイニングプールであればその可能性も十分にありそうですが、泥棒ギルドみたいなマイニングプールができないとも限りません。提案者が「ゲーム理論的に安全だ」とする主張はこの可能性で覆せます。

また、MADトランザクションは支払い時点で店側に支払い金額の数倍を手数料として費消する権限(送金する権限も)を与えているため、客側がNuclear Transactionを発生させるケースも考えられます。(店が預託金額を着服しようとした、など)
そもそも残高に対して資金効率が悪いとも言えます。

店側にそうするメリットがなかったとしても結局Payjoinトランザクションがブロックチェーンに取り込まれるまで全く安心できないのは私だけでしょうか。

まとめ

・MADトランザクションはPayjoinと組み合わせて利用し、二重支払いがあったときに店側が客側の資金を当初の支払い金額の数倍バーンできるようにする仕組み

・客側の署名にSIGHASH_ONE, SIGHASH_NONEを用いることで店側も後から出力を変更してバーンできる

・マイニングプールとの共謀を防ぐために、MADトランザクションの預託金額は支払金額の数倍以上必要。また、それでも気休め程度かもしれない

・ゼロ承認取引をより安全にしようという仕組みとしては面白いが、個人的に使おうとは思えない点が実用面、心理的安全性などいくつかある