Whirlpool by Samourai
2020-05-16Whirlpool は Samourai Wallet チームが実装した Coinjoin 実装です。
Whirlpool は ZeroLink フレームワークをベースにしており、いわゆる Chaumian Coinjoin です。
Chaumian Coinjoin を実装している他のチームとしては、Wasabi Wallet があります。
Wasabi Wallet も ZeroLink フレームワーク をベースにしています。
この文章で触れていないこと
- Wasabi Wallet との比較
- Whirlpool および Samourai Wallet の実装に関する分析
- Whirlpool の使い方
- Samourai Wallet が提供する匿名性保護機能(stonewallなど)の分析
また私は Whirlpool および Samouwai Wallet のソースコードは読んでいません。
Zero Link プロトコル
ZeroLink フレームワークは Wasabi Wallet の開発者である nopara73、 Samourai Wallet の開発者である TDevD が提案している、Bitcoin の Fungibility/ Anonymity を向上させるためのフレームワークです。ZeroLink ではCaumian Coinjoin を mixing 技術として用い、その前後のトランザクションで UTXO をどのように扱うべきかなどを定義しています。
Choumian Coinjoin
Choumian Coinjoin は cordinator(tumbler/ mixer) を信頼する必要がない coinjoin プロトコルです。cordinator 単体では、input と output を関連付けることはできません。
日本語の解説はBTCNによる記事がわかりやすいので、ご参考ください。
ビットコインの匿名性とChaumian CoinJoin【前編】
ビットコインの匿名性とChaumian CoinJoin【後編】
Whirlpool による ミキシング
Whirlpool による ミキシング には tx0, flat fee, remix といった特徴があります。
簡単にこれらの特徴を確認したうえで、実際の Whirlpool による Coinjoin transaction を観察します。
Whirlpool 特徴
Whirlpool の ミキシング の特徴は以下
- tx0 から始まる
- input のサイズは 0.01 BTC, 0.05 BTC, 0.5 BTC (pool size)
- 必ず 5 input/ 5 output
- remix が行われる
- 5 input のうち少なくとも 3 input は remix で、remix の input は多くても 4 input
- 手数料は定額(Understanding pools and pool fees - Samourai Wallet)
ミキシングのステップ
Whirlpool でミックスされる UTXO は3つのグループに分類されます。
- Deposit
- Pre-mix
- Post-mix
Deposit
Deposit は Samourai Wallet で管理される bech32 のすべての UTXO で、Pool に入れることができる UTXO のセットです。
Coinjoin ではミックスされる UTXO のセットを Pool と呼ぶことがあります。
Whirlpool では bech32 以外の UTXO からミキシングプールに UTXO を入れることはできません。
Pre-mix
Whirlpool による cycle(whirlpool におけるミキシングのことと思われる) への参加の意思表示が行われた UTXO のうち、まだ 一度も cycle が実行されていない UTXO です。
Post-mix
Whirlpool で1度以上の cycle が行われた UTXOs はすべて Post-mix に属します。
Post-mix の UTXO はミキシングが済んでいるので、送金に使うことができます。
Whirlpool の特徴の1つはこの Post-mix UTXO の取扱にあります。
cycle は一度で完了ではなく、Pool の UTXO を消費しない限り続けられます。Whirlpool ではこれを remix と呼んでいます。
Whirlpool の Coinjoin を観察してみる
explorer で 実際の Whirlpool の transaction を確認しながら Coinjoin の step を説明します。
Transaction 323df21f0b0756f98336437aa3d2fb87e02b59f1946b714a7b09df04d429dec2
Coinjoin
Coinjoin では Pool の output の量が同じである必要があるとされています(1)。Whirlpool ではさらに、input も output に近くなるような transaction が生成されます。
例えば txid: 323df21f0b0756f98336437aa3d2fb87e02b59f1946b714a7b09df04d429dec2の output はすべて 0.05 BTC です。これは 0.05 BTC の pool であることがわかります。
input のうち2つは output と等しい 0.05 BTC、3つは 0.0501 BTC であることがわかります。また3つの input の 0.05 BTC を超えた分の 0.0003 BTCは手数料となっていることもわかります。したがってこの trasaction だけからわかる情報では、どの input がどの output に使われたかは判別することができません。
また Whirlpool の transaction には2種類の input が必ず存在します。1つはpool size と完全に同額の input で、これは remix された input です。もう1つは pool size に fee が上乗せされた額の input です。
しかしこのように都合よく、同じ input と fee に丁度よい端数ををもった input を参加者が用意できるでしょうか。実は Whirlpool にはこれらの input を事前に作成する tx0 ステップがあります。
tx0
Whirlpool による ミキシング は必ず tx0 から始まります。tx0 では次の3つのことが行われます。
- pool size に合わせた output の作成
- Whirlpool cordinator への手数料の支払い
- change
先程の coinjoin transaction の input 0 が生成された tx0 を見てみます。
Transaction 333f45431e47b9543772013ac83a9b33cc58dc3245ccfd48b972107bb8405c13
pool size に合わせた output の作成は、先程の coinjoin transaction の input のうち 0.0501 BTC にあたる output を作成することを指しています。
Transaction 333f45431e47b9543772013ac83a9b33cc58dc3245ccfd48b972107bb8405c13 に複数の 0.05 BTC の output が確認できます。
この tx0 の output 1 は、Whirlpool cordinator への手数料の支払いです。0.05 Pool の手数料である、0.0025 BTC の output であることがわかります。
また 0.01346981 BTC の output 2 があることがわかります。これは pool size に満たない分をユーザーに返す change output です。
このように tx0 で手数料の支払いと change output の生成を済ませているため、Whirlpool の Coinjoin transaction は、先程の transaction のように きれいな transaction がつくられます。
tx0 の良い点
tx0 は Zerolink で定められているステップではありません。Samourai Wallet の tweet や Blog などから推測するに、tx0 を導入している理由は以下の2つが考えられます。
- peeling chain を防ぐ
- Anonymity Sets の計算を簡単にする
peeling chain とは、大きな input が少額の送金に繰り返し使われることで change output がが連鎖していくことです。これは Bitcoin の UTXO は一部だけ input に使用することができないことから起きる現象で、UTXOのサイズは関係はありません。下のイラストでは、独立した送金がすべて1つの大きな output を元にしていることが簡単にわかります。
大きな output を Coinjoin するときに、ラウンドごとに手数料や change output を生成しているとこれに似たようなチェーンが形成されることになります。tx0 で fee と change output を生成することで、coinjoin transaction での peeling chain の発生を防ぐ目的があると思われます。これがどれほど有効なのかは不明…。
これは同時に二点目の Anonymity Sets の計算を簡単にする ことにも影響を与えている可能性があります。coinjoin transaction の形式が一定になることでもしかしたら計算がシンプルになっているのではないかと思います。わかりませんが。
Anonymity Sets
Anonymity Sets に厳密な定義はありませんが、input と output の関連づきやすさの指標になることが多く、Anonymity Sets が大きいほど匿名性が高いとされます。Whirlpool における Anonymity Sets については Samourai Wallet のブログで説明されているので、そちらをご参考ください。
Diving head first into Whirlpool Anonymity Sets. - Samourai Wallet - Medium
Remix
ここで Remix について確認します。Whirlpool の coinjoin の input には2種類あると説明しましたが、そのうちの1種類が remix input です。
Coinjoin は回数を重ねるほど anonymity sets が増加し、匿名性が高まると考えられています。Whirlpool は自動的に coinjoin を繰り返す仕組みをとっており、Post-mix UTXO が再度 coinjoin されることを remix と呼んでいます。Post-mix UTXO は、サーバーに接続されている限り別の coinjoin に再度含まれる可能性が常にあります。つまり Whirlpool では、Pool に UTXO 入れている限り anonymity Sets が増え続けます。手数料は固定で tx0 ですでに支払いを済ませているため remix による追加コストは発生しません。
Post-mix transaction
Coinjoin を用いてプライバシーを守るために、Coinjoin のロジックや仕組み、サーバー運用と同様に重要なポイントに Coinjoin されたあとの通常の送金の扱いがあります。Post-mix UTXO および unmixed change output をどのように扱うかという問題です。これが適切に行われない場合、Coinjoin で得たはずの匿名性を低下させてしまう可能性があります。
たとえば、coinjoin された output(mixed output) と unmixed change output を同じ transaction の input として使用した場合、mixed output と unmixed change output の所有者は同じであるという予想が成り立ちます。
これは一例でしかありません。Bitcoin trasnaction の匿名性を守るためにはとても多くのことを気にしなければならず、いまあげた、どの output を input に使用するかという coin selection 問題はそのうちの1つです。
これは一例でしかありません。Bitcoin trasnaction の匿名性を守るためにはとても多くのことを気にしなければならず、いまあげた、どの output を input に使用するかという coin selection 問題はそのうちの1つです。
Samourai Wallet は stonewall、stonewallx2(2 party coinjoin)、stowaway(Payjoin/ P2EP と類似する trasnaction)と呼ばれる機能を提供することで、Post-mix transaction における匿名性を保護しています。
また tx0 で発生した change output を再度使用しない UTXO に分類することができるため、change output を input に含めてしまうことによる匿名性の低下も防ぐことができます。
Coin selection をユーザーが手動で行う必要がないため、人為的なミスによる匿名性の低下を防ぐことができます。
Whirlpool のプライバシー上の懸念
残念ながら現時点では、Bitcoin transaction のプライバシーを守るのはとても難しいことです。Whirlpool を使えばすべて解決というわけではありません。Whirlpool を使う上で、どのようなプライバシー上の懸念があるかを確認します。
Samourai Wallet 単体での懸念
Whirlpool と Samoraui Wallet は transaction レベルでのプライバシーを強く保護しています。またその UI/ UX もよく設計されています。しかしネットワークレベルでのプライバシーは、運用者である Samourai Wallet に信頼をおいています。
現在スマートフォンウォレットは Fullnode ではないため、Bitcoin の Fullnode に接続し transaction の情報などを取得する必要があります。通常特別な対策を行わない場合、Fullnode へ接続してデータを取得することは、プライバシー上大きな懸念となります。
Samourai Wallet は通常、Samourai Wallet がホスティングする Fullnode(Dojo と呼ばれる) に接続をします。この Fullnode はウォレットに関するあらゆる情報を得ることになり、これらが悪用されない保証はありません。
Samourai Wallet - Dojo 間のブロックチェーンデータの取得にプライバシー保護のための BIP157 などを用いていない可能性があります。また Tor による接続は可能ですが、どの種類の通信が Tor によって行われているのかは確認できていません。
Samourai Wallet はこのような問題に対する対応策として、Dojo をユーザーが自らホスティングできる仕組みを提供しています。Dojo を Wallet 所有者がホスティングして接続するようにすれば、ネットワークレベルでの匿名性を低下させる多くの問題を解決することができると考えられています。
Whirlpool
Whirlpool を使用する場合、Samourai Wallet を使用する必要があるため、Samourai Wallet 単体での懸念 はすべて同様にあてはまります。
また、Samourai Wallet がホスティングする Dojo(Samourai Wallet Dojo) に接続する場合、Samourai Wallet Dojo は 自らが作成した Whirlpool coinjoin transaction の input/ output の組み合わせを知ることができます。したがって Samourai Wallet Dojo に接続するユーザーは、 Whirlpool を使用しても Samourai Wallet に対しては input/ output の組み合わせを秘匿することはできません。
ユーザーがホストする Dojo(ユーザー Dojo) を使用する場合はどうでしょうか。Dojo は Samouwai Wallet の多くの問題を解決しうるものでしたが、Whirlpool を使用する場合は ユーザー Dojo を使用していても注意しなければならないことがあります。
1つの Whirlpool coinjoin transaction を考えたとき、完全な部外者からは 5つの input/ output の組み合わせはわかりません。しかし、Samourai Wallet Dojo は自らが作成した input/ output の組み合わせを知ることができるため、5つの組み合わせのうち4つが Samourai Wallet Dojo が作成したもので、残りの1つがユーザー Dojo からのものであった場合、このユーザーは Samourai Wallet に対しては input/ output の組み合わせを秘匿することができないことになります。
これを解決する有力な方法は、ユーザー Dojo 専用の Pool が提供されることですが、計画にはあるらしい(2)もののまだ実現はしていません。
しかし、2つ以上の input がユーザー Dojo によるものである remix を繰り返すことで Samourai Wallet に対する匿名性は向上させることが可能で、Whirlpool では remix に追加コストもかからないためある程度の対策にはなっていると言えるのではないでしょうか。
このように、ユーザーが自ら Dojo を運用しない場合は、Whirlpool および Samourai Wallet は Samourai Wallet に大きく信頼する必要がある仕組みになっています。
では Whirlpool と Samourai Wallet はだめなのか?
Samourai Wallet チームは素晴らしい目標を掲げ、非常に優れたプロダクトを継続して提供しているとてもよいチームです。Whirlpool も Samourai Wallet もプライバシーを気にするユーザーはもちろん、一般ユーザーにもとてもおすすめできる Wallet であると考えています。現在モバイルウォレットでこれ以上優れたプライバシー保護機能を備えた Wallet はないのではないでしょうか。
Bitcoin について詳しいユーザーに android wallet をおすすめするとしたら、迷わず Samourai Wallet をおすすめします。
Samourai Wallet に信頼する仕組みは最善ではありませんが、多くのウォレットは同様の問題をかかえており、transaction レベルでのプライバシーを強力に保護してくれる Samourai Wallet は多くのユーザーには十分選択肢となるでしょう。
プライバシーを重視したデスクトップウォレットには Wasabi Wallet があるので、こちらも合わせて検討していただければと思います。
Wasabi Wallet についてもそのうちなにか書きたいとは思っている。
Footnotes
(1) CoinJoin Sudoku | Weaknesses in SharedCoin, and CoinJoin research.
ただしこれは中途半端に終わっている感じで、発表者の Kristov Atlas は先日 Wasabi Research Club #10 に出てコメントしていたので関心があるかたはぜひ。
またこのような記事もありました。CashFusion and Unequal CoinJoin Transaction Amount
(2) https://twitter.com/6102bitcoin/status/1216435135534522373
そのほか集めた資料やメモなどは scrapbox にいれています。