ミキサーコントラクトの実装
ミキサーコントラクトを実装します。参考実装はここにあります。
コントラクトのテスト
次のコマンドを実行するとコントラクトのテストが実行されます。全てのテストをパスしたら正しく実装されていますので、テストをパスすることを目指してください。
forge test -vvv
演習: TornadoCatsコントラクトのインターフェース
TornadoCatsはユーザーが入出金を行う際に直接操作するコントラクトです。まずはdeposit関数とwithdraw関数のインターフェース部分(関数の中身が空のもの)を作成してください。
deposit関数
- 引数
bytes32 commitment
- 戻り値
- なし
withdraw関数
- 引数
bytes calldata proofbytes32 rootbytes32 nullifierHashaddress payable recipientaddress payable relayeruint256 fee
- 戻り値
- なし
演習: deposit関数
deposit関数の中身を作ってください。
具体的には次の処理を実装してください。
- コミットメント
commitmentが既に登録されていたらリバート - 送金額
msg.valueが送金単位denominationを満たしていなければリバート - Merkleツリーにコミットメント
commitmentを挿入 - コミットメントを登録
Depositイベントの発火
演習: withdraw関数
withdraw関数を作ってください。
具体的には次の処理を実装してください。
- 手数料が
denominationを超えていればリバート - 既に出金に使われた証明であればリバート
- Merkleルートがルートヒストリーになければリバート
- 証明
proofが正しいか検証して不正ならリバート - 証明の消費を記録
- 受信者アドレスへの出金処理
- リレイヤーへの手数料送金処理
Withdrawalイベントの発火