Appearance
S2C8: Multi-Lock Contract
1. 問題
コントラクトには複数の「ロック」(lock)メカニズムがあり、mintFlag を呼び出すためには順番にロックを解除する必要があります。各ロックには異なる解除条件(ETH の支払い、特定の状態、storage 操作など)があります。
2. 原因
コントラクトは階層化されたアクセス制御を実装しています — 複数の modifier または条件チェックが積み重ねられています。各層は特定の操作によって解除できます。
3. 解決策
- コントラクトの storage を読み取り、各ロックの状態を分析します
- 各ロックを順番に解除します(ETH の送信、特定の関数の呼び出し、storage への書き込み)
- すべてのロックが解除されたら
mintFlagを呼び出します
4. 遭遇した落とし穴
ロック間の依存関係: 一部のロックが他のロックの状態に依存する可能性があり、解除順序が重要になる場合があります。攻撃コントラクトに事前に ETH を入金しておく必要があります。
5. 落とし穴の原因
コントラクトの状態変数間に依存関係が存在する可能性があります。誤った順序で操作すると、状態がリセットされたり、トランザクションがロールバックされたりする可能性があります。
6. 解決方法
cast storage を使用してロックの状態を 1 つずつ読み取り、単一のトランザクションですべてのロックをアトミックに解除するように設計します。
7. 技術的ポイント
| ポイント | 説明 |
|---|---|
| 多層アクセス制御 | 複数の modifier/条件が積み重ねられたコントラクト設計 |
| アトミック操作 | 単一のトランザクションですべてのロック解除と mint を完了 |
| Storage 分析 | storage スロットを読み取ってコントラクトの状態を把握 |