zERC20の仕組み

このページでは、zERC20のプライベート送金メカニズムと、どのようなプライバシー保証が提供されるかを説明します。

プライベート送金フロー

ステップ1: バーンアドレスの生成

送信者または受信者がバーンアドレスを生成します。これは対応する秘密鍵が存在しないワンタイムのEthereumアドレスです。このアドレスは受信者の引き出しアドレスとシークレットから暗号学的に導出されます。

ステップ2: バーンアドレスへの送金

送信者は任意の標準ウォレット(MetaMaskなど)を使用して、zERC20をバーンアドレスに送金します。このアドレスには秘密鍵が存在しないため、トークンは実質的に「バーン」され、誰も移動させることができません。

ステップ3: ゼロ知識証明による引き出し

受信者は以下を示すゼロ知識証明を生成します:

  • バーンアドレスの導出に使用されたシークレットを知っていること
  • バーンアドレスが特定の量のトークンを受け取ったこと

この証明を使用して、受信者は任意のアドレスに同額を引き出すことができます。証明は、どのバーンアドレスがどの引き出しに対応するかについては一切明らかにしません。

💡 テレポート

この引き出しプロセスを「テレポート」と呼びます。トークンがあるアドレスから消え、追跡不可能なリンクで別のアドレスに再出現するためです。

プライバシーの範囲

zERC20のプライバシーモデルを安全に利用するためには、その範囲を理解することが重要です。

1. 送信者-受信者の紐付け不可能性

送信者のアドレスと受信者の引き出しアドレスの関係はオンチェーン上に公開されません。これはTornado Cashがデポジットと引き出しの間のリンクを隠すのと同様です。

2. バーンアドレスの可視性

zERC20をバーンアドレスに送金するトランザクションは公開されています。ただし、観察者はバーンアドレスがどの引き出しアドレスにリンクしているかを判別できません。

3. 誰が何を知っているか

シナリオ 送信者が知る情報 オンチェーン観察者が見る情報
受信者がバーンアドレスを生成 バーンアドレスのみ 送信者のアドレス → 不明なアドレスへの送金
送信者がバーンアドレスを生成 受信者の引き出しアドレス 送信者のアドレス → 不明なアドレスへの送金
  • 受信者生成のバーンアドレス: 送信者はバーンアドレスのみを知り、資金がどこに引き出されるかは知りません。受信者のプライバシーが最大限保護されます。
  • 送信者生成のバーンアドレス: 送信者はバーンアドレスを生成するために受信者の引き出しアドレスを知る必要があります。受信者のアドレスはオンチェーン観察者からは秘匿されますが、送信者からは秘匿されません。
ℹ️ 情報

フロントエンドは現在、送信者生成のバーンアドレスをサポートしています。CLIは両方の方式をサポートしています。

4. 金額のプライバシーに関する考慮事項

送金額と引き出し額はオンチェーン上で可視です。固有または珍しい金額(例: 123.456789 zUSDC)は、トランザクションの相関付けに使用される可能性があります。

軽減策:

バッチ引き出し
複数の着金を1回の引き出しにまとめます。オンチェーンには合計額のみが公開されます。
部分引き出し
受け取った全額より少ない金額を引き出します。例: 123.456789 zUSDCを受け取った場合、123 zUSDCを引き出し、残りは保留にします。

クロスチェーン送金

zERC20は異なるブロックチェーン間でのプライベート送金をサポートしています:

  1. サポートされている任意のチェーンでzERC20をバーンアドレスに送金
  2. 他のサポートされているチェーンに引き出し

クロスチェーンメッセージングはLayerZeroによって処理され、グローバルマークルツリーがすべてのチェーン間で転送ルートを集約します。

技術概要

基盤となる暗号技術に興味のある開発者向け:

  • マークルツリー: Poseidonハッシュベースのマークルツリーですべてのバーンを追跡
  • ゼロ知識証明: Novaフォールディング方式(バッチ)とGroth16(シングル)で引き出し資格を証明
  • ハッシュチェーン: SHA-256ハッシュチェーンですべての転送の決定論的な順序付けを保証
  • ステルスメッセージング: VetKDを使用したICP Canisterで暗号化されたバーンアドレスの配信を実現

詳細はアーキテクチャ概要をご覧ください。