路线图
MoonUpgradeGuard 是一个针对 EVM 合约升级的升级前兼容性检查器。本页记录已经交付的能力、接下来要验证的产物形态,以及后续方向。它只描述工程优先级与产品行为:这不是排期,也不构成带时间的承诺。
优先级如何决定
- 可能把结论错判为"兼容"的规则,优先于只改善措辞的改动。
- 每条比较规则都配一个能复现它所要捕获变化的 fixture,以及一个在缺少该规则时会失败的测试。
- 不受支持的输入必须显式失败,并以退出码
2结束;它永远不会变成静默放行。 - 范围按规则增长,而不是按界面增长。
- 任何改变诊断含义的改动——诊断码、严重度或 JSON 结构——都属于契约变更,必须明确声明。
已交付
- 产物摄取:原始
storageLayout对象、Foundry 写出的平铺 artifact、solc Standard JSON 输出、Hardhat build info,并提供--contract选择器处理包含多个合约的文档。歧义与不受支持的形态会被报告,而不是被猜测。 - 存储:无损的 slot 与 byte offset、打包字段、定长与动态数组、mapping、struct、
递归类型图,以及被缩减或整体替换的
__gap数组。 - transient storage:使用同一套规则比较,位于它自己的
transientStorage[...]命名空间。 - ABI:规范化签名、Keccak-256 selector 与 event topic(已对公开向量校验)、删除、 返回值列表变化、indexed 与 anonymous 变化、mutability 变化,以及两个版本之间的 selector 或 topic 冲突。
- 诊断:带严重度、位置与被比较的旧值和新值的稳定诊断码;确定性的文本与 JSON
输出;可供流水线判定的退出码
0、1、2。 - 证据:包含针对生成布局的不变量检查的单元测试、CLI 进程级检查、每条规则一对 fixture,以及与 OpenZeppelin Upgrades Core 的差分对比记录。
- CI:每次 push 与 pull request 都执行格式检查、类型检查、测试、生成物是否已提交 (接口与诊断码手册)、空白检查、端到端 CLI 脚本与发布包文件清单检查。
- 版本报告:CLI 的
--version输出版本号,端到端测试核对它与模块清单一致。 - 原生发布产物:v0.2.0 提供 Linux x86_64 与 macOS arm64 可执行文件;两个平台均在发布 CI 中构建并通过端到端检查。
- 诊断码手册:一页列出全部诊断码、严重度、是否阻断与含义,由源码生成,CI 重新生成后若与提交内容不一致即失败,因此新诊断码不可能没有文档。
- 可复现走查:中英两版实战教程都能从全新 clone 走到一次通过检查与一次失败检查, 其中每一条命令、输出与退出码都由 CI 对真实二进制逐条核对。
- 双语文档:公开文档以中文为主、英文镜像(
X.md与X.en.md,顶部互相链接):README、 诊断码手册、差分对比记录、参考与许可页、fixture 说明都有英文版;路线图目前只有中文。两份诊断码手册由同一份源码生成,翻译缺失会被生成器直接拒绝,中英结构一致性由scripts/check_docs.py在 CI 中校验。 - 参考与许可:规则依据的一手规范、依赖许可证(MoonBit 标准库与
moonbitlang/async为 Apache-2.0;OpenZeppelin Upgrades Core 为 MIT 且仅用于开发期行为对比;solc 仅使用其输出)、 fixture 来源与上游关系,记录在docs/references.md及其英文镜像中。 - 真实编译产物回归矩阵:仓库自有源码生成 solc Standard JSON、Foundry 平铺 artifact
与 Hardhat build info,覆盖兼容、不兼容及无布局输入的退出码
0、1、2;另用 solc 真实产物验证打包字段、mapping、struct、__gap与 transient storage 的组合变化。 - 诊断来源标注:单侧输入诊断带有
old或new来源;两侧无效时仍能分辨每条错误, 比较诊断不归属于单侧产物。这是 JSON 报告结构的公开变更。
更晚
- 命名空间存储与非结构化 slot。 编译器的
storageLayout只列出状态变量,因此 ERC-7201 命名空间成员与 EIP-1967 这类非结构化 slot 对它不可见。读取它们需要抽象语法树,而命名空间成员的位置还需要一次本工具刻意不执行的重新编译。在这一层出现之前,提到命名空间的产物会被拒绝,而不是被报告为兼容。 - 严格重命名模式。 同一位置的重命名不会移动任何字节,因此目前是警告。有些团队可能希望它阻断升级;那会是一个可选项,且必须公开记录,而不是静默改变默认行为。
- 更多目标平台。 库与目标平台无关,而 CLI 仅支持 native。只有在 CI 覆盖之后才会声明更多目标。
- 包注册表发布,使 CLI 无需从源码构建即可安装。
稳定性
- 诊断码及其严重度是稳定的,JSON 报告结构也是稳定的。新增内容会在发布说明中公布。
- 在
0.x版本之间,库 API 仍可能变动;命令行与退出码是更稳定的接触面。 - 报告是确定性的:相同输入产生字节一致的输出,诊断始终按稳定顺序排序。
如何提供反馈
请提交 issue,并附上能复现该情况的 artifact 对、该规则应当遵循的规范或 EIP,以及你期望的行为。请不要附带私钥、个人地址或任何无法公开分享的内容。