皆さんはTornado Cashを覚えていますか?

イーサリアム上のスマートコントラクトとして実装されたミキシングサービスで、もちろんプライバシー目的のユーザーにも利用されていましたが、昨夏までは特に数多のDefiハックを行うためのトランザクション手数料などの資金源を隠したり、盗難した資金を追いにくくするために使われていることで有名でした。

ところが2022年8月にアメリカ財務省OFACによりTornado Cashのコントラクトが制裁対象(SDNリスト入り)となり、また主要な開発者がオランダで逮捕され、未だ保釈されず勾留されています。

Web上に公開されていたフロントエンドの閉鎖や当局リスクを恐れたカジュアルユーザーの離脱によって流動性がほぼ消滅したTornado Cashは参加者数の少なさによって有意にプライバシーを改善することができなくなったため、犯罪資金洗浄にも使われることがなくなり、存在感が消えてしまっています

ところが最近、Proof of InnocenceというプロトコルをTornado Cash上に追加することで自分が引き出す資金源が既知のハッカーからの入金でないことを証明できるという文章を読み、興味を持ったので調べてみました。

Introducing Proof of Innocence built on Tornado Cash
Tornado Cash is a popular protocol on Ethereum that allows users to make private transactions by breaking the on-chain link between the…
ちなみに無関係ですが当時Tornado CashのGitHub上のリポジトリも削除されて見ることができなくなりました。「制裁対象はコードではなくサービス」という整理により今は復活していますが、ロシア関連の制裁でロシア人開発者によるOSSのリポジトリが削除されるなど、アメリカ政府の意向によるGitHubリスクが年々大きくなっています。

Tornado Cashの仕組み

Proof of Innocenceを理解するには先ずTornado Cashの仕組みを理解する必要があります。

ミキシングサービスとしてTornado Cashに必要な要件の最たるものは「出金時にどの入金に対応するコインが取り出されたか第三者に判らないこと」です。ユーザーがゼロ知識証明を使ってとある入金者であることをその入金がどれかを明かさずにコントラクトに伝えるのがTornado Cashです。

入金時、ユーザーはSecretとNullifierという2つの値を生成し、それらの値へのコミットメントを1つ生成します。プールの指定金額を送金した時にこれがコントラクト内に記録されます。SecretとNullifierは手元に保管します("note")。

出金の際には、SecretとNullifierの値、コントラクト内のVerifier Keyを使ってマークルプルーフのゼロ知識証明を行うとともに、二重出金を防止するためにNullifier自体をコントラクトに提出して記録します。これで入金時と出金時で第三者が比較できる情報はありません。

ゼロ知識証明を実現するために2020年のセレモニーで作成された鍵が利用されているようです。残念ながらSNARKsなどの数学については詳しくないので説明しきれません…。GitHubはこちら

話が逸れますが、Tornado Cashが刺された理由の1つは実質的に運営チームや投資家が存在したことが大きいのではないかと感じています。2019年にバグを直すためにコントラクトをアップグレードしユーザーを強制的に移行させたり(ただし2020年に大半のコントラクトについて管理者権限をバーン)、開発チームやその支援者に配分されるガバナンストークンを発行して他チェーンに展開したりと、ソフトウェアを開発しているだけという言い訳は苦しいと感じます。Immutableなコントラクトを公開して終わり、だったら話は違っていたかもしれません。‌‌

ガバナンス関連の細かい部分が知りたい方などは仮想通貨関連のロビイングを行うアメリカの団体CoinCenterのブログ記事が大変参考になります。英語で団体のポジトークの側面もありますが、興味のある方はぜひ読んでみてください。

Proof of Innocenceの仕組み

Proof of Innocenceは一言で言えば「Tornado Cashから引き出す際に利用したnoteが任意のブラックリストに含まれるアドレスからの入金によって生成されたものではないというゼロ知識証明」です。どういうことか詳しく見ていきましょう。

あまりドキュメントが存在しないので明確ではありませんが、わかった範囲で説明します。Proof of InnocenceはTornado Cash自体に良く似た仕組みを採用しているようです。

まずユーザーは自分による入金でないと証明したいコミットメントをまとめたブラックリストを用意します。Sparse Merkle Treeとして作成しPoIのコントラクトに渡すことで、ユーザーがTornado Cashに提出したゼロ知識証明からブラックリスト内のトランザクション由来の資金でないことが第三者にも明らかということです。

言い換えると、Tornado Cashでは「どの入金であるか明かさずに入金を証明」しましたが、Proof of Innocenceではブラックリストのコミットメントのみからなるマークル木に対して同じゼロ知識証明を試行することで、出金がそのどれにも対応していないことを示しているのではないかと思われます。

GitHubはこちら

Tornado Cashの再興につながるのか?

さて、Proof of InnocenceというプロトコルがこれからTornado Cashの再興につながるのかという問題についてですが、個人的な意見で短期・中期的にはNOです。長期的には非常に大きな問題を提示しつつも、許可制のプライバシーツールとして利用が増える可能性は否定できません。説明します。

まず、おそらくTornado Cashの利用低下に一番大きく影響しているのはアメリカによる経済制裁であり、現時点では制裁を受けている事実に変わりはないことから、Proof of Innocenceが存在するだけでは利用が回復しないのは当然でしょう。利用回復に必要なのは制裁解除です。

ちなみにアメリカの法律家はこのプロトコルを利用してもTornado Cashを使用することはほぼ確実に制裁違反と指摘しているので、現状では得られるプライバシーもほぼないですから利用しないほうが賢明です。

状況が変化し制裁対象がOFACのSDNリストから外される例は存在しますが、スマートコントラクトが指定されるという前例のない状況で、ブラックリストつき官製Tornado Cashが提供される可能性は(それが信用される可能性も)限りなくゼロに近いので、短期・中期的にはTornado Cashの復興は実現しないでしょう。

ただ、長期的にProof of Innocenceが面白く危険なところは、遵法ユーザーが許可制のプライバシー技術を求めることのできるスキームという点です。その名の通り、このプロトコルは推定無罪の原則とは真逆のコンセプトであり、仮に制度化されてしまうと恐ろしいものがあります。プライバシー技術の利用は権利であるべきで、許可制であるべきでないという立場から反対しても「資金洗浄者の肩を持つのか」と攻撃される可能性が非常に高いためです。もちろん、このような意見は許可者をフルトラストすることが前提となっています。

まとめ

・Proof of InnocenceはTornado Cashの出金時のゼロ知識証明を応用して、資金洗浄が疑われる特定の入金に対応する出金でないことを証明するためのスマートコントラクト

・Tornado Cashが直面する問題は米国による経済制裁に尽きるので、これがあるからといって短期・中期的に利用が回復する可能性は絶望的

・将来的に「遵法ユーザー同士でプライバシーを高めたい」という用途で流行る可能性のあるスキームで、その場合長期的にプライバシー技術の利用が当局の「許可制」になってしまう脅威を感じる「推定有罪」スキーム