Tornado Cashの概要
この章では、Tornado Cashの概要について説明します。ミキサープロトコルを実装するのにあたって必須ではないTornado Cashに関する知識は「付録」で補足しています。
Tornado Cashとは
Tornado Cashは、ブロックチェーン上で暗号資産の送金を匿名化するプロトコルです。具体的には、「送信者が誰に送ったか」と「受信者が誰から受け取ったか」を秘匿化するプロトコルです。受け取った額は秘匿化されません。Tornado Cashは非中央集権的に運用されており、既にデプロイされたコントラクトの挙動は変更できなくなっています。(詳しくは「Tornado Cashの非中央集権性」を参照してください。)
現在はEthereumを初め様々なブロックチェーンにデプロイされており、Ether以外にも様々なERC-20トークンに対応しています。(詳しくは「Tornado Cashの稼働状況」を参照してください。)
秘匿化の仕組み
Tornado Cashの秘匿化は、送信者アドレスと受信者アドレスのブロックチェーン上での結びつきをゼロ知識証明によって無くすことで実現しています。
Tornado Cashを利用する流れは例えば次のようなものになります。
- 送信者アドレスからTornado Cashコントラクトへ1 ETH送るトランザクションを送信する。ローカルでは、その資金を引き出す際に消費する「ノート」と呼ばれるデータを保管する。
- (受信者が他者であればブロックチェーンの外でノートを渡す。)
- 受信者アドレスからTornado Cashコントラクトへそのノートから生成した証明を添付したトランザクションを送信し、1 ETHを受け取る。
ここで、Etherを受け取るためにノートから生成した証明はゼロ知識証明なので、証明から送信者アドレスを求めることはできないようになっています。第三者の視点で入金と出金が独立になり、出金トランザクションから入金トランザクションを知ることができないため、「送信者アドレスがどのアドレスに送ったか」と「受信者アドレスがどのアドレスから受け取ったか」がわからなくなります。
リレイヤー
上記の例では、受信者アドレスがトランザクションを送信するためにあらかじめガス代としてEtherを所持しておく必要があります。しかし、そのEtherを用意するために中央集権取引所などを利用してしまってはプライバシーという観点で本末転倒です。この問題を解決するために、Tornado Cashでは「リレイヤー」(relayer)という存在がいます。リレイヤーは送金手数料をもらう対価として、受信者の代わりにトランザクションの送信をしてくれます。このリレイヤーがいるおかげでプライバシーが向上しています。リレイヤーになるにはガバナンストークンであるTORNをロックをする必要があります。
ミキシング
Tornado Cashで利用されている匿名化手法はミキシング(mixing)と呼ばれます。そのため入金するプールはミキサーとも呼ばれます。
Tornado Cashにおいて、プールにある自分のトークンは完全に自分のコントロール下にあり、第三者に操作されることはありません(言い換えるとカストディがあります)。
ミキシングによる秘匿化が実現するためには、ミキサーのユーザー数が十分であり、ユーザーがミキサーを適切に利用する必要があります。ユーザーが不適切な利用をした場合は匿名化を破ることが可能です。
匿名性が失われる不適切な利用
不適切な利用として、特に以下のケースが挙げられます。
- リレイヤーを使用せず、過去のトランザクション履歴に個人を特定できる情報がある
- 入金から出金までの時間が短すぎる
- 受信者アドレスを分散させず、送信者アドレスからの総入金額と受信者アドレスへの総出金額が等しい(あるいはほぼ等しい)
後半2つの不適切な利用は、ミキサーへの入出金を統計的に分析することで受信者アドレスを推定できます。この手法はDe-Mixingと呼ばれます。
これらの他に、ブロックチェーンとは関係ないですが、Torやプライバシー保護のVPN(ログを保管しないことを謳うもの)を利用しないことも、不適切な利用として挙げられます。
Tornado Cash ClassicとTornado Cash Nova
Tornado Cashには大きく2つのバージョンがあります。Tornado Cash ClassicとTornado Cash Novaです。Tornado Cash Novaは2021年12月にリリースされた新しいバージョンで、それと対比して従来のTornado CashをTornado Cash Classicと呼びます。この資料ではTornado Cash Classicをベースにミキサープロトコルを自作しますが、Tornado Cash Novaの機能である「任意の金額の送金」と「Shielded Transfer」について紹介します。
まず、任意の金額の送金についてです。Tornado Cash Classicでは固定額の入出金しかできません。例えば、Etherであれば0.1 ETH, 1 ETH, 10 ETH, 100 ETHの4種類のプールを選択して利用する必要があります。2.4 ETHを送金したいなら、
- 1 ETHのプールに2回入金
- 0.1 ETHのプールに4回入金
といったように分割した入金をしなければなりません。Tornado Cash Novaでは、Tornado Cash Classicとは異なり任意の金額の送金が可能になりました。
次に、「Shielded Transfer」です。Tornado Cash Novaでは、プール内での送金が可能になりました。Tornado Cash Classicでは送金を完了するには、一度プールから出金する必要があります。Tornado Cash Novaでは、プールしている額のうちの任意の金額を、プールから出金せずに別のアドレスに移すことができます。この出金をオンチェーンに記録せずに、プール内で送金する技術をShielded Transferと呼びます。
この資料ではTornado Cash Classicと同様の「固定額の入出金」かつ「Shielded Transferのない」シンプルなミキサープロトコルを実装します。