コインミキシングとCoinJoinとは?

· 5 min read

ビットコインはしばしば「デジタル通貨」と呼ばれますが、この例えには議論の余地があります。アリスがボブに現金で10ドルを支払っても、ボブはその紙幣がどこから来たのかを知る術がありません。その後ボブがそのお金をキャロルに渡しても、キャロルは「もともとアリスが持っていた」と推測することはできません。

ビットコインはオープンな性質を持つため、事情がまったく異なります。あるコイン(つまり未使用トランザクションアウトプット、UTXO)の履歴は、誰でも簡単にたどることができます。ビットコインを使うたびに、取引額と受取人の名前を請求書に書き込んでいくようなものだと考えるとわかりやすいでしょう。

とはいえ、公開アドレスに名前が紐づいていないため、ユーザーの身元がそのまま明らかになるわけではありません。それでもビットコインは完全に匿名とは言えません。ブロックチェーン分析は年々高度になり、アドレスと身元を結び付ける精度も上がり続けています。こうした追跡手法に加えて、この目的のために設けられた専門の部署が暗号資産ユーザーの身元を突き止めることもあります。それを防ぐために、取引同士のつながりを断ち切る手法が長年かけて生まれてきました。

コインミキシングとは?

一般的にコインミキシングとは、資金を別の資金と交換することで出所を隠そうとする取引を指します。ただし暗号資産の世界では、多くの場合サードパーティが提供するサービスを指して使われます。事業者はユーザーのコイン(と少額の手数料)を受け取り、送られてきたコインとはまったく関係のない別のコインを返します。こうしたサービスはタンブラー、あるいはミキサーとも呼ばれます。

当然ながら、こうした中央集権的なサービスの安全性とプライバシーには疑問が残ります。ミキサーが本当に資金を返してくれる保証はありませんし、返ってきたコインに問題のある取引履歴がついていない保証もありません。もう一つ気を付けたいのは、IPアドレスやビットコインアドレスが第三者に記録され得る点です。結局のところユーザーは、つながりの切れたコインが返ってくることを期待して、自分の資金を他人に預けているにすぎません。

より興味深いアプローチが、高い「合理的な否認可能性」を生み出すCoinJoin取引です。つまりCoinJoin取引を行った後は、あるユーザーとそのユーザーの過去の取引を決定的に結び付ける証拠を示せなくなります。多くのCoinJoin実装は、ミキサーよりも分散的な選択肢を提供します。プロセスにコーディネーターが関与する場合でも、ユーザーが資金の管理権を手放す必要はありません。

CoinJoinとは?

CoinJoin取引は、2013年にビットコイン開発者のグレゴリー・マクスウェル氏によって初めて提唱されました。同氏は自身の記事の中で、この取引がどのように組み立てられるのか、そしてプロトコルを変更せずに大規模なプライバシー向上を実現できることを簡潔に説明しています。

CoinJoinの本質は、異なるユーザーのインプットを組み合わせて一つの取引にまとめることです。その方法(と理由)を説明する前に、まずは取引の基本構造を確認しておきましょう。

ビットコインの取引はインプットとアウトプットで構成されます。ユーザーは取引を行う際、自分のUTXOをインプットとして使い、アウトプットを設定し、インプットに署名します。重要なのは、各インプットは独立して署名されること、そしてユーザーは複数のアウトプット(異なるアドレスへの送金)を作成できることです。

4つのインプット(各0.2 BTC)と2つのアウトプット(0.7 BTCと0.09 BTC)からなる取引を見ると、いくつかの推測が立てられます。一つ目は、支払いが行われているという見方です。送信者はアウトプットの一方を相手に送り、お釣りを自分に戻しているというわけです。4つのインプットを使っていることから、金額の大きいアウトプットが受取人に渡っている可能性が高いでしょう。合計で0.01 BTCが足りない場合、それはマイナーに支払われた取引手数料です。

一方で、送信者が小さなUTXOをまとめて大きなUTXOを作ろうとしている可能性もあります。その場合は、希望する0.7 BTCという金額にするために小さなインプットを束ねていることになります。

もう一つの推測は、各インプットが独立して署名されるという事実に基づきます。この取引は、4つのインプットがそれぞれ別の当事者によって署名される形で作られたのかもしれません。CoinJoinを有効に機能させているのは、まさにこの原理です。

CoinJoinの仕組み

基本的な考え方は、複数の参加者が自分のインプットと希望するアウトプットを持ち寄り、協調して一つの取引を作るというものです。すべてのインプットがまとめられると、どのアウトプットが誰のものかを確実に言い当てることはできなくなります。その流れは以下の図のとおりです。

ここでは、取引間のつながりを断ち切りたい4人のユーザーがいます。4人は互いに(あるいはコーディネーターを介して)連携し、含めたいインプットとアウトプットを伝えます。

コーディネーターはすべての情報を受け取って取引を組み立て、ネットワークにブロードキャストする前に各参加者に署名してもらいます。ユーザーが署名した後は、その取引を無効にせずに書き換えることはできません。これによって、コーディネーターが資金を持ち逃げするリスクは排除されます。

この取引は、コインを混ぜ合わせるブラックボックスのように働きます。新しいUTXOを作るには古いUTXOを消滅させる必要があります。古いUTXOと新しいUTXOをつなぐ唯一の手がかりは取引そのものですが、この時点で参加者を互いに区別することはできません。せいぜい「インプットの一つはある参加者が持ち込んだもので、その参加者が対応するアウトプットの新しい所有者かもしれない」と言える程度です。

しかし、それすら確実とは言えません。上の取引から参加者が4人だと結論づけられるでしょうか。1人の人物が自分名義の4つのアドレスに資金を送っているだけかもしれません。2人が別々の買い物をして、それぞれ0.2 BTCを自分のアドレスに戻しているのかもしれません。あるいは4人が他人や自分自身に資金を送っているのかもしれません。これらの問いに明確な答えを出すことは、私たちにはできないのです。

否認可能性がもたらすプライバシー

CoinJoinアプリが存在するという事実だけでも、取引分析に使われる手法に疑いを投げかけるには十分です。多くの取引でCoinJoinが使われていると推測できても、アウトプットの持ち主までは分かりません。こうしたアプリの人気が高まるにつれ、「すべてのインプットは同一ユーザーのものだ」という前提は弱まりました。これはエコシステム全体にとって、プライバシー面での大きな前進です。

先ほどの例では、この取引の匿名性セットは4です。つまりアウトプットの所有者は、取引に関わった4人のうちの誰かということになります。匿名性セットが大きいほど、取引と元の所有者を結び付けるのは難しくなります。幸い、最近のCoinJoin実装のおかげで、ユーザーは誰かを信頼する必要なく数十人規模の他ユーザーとインプットを組み合わせられるようになり、高い否認可能性を確保できます。最近では、100人が参加した取引も無事に成立しました。

まとめ

コインを混ぜるツールは、プライバシーを重視するすべてのユーザーが使える重要な手段です。他のプライバシー関連のアップデート(たとえばConfidential Transactions)とは異なり、プロトコルを現状のまま維持しながら恩恵を受けられます。

サードパーティの誠実さや手法を信頼できるユーザーにとって、ミキシングサービスは手軽な解決策になります。一方、検証可能で預託を伴わない選択肢を好むなら、CoinJoinのほうが優れています。こうした取引は、技術に明るいユーザーなら手作業でも組み立てられますし、複雑な仕組みに向き合う必要をなくしてくれるソフトウェアを使うこともできます。この種のツールはすでにいくつも存在し、より高いプライバシーを求めるユーザーの増加とともに人気を集めています。