ミキサーコントラクトの実装
ミキサーコントラクトを実装します。参考実装はここにあります。
コントラクトのテスト
次のコマンドを実行するとコントラクトのテストが実行されます。全てのテストをパスしたら正しく実装されていますので、テストをパスすることを目指してください。
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イベントの発火