Skip to content

ミキサーコントラクトの実装

ミキサーコントラクトを実装します。参考実装はここにあります。

コントラクトのテスト

次のコマンドを実行するとコントラクトのテストが実行されます。全てのテストをパスしたら正しく実装されていますので、テストをパスすることを目指してください。

forge test -vvv

演習: TornadoCatsコントラクトのインターフェース

TornadoCatsはユーザーが入出金を行う際に直接操作するコントラクトです。まずはdeposit関数とwithdraw関数のインターフェース部分(関数の中身が空のもの)を作成してください。

deposit関数

  • 引数
    • bytes32 commitment
  • 戻り値
    • なし

withdraw関数

  • 引数
    • bytes calldata proof
    • bytes32 root
    • bytes32 nullifierHash
    • address payable recipient
    • address payable relayer
    • uint256 fee
  • 戻り値
    • なし

演習: deposit関数

deposit関数の中身を作ってください。

具体的には次の処理を実装してください。

  • コミットメントcommitmentが既に登録されていたらリバート
  • 送金額msg.valueが送金単位denominationを満たしていなければリバート
  • Merkleツリーにコミットメントcommitmentを挿入
  • コミットメントを登録
  • Depositイベントの発火

演習: withdraw関数

withdraw関数を作ってください。

具体的には次の処理を実装してください。

  • 手数料がdenominationを超えていればリバート
  • 既に出金に使われた証明であればリバート
  • Merkleルートがルートヒストリーになければリバート
  • 証明proofが正しいか検証して不正ならリバート
  • 証明の消費を記録
  • 受信者アドレスへの出金処理
  • リレイヤーへの手数料送金処理
  • Withdrawalイベントの発火