用語集 / プライバシーとセキュリティ
Payjoin
別名はP2EP、Pay-to-endpointです。
- Payjoinとは?
- Payjoinは、ビットコインを受け取る側が自分のインプットの1つをあなたのトランザクションにこっそり加える支払いで、オンチェーン上の金額が実際に支払った金額と一致しなくなります。
BIP-78で規定されています。
双方がインプットを提供するため、アナリストがアドレスをウォレットごとにグループ化する際に用いるルールが崩れます。Nicolas Dorierが2019年5月にBIP78として仕様化したもので、理論上の話ではなく実際に導入されています。BTCPay Serverは2020年に対応を出荷しました。支払う側にとっては、トランザクションの手数料が少し高くなるだけで、見た目はまったく普通です。
仕組み
Payjoinプロトコルは、送信ボタンを押した瞬間とトランザクションがブロードキャストされる瞬間の間に行われる短いやり取りです。
あなたのウォレットは、通常の支払いの場合とまったく同じように、支払いを未署名のPSBTとして構築し、受け取る側が支払いリクエストで告知したエンドポイントに送信します。受け取る側は自分の未使用アウトプットの1つを2つ目のインプットとして加え、正しい支払いを引き続き受け取れるように自分のアウトプットを同じ金額だけ増やし、変更後のPSBTを返送します。あなたのウォレットは送金先と金額が変わっていないことを確認し、署名してブロードキャストします。
オンチェーンに記録されるのは、2人の異なる人物が所有する2つのインプットです。標準的なクラスタリングルールを適用するアナリストは、見知らぬ2人を1つのウォレットに統合してしまい、その誤った結論がデータセットに永久に記録されます。支払い金額も消えます。受け取る側のアウトプットは支払い額に自分が提供したインプットを加えたものになるため、どちらのアウトプットもあなたが支払った額と一致しません。監視する側は、トランザクションから請求内容をもう読み取れません。
BIP78はあなたの負担するコストに上限を設けます。maxadditionalfeecontributionパラメーターは、受け取る側が加える追加のインプットに対して支払ってよいサトシ数を示すため、受け取る側があなたの手数料をこっそり膨らませることはできません。何か問題が起きた場合、エンドポイントに到達できない、応答が不正な形式である、金額が合わない、といった場合は、あなたのウォレットは元のトランザクションをブロードキャストする動作に切り替わります。失敗したPayjoinも完了した支払いであるため、何も壊さずに既定で有効にできます。
受け取る側には、プライバシーとは関係のない2つ目の利点があります。Payjoinのたびに、他人が主に支払うトランザクションに自分のコインの1つを組み込めるため、小さなアウトプットだらけのウォレットに対して無料の整理になります。
使われる場面
Payjoinは加盟店側で機能するため、ほとんどの人は気づかないうちに接しています。
BTCPay Serverは最初の本番実装で、請求書でPayjoinを提供しています。そのため寄付ページやセルフホスト型のチェックアウトで最もよく見かけます。WasabiとSparrowはデスクトップからPayjoinのエンドポイントに送信できます。
当初の設計の弱点は、受け取る側が公開サーバーを運用し、支払いの瞬間にオンラインである必要があり、加盟店に限定されていたことです。2023年8月にDan GouldとYuval Kogmanが作成し、現在もドラフトであるBIP77「Async Payjoin」は、直接のエンドポイントを、Oblivious HTTP経由でアクセスするストア・アンド・フォワード方式のディレクトリに置き換えます。これにより、2つのスマートフォンのウォレットが同時にオンラインでなくてもPayjoinを完了できます。Bull BitcoinとCake Walletはこのバージョンをモバイルアプリで出荷しており、Payjoinが通常の個人間の支払いに利用できるようになったのは初めてのことです。
利用する最大の理由は、あなた自身が目にすることのないものです。データセット内のPayjoinが1件増えるたびに、1件も行ったことのない人を含む全員にとって共通インプット所有ルールの信頼性が下がります。利用者本人だけを助けるプライバシー技術はまれですが、これはトランザクションごとにネットワーク全体の監視を弱めます。