デスクトップ向けのビットコインウォレットとして近年人気上昇中のSparrow Walletが対応したことによって、Silent Paymentsへの注目が再び集まっています。このプライバシー機能は、実は以前から存在するBIP47というプロトコルの欠点を大部分解消するものです。

どちらもビットコインアドレスの再利用を防ぎつつ送金を受け取れる固定の文字列を実現するためのプロトコルですが、仕組みは非常に似ているにも関わらず根本の設計思想が大きく異なります。

また、もしかすると読者の皆様には、BIP47に関連するPayNymというプライバシー機能の名称を聞いたこともある方もいらっしゃるかと思います。

本稿ではSilent PaymentsとBIP47/PayNymの関係性に注目して、なぜSilent Paymentsがこれほど注目されているのかを解説します。

Silent Paymentsについては過去記事をご覧ください。

第三者からプライバシーを守る新しい支払い方法、Silent Payments
ビットコインで寄付を受け付けたいとき、ウェブサイトなどにビットコインアドレスを公開することが一般的です。この方法のメリットはどのウォレットでも必ず使えること、送金する際に相手との通信等が不要なこと(新しいアドレスを発行してもらう必要がない)、アドレスを生成して貼り付けるだけというシンプルさです。また、場合によっては集まった金額を見てもらいたいという場合もあるでしょう。 一方で、集まった金額の透明性はそのアドレスに対する送金がすべて見れてしまうことの裏返しです。このため、特定の団体に寄付したユーザーのトランザクションを辿って本人を特定したり、逆にその団体の資金の流れを追って取引所等の口座を凍結することができてしまいます。 この問題の解決方法はBIP47、寄付の両側でのミキシング等いくつかありますが、今日はそれらと比較してシンプルさが際立つ“Silent Payments”という新しいものを解説します。 仕組み 送金を受け付けたい者は32バイトの公開鍵X = x*Gを「サイレントアドレス」として公開します。 送金したい者はサイレントアドレスを見て、自身の持つUTXOから送金に使

BIP47の仕組みには無駄が多い

BIP47/PayNymについても実は過去記事で軽く紹介しています。こちらです:

ビットコインの送金UXに一石を投じるeasypaysyとPayNymの比較
安土さんの技術ブログに先を越されてしまいましたが、今月初めにビットコインのUXを向上するeasypaysyというプロトコルのホワイトペーパーが発表されました。 easypaysyが改善しようとしているのはビットコインアドレスという仕組みのUXなのですが、似た機能としてSamourai Walletが実装したPayNymsというものがあります。今回のコラムでは双方の特徴を紹介し比較します。 EASYPAYSY ビットコインアドレスは使い回しが推奨されない上に、人間にとって読みづらいです。実際、送金のたびにドキドキする人も多いでしょう。また、頻繁に送金する相手から毎回新しいアドレスを教えてもらうのも面倒です。easypaysyはこれらの問題を改善するために可読性の高い「アカウント」を使って扱いやすさとセキュリティを両立しようと提案されたプロトコルです。 技術的な詳細は冒頭で紹介した安土さんのブログに任せて、ここでは概要を説明します。 easypaysyを使うと、ユーザーは自身が保有する鍵2つを使った2-of-2マルチシグアドレスから送金することで次のようなアカウント名を取得できま

今日は図解を試みます。

BIP47の仕組み

BIP47では、まず支払いを受ける側はBIP47 Payment Codeと呼ばれる公開鍵をWebサイトなどに公開します。”PM8T~”で始まるビットコインアドレスのようなものです。

BIP47 Payment Codeの例

それに対して送金したいユーザーは、まず自分自身のPayment Codeを宛先ユーザーに通知する必要があります。そのため、自分のPayment Codeを宛先ユーザーのPayment Codeで暗号化し、そのデータをOP_Returnに含めた「通知トランザクション」を、宛先ユーザーのPayment Codeから生成した最初のアドレス宛に送ります。

宛先ユーザーのPayment Codeから導出される最初のアドレス宛に送る、自分のPayment Codeを相手に伝えるための通知トランザクションの図

この通知トランザクションが送られてくることで、宛先ユーザーは「これ以後はこのBIP47 Payment Codeのユーザーからの送金が来る可能性がある」と認識します。

通知トランザクションの後、送金ユーザーは自分自身と宛先ユーザーのPayment Codeを組み合わせて、その二者のみが知ることのできるウォレットを作成できます。この「共同のウォレット」内で毎回新しいアドレスを発行することで、アドレス再使用を防ぎながら送金することができます。宛先ユーザーはこのウォレット宛の入金がないか、通常のウォレットと同様に確認できればよいのです。

💡
共同のウォレットと表現しましたが、新しいアドレスは送金ユーザーにも生成することができる一方で、そこにある資金を動かすことができるのは宛先ユーザーのみです。

送金者や宛先ユーザーが違えば生成される「共同のウォレット」も異なるため、このように生成したアドレス宛に何回送金したとしても、実際の送金トランザクションは当事者以外には普通のビットコイントランザクションに見え、宛先ユーザーの公開情報であるPayment Codeとの関わりはわからないというわけです。

無駄な部分、プライバシーが足りない部分

しかし、BIP47にはいくつか無駄に感じる部分やプライバシー面での落とし穴があります。

まず、新しい相手に送金するときは必ず通知トランザクションが必要になります。これが曲者で、通知トランザクションには

  • 実際の送金に加えて、通知トランザクションの手数料が余分にかかるので送金コストが高い
  • 通知トランザクションの送り先であるPayment Codeから導き出されたアドレスは再使用される(受け取る側の視点では、自分が何回通知トランザクションを受け取っているかがバレる)
  • 通知トランザクション自体に使用するコインとその後の実際のトランザクションに使用するコインの履歴が結びついていると、本来得られるはずだったプライバシーが損なわれる恐れがある

