解释namespaced storage layout、NatSpec标注和根槽计算规则,说明代理、模块化合约与库在升级时如何隔离存储区域。
判断升级是否安全,要同时看命名空间根槽和结构体内部布局;只确认“用了ERC-7201”远远不够。
规范锚点
- ERC-7201用@custom:storage-location erc7201:
<NAMESPACE_ID>标注结构体,供工具识别命名空间存储布局。 - 推荐根槽公式是keccak256(keccak256(id)-1)与~0xff按位与,使命名空间落在按256槽对齐的独立区域。
- 命名空间只能减少布局碰撞;升级仍必须保持同一namespace内部字段顺序与类型兼容。
根槽公式
根槽不是随便选的常量。标准先对namespace id做哈希和减一,再进行第二次哈希并清除低8位,使根落到256槽对齐区域;审计报告应保存id原文、计算结果与编译器输出。
结构体布局
NatSpec标注写在结构体上,工具据此把成员归入同一命名空间。新增字段通常追加到末尾;删除、换序、改类型或改变继承关系仍可能让旧数据被新代码错误解释。
落到审计记录
| 核验对象 | 本主题动作 | 失败处理 |
|---|---|---|
| 根槽公式 | 从Ethereum Improvement Proposals确认ERC-7201命名空间存储是什么的正式定义,并保存网络、地址与读取时间 | 定义或版本对不上时,不继续套用本文步骤 |
| 结构体布局 | 在原始返回、签名消息或交易指令中定位对应字段,不用界面缩写代替 | 找不到原始值时,把结果标为未验证 |
| 升级对照表 | 用OpenZeppelin Upgradeable Contracts复核实现行为,特别记录可选扩展与权限主体 | 实现与规范语义不一致时,按具体部署重新评审 |
| 碰撞排查 | 构造一个失败样例,确认客户端会明确拒绝而不是静默修正 | 失败仍被显示为成功时,停止上线并补充状态校验 |
记录ERC-7201命名空间存储时,把“输入快照”和“判断结果”分开。该主题的快照包含原始bytes、字段单位、对象地址、区块高度与Ethereum Improvement Proposals版本;结果注明通过的规则和仍未知的碰撞排查。这样即使ERC-7201命名空间存储是什么随后变化,也能复现当时的结论。
ERC-7201命名空间存储的测试至少覆盖正常路径、缺少结构体布局、提交前状态改变及客户端不支持当前版本。前几类验证升级对照表边界,最后一类确认产品不会删除字段或改走未经用户确认的回退路径。
升级对照表
最实用的升级检查是按namespace分组做diff:先确认根公式没变,再比较成员slot、offset、type和字节宽度。代理implementation槽与业务命名空间是两套证据,不能混为一谈。
碰撞排查
若某个库自行使用assembly写固定槽,而布局文件没有对应标注,就把它列为手工审计项。命名空间能降低碰撞概率,却不会阻止恶意实现主动覆盖其他区域。
来源与复核入口
- Ethereum Improvement Proposals:正式接口、字段与规范语义,https://eips.ethereum.org/EIPS/eip-7201
- OpenZeppelin Upgradeable Contracts:实现路径、兼容性或安全边界,https://docs.openzeppelin.com/contracts/5.x/upgradeable
ERC-7201命名空间存储的资料访问口径为2026-07-17;遇到Draft状态、可升级部署或可变网络参数,应在后续复核日重新读取Ethereum Improvement Proposals。
审计边界
编译器和升级工具对ERC-7201标注的检查能力随版本不同,部署前仍需比较storage layout输出。 相邻知识可继续对照Solidity存储槽位、ERC-1967代理槽位。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。