权限设计不从“哪个合约更高级”开始,而从“系统有多少种能力、谁能授予它们、出错后怎样恢复”开始。只有一个管理员动作时,Ownable清楚直接;铸币、暂停、升级、参数调整由不同主体负责时,AccessControl更能表达最小权限。
Ownable的简单是一种优势
onlyOwner使调用路径容易审计,owner也可以是多签或治理合约,而不必是个人EOA。风险在于所有能力集中:密钥泄露、误调用renounceOwnership或把owner转给无法操作的地址,都可能影响整个系统。
权限模型的选择起点
- Ownable适合单一管理员,所有onlyOwner能力集中到一个owner地址;owner也可以是多签或治理合约。
- Ownable2Step要求新owner主动接受转移,可降低把所有权转给错误或不可用地址的风险。
- AccessControl支持多角色及各自管理员;DEFAULT_ADMIN_ROLE默认管理所有角色且管理自身,属于需要重点保护的高风险权限。
Ownable2Step解决的是交接错误
旧owner先提出新地址,新owner再acceptOwnership。第二步能发现拼错地址或不具备操作能力的合约,但不会自动限制新owner的权限,也不提供撤销延迟。交接期间谁仍可操作、提议能否取消,应由版本行为和业务流程明确。
| 模型 | 适合场景 | 主要风险 | 推荐补强 |
|---|---|---|---|
| Ownable | 单一管理面 | owner单点失陷或误转 | 多签、监控 |
| Ownable2Step | 单一管理面且重视交接 | 新owner迟迟不接受 | 交接流程和超时方案 |
| AccessControl | 多角色、多职责 | admin关系复杂、默认管理员过强 | 角色图、延迟与多签 |
AccessControl先画角色管理图
角色成员负责业务,角色admin负责grant和revoke。DEFAULT_ADMIN_ROLE默认是所有角色的admin,同时也是自己的admin,权限极高。生产系统可使用AccessControlDefaultAdminRules、延迟、多签或AccessManager收紧它,但复杂度也随之增加。
把管理员关系画成图
- 列出每个受限函数及最小角色
- 画出角色成员与admin关系
- 让最高管理员由多签和延迟保护
- 演练grant、revoke、交接和密钥丢失
- 监控OwnershipTransferred与RoleGranted事件
角色多不代表权力分散
renounceOwnership不等于项目去中心化:代理admin、其他角色、暂停器和升级治理仍可能存在。角色多也不等于更安全,若所有角色最终由同一个DEFAULT_ADMIN_ROLE即时控制,只是把同一风险换了名字。
权限事件可用事件日志topics与data追踪,调用前按智能合约连接检查核对目标;账户和存储证据可结合eth_getProof。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。