Appearance
S2C8: Multi-Lock Contract
1. 问题
合约有多个"锁"(lock)机制,需要依次解锁才能调用 mintFlag。每个锁有不同的解锁条件(如支付 ETH、特定状态、storage 操作等)。
2. 原因
合约实现了分层的访问控制 — 多个 modifier 或条件检查堆叠在一起。每层都可以通过特定操作解锁。
3. 方案
- 读取合约 storage 分析每个锁的状态
- 按顺序解锁每个锁(发送 ETH、调用特定函数、写 storage)
- 所有锁解锁后调用
mintFlag
4. 遇到的陷阱
锁的依赖关系: 某些锁可能依赖其他锁的状态,解锁顺序可能很重要。攻击合约需要预先存入 ETH。
5. 陷阱的原因
合约的状态变量之间可能存在依赖关系。如果按错误顺序操作,可能导致状态被重置或交易回滚。
6. 如何解决
通过 cast storage 逐一读取锁状态,设计原子操作在单个交易中解锁所有锁。
7. 技术要点
| 要点 | 说明 |
|---|---|
| 多层访问控制 | 多个 modifier/条件堆叠的合约设计 |
| 原子操作 | 在单个交易中完成所有解锁和 mint |
| Storage 分析 | 读取 storage 槽位了解合约状态 |