という問題があります。

そもそもなぜ通知トランザクションが必要なのかというと、受信者側でビットコイントランザクションの全数探索を不要にするためです。自分のPayment Codeから導いたウォレットを監視していて通知トランザクションが来たら、その送金者のPayment Codeと組み合わせて導出される新たな「ウォレット」を登録して、そのウォレットのアドレスだけを監視すればよいので、ウォレットの各アドレスの残高更新を監視する一般的なモバイルウォレットのインフラで実現可能です。

一方、全数探索する場合は通知トランザクションは必要ありませんが、ビットコインのフルノードが必要になります(後述)。

受信者視点だと「ウォレットを監視する」仕組みだけで完結するので、モバイルフレンドリー

他にもBIP47にはいくつか問題があります:

  • 「共同ウォレット」内で何番目の宛先アドレスまで使用したかは送金者が管理する必要があるので、複数デバイスを使った場合などにアドレスの再使用をしてしまうおそれがある
  • 宛先ユーザーは送金者のPayment Codeがわかる(送金者はプライバシーを最大化するためにPayment Codeを毎回使い捨てにし、新たに通知トランザクションを出す必要がある)

まとめると、BIP47の前提として、モバイルウォレット、軽量クライアントで利用することが考えられていたようです。ただし、これ自体にもプライバシー面での問題があるので、難しい選択だっただろうと感じます。ビットコインのプライバシー重視の利用はなかなかの難問です。

PayNymとBIP47の関係

ここまで意図的にBIP47 Payment Codeという表現で統一して解説してきましたが、より一般的な名称として知られるPayNymとの関係についても短く説明します。

PayNymは人間にとって読みづらいBIP47 Payment Codeを、人間にとって扱いやすいIDのような文字列とプロフィール画像に変換したものです。文字列とプロフィール画像があることによってWebやウォレットでBIP47 Payment Codeを扱いやすくします。

ビットコイン上級者に人気のデスクトップ向けウォレット「Sparrow Wallet」がBIP47/PayNymにも対応しているので、イメージが沸かない方はぜひ使ってみてください。

Sparrow Walletについての記事はこちら(近日公開)

https://bitcoin-research.jp/sparrow-wallet/

Silent Paymentsはシンプルな分、受け取りの負荷が大きい

さて、BIP47ではトランザクションの全数探索をしないでいい代わりに通知トランザクションが必要になったと説明しました。通知トランザクションを不要にするには、どうにかして送金者のPayment Codeか、何らかの公開鍵を宛先ユーザーに伝えなければなりません。

1つの解決策は、「鍵交換はブロックチェーン外で行う(送金者のPayment Codeをメッセージなどで伝えてもらう)」ことです。ブロックチェーン外でコミュニケーションを取ることができれば、プライバシー面でリスクの塊である通知トランザクションを廃止することができます。しかし、WebサイトにPayment Codeを公開するだけという手軽さは失われてしまいます。

もう1つの解決策は、「鍵交換と送金を1つのトランザクションで実行して、宛先ユーザーにはなんとかして見つけてもらう(全トランザクションを確認してもらう)」です。Silent Paymentsはこの方式を採りました。

Silent Paymentsでは送金者がPayment Codeの代わりに、送金元アドレスの公開鍵を使用してBIP47とほぼ同じことをします。宛先ユーザーはすべてのビットコイントランザクションを「もしかすると自分宛の送金かもしれない」と考え、その手順に沿って生成されたビットコインアドレス宛の送金ではないか1つ1つ確認します。

OP_Returnを使用せず、余分なアウトプットもない1トランザクションで送金が完了するのでSilent Paymentsは傍からは普通のビットコイン送金にしか見えません。その代わり、宛先ユーザーの視点からするとすべてのビットコイントランザクションが自分宛ての送金かもしれないので全数検査が必要ということになります。そのためにビットコインノードが必要になるのです。

したがって、Silent Paymentsは

  • 受け取る側にビットコインノードが必要

というのがデメリットになります。こちらはモバイルだけで完結させるのは少し難しい条件です。

プライバシーは簡単ではない

忘れないでほしいのは、BIP47もSilent Paymentsも解決しようとするプライバシーの問題は「アドレス再使用の問題」であることです。ビットコイン利用時のプライバシーに関しては他にも

  • ヒューリスティクスによるトランザクション内容分析
  • KYC情報に結びついたトランザクション
  • 資金の全貌を隠すコインコントロールの難しさ
  • 自分でノードを実行しないことによる残高データやメタデータの漏洩
  • 他のユーザーのバッドプラクティスによる波及

など様々な課題があります。また、ライトニングネットワークは送金者のプライバシーを大きく改善した一方で、受取時のプライバシーはまだ改善の余地があります。

ビットコイン利用時のプライバシーは重要な問題でありつつ、まだまだこれから取り組むべき範囲が大きいというのも実情です。

Silent Paymentsのユースケース例

身近でSilent Payments導入のメリットが大きそうなのは取引所の入金アドレスでしょうか。同じ入金アドレスを繰り返し使っていると、入金を事前にブロックチェーン分析によって検知されてしまい、取引所利用者が売買する前にフロントランニング(先回り売買)されてしまい、不利益を被ります。

Silent Paymentsを使って、取引所入金であったことが事後的にしかわからないようにするだけでも、特に大口ユーザーにとって魅力的だと思います。

💡
悲しいことに、金融業界でプライバシーはネガティブな印象がついてしまっているので、Silent Paymentsという名前のプロトコルを取引所が導入しにくいかもしれません。

しかし、あくまでSilent Paymentsは第三者が知りうることを減らすだけで、取引所が入金元について知る情報は従来と変わりません。