OpenZeppelin 对 ZeroBase-Pro/Economics 代码仓库进行了审计,发现了一些低危问题和需要注意的地方,包括硬编码的 Etherscan API 密钥、缺失的测试套件,以及 CrossChainTransferScript
中的有限测试。建议修复这些问题,以提高代码质量和安全性。
TypeCross-ChainTimelineFrom 2025-08-06To 2025-08-06LanguagesSolidityTotal Issues13 (10 resolved, 2 partially resolved)Critical Severity Issues0 (0 resolved)High Severity Issues0 (0 resolved)Medium Severity Issues0 (0 resolved)Low Severity Issues3 (2 resolved, 1 partially resolved)Notes & Additional Information10 (8 resolved, 1 partially resolved)
OpenZeppelin 审计了 ZeroBase-Pro/Economics 仓库,提交哈希为 3c55c3f。
审计范围包括以下文件:
Economics
├── src
│ └── ZEROBASE.sol
└── script
├── CrossChainTransfer.s.sol
├── SetTrustedRemote.s.sol
└── ZeroBase.s.sol
ZEROBASE token (ZBT) 是 ZEROBASE 网络的 ERC-20 兼容实用代币,该网络是一个去中心化的实时 ZK 证明系统。该代币在每个链上都有 10 亿个代币的初始总供应量,具有标准的 18 位小数精度。ZBT 构建在 LayerZero 的 Omnichain Fungible Token (OFT) 标准之上,可在每个支持的区块链上保持原生 ERC-20 行为的同时,实现无缝的跨链功能。ZEROBASE
合约继承自 OpenZeppelin 的 Ownable
合约,作为 LayerZero 管理功能的主要管理员,并最初接收完整的代币分配。
经过审计的部署脚本提供了一个全面的框架,用于在 Ethereum Sepolia 测试网和 BSC 测试网环境之间建立跨链代币操作。ZeroBase.s.sol
部署脚本使用 LayerZero 的端点(0x6EDCE65403992e310A62460808c4b910D972f10f
)促进合约创建,确保与 omnichain 协议基础设施的正确集成。
SetTrustedRemote.s.sol
配置脚本建立了已部署合约实例之间跨链功能所需的对等关系。CrossChainTransfer.s.sol
转移执行脚本通过启动从 Ethereum Sepolia 到 BSC 测试网的代币转账来演示操作能力。它配置了 100 个 ZBT 代币的转移,容差为 5%(最低交付 95 个 ZBT)。该脚本通过在执行前查询合约的 quoteSend
函数来实现费用估算,确保为 LayerZero 消息传递费用支付足够的原生代币。转移包括执行选项,指定目标链处理的 200000 gas 单位,并将部署者的地址指定为任何未使用费用的退款接收者。
当前的部署包括位于 0xb733e5ff6361770771dcfe58491713661ac11bb3
的 Ethereum Sepolia 实例和位于 0x9c8749892de34dce62c06eb2e0fb1d62b8601a49
的 BSC 测试网部署。两个合约都在 0x2b2E23ceC9921288f63F60A839E2B28235bc22ad
地址下保持一致的所有权,从而确保跨多链生态系统的统一治理。
在审计期间,所有配置参数,包括 LayerZero 端点 ID、链标识符和特定于网络的设置,都已根据官方 LayerZero 文档 进行了验证。
ZEROBASE token 从 OpenZeppelin 的 Ownable 合约继承所有权。_owner
地址:
onlyOwner
函数OAppCore
合约中被指定为 _delegate
此外,指定了一个单独的 _receiver
地址来接收 ZBT 代币的初始总供应量。与所有者类似,接收者也将被设置为多重签名钱包。
ZeroBase.s.sol
文件 包含被注释掉的 Forge CLI 命令 ,其中还包含硬编码的 Etherscan API 秘钥。虽然这些命令没有被主动执行,但将 API 秘钥等敏感信息保存在开源代码中会带来安全性和可维护性风险。
考虑从代码库中完全删除任何硬编码的 API 秘钥,包括被注释掉的部分。如果这些 CLI 命令对参考有用,请考虑将它们记录在安全的、非源代码控制的位置,并对任何敏感值使用环境变量。这有助于确保敏感凭据不会被意外地暴露或提交。鉴于当前的一组秘钥已经暴露,请考虑撤销它们并重新生成新秘钥以供将来使用。
更新: 已在提交 0101691 的 pull request #5 中解决。硬编码的 API 秘钥已从代码库中删除。客户端确认暴露的秘钥已被撤销。
该仓库缺少测试套件来验证已部署合约的正确行为以及基本功能,例如部署正确性、管理员角色分配和代币铸造。这给合约的可靠性和安全性带来了风险,因为回归或错误可能不会被注意到。按照惯例,基于 Foundry 的项目将测试脚本放置在 test/
目录中,文件名以 .t.sol
结尾。
考虑使用 Foundry 实现一个全面的测试套件,涵盖核心功能,例如部署验证、管理员角色行为、铸造逻辑和代币转账。强大的测试套件对于确保合约的正确性以及支持安全的持续开发至关重要。
更新: 已在提交 2f76c6e 的 pull request #6 中解决。
CrossChainTransferScript
中的有限测试CrossChainTransferScript
目前仅测试从 Sepolia 到 BSC 测试网的跨链代币转账。这使得脚本不完整,因为它没有测试反方向的代币转账(即,从 BSC 测试网到 Sepolia),这对于验证双向功能至关重要。
此外,该脚本使用硬编码的接收者地址 0x2b2E23ceC9921288f63F60A839E2B28235bc22ad
,该地址对应于 BSC 测试网络上 ZEROBASE 代币的 所有者。使用特权地址进行测试可能无法准确反映典型的使用场景,因为此类地址可能会绕过适用于普通用户的某些权限或验证检查。
考虑扩展脚本以测试从 BSC 到 Sepolia 的跨链转移,并将硬编码的地址替换为动态生成或随机选择的测试地址。
更新: 在提交 03d290b 的 pull request #7 中部分解决。CrossChainTransfer.s.sol
已重命名为 CrossChainTransfer2BSC.s.sol
,以指示 Sepolia 和 BSC 主网之间的转移。已添加新脚本 CrossChainTransfer2ETH.s.sol
以执行跨链转移的后半部分的测试。已添加新脚本以添加 Arbitrum 主网配置,这些配置不在原始审计或修复审核的范围内。考虑使用适当的测试套件自动化跨链转移的测试并在不同网络上迭代它,而不是手动运行多个脚本。如果项目决定支持更多网络,那么为每对网络在跨链交易中设置两个脚本可能会很麻烦。为了提高可维护性和集成性,请考虑将当前脚本从 script 文件夹移动到主 test
目录中,并让它们从 Test
合约继承,以便在运行 forge test
时自动拾取它们。
README.md
缺少 ZEROBASE Token 文档、设置说明和贡献指南项目仓库中当前的 README.md
提供的信息极少,并且缺少 ZEROBASE token 文档、项目设置、测试程序和贡献指南。
由于该项目是开源的,请考虑扩展 README 以包括清晰的 token 概述、设置和测试说明、贡献指南(如果接受贡献)以及安全的漏洞披露流程,以支持社区参与和负责任的安全报告。
更新: 已确认。
仓库的开发环境似乎配置不正确。foundry.toml
文件建议使用 Git 子模块来管理外部依赖项,但缺少必需的 .gitmodules
文件,这破坏了正确的子模块集成。此外,存在一个 node_modules/
文件夹,但没有 accompanying package.json
文件,这使得不清楚哪些 Node.js 包打算使用或管理。这些不一致会阻碍可重现性,并可能导致协作者或 CI 设置出现混淆。
考虑确保正确且完整地配置开发环境。如果 Git 子模块用于 Foundry 依赖项,请包括 .gitmodules
文件并确保正确初始化和更新子模块。如果需要 Node.js 依赖项,请添加一个 package.json
文件来定义和管理它们。
更新: 已在提交 4099c7d 的 pull request #8 中解决。
仓库 包含几个不需要进行版本控制的文件和目录,例如 broadcast/
、cache/
、lib/forge-std/
、node_modules/
、out/
和 .DS_Store
。这些通常是构建工件、依赖项或系统生成的文件,这些文件会使仓库混乱,不必要地增加其大小,并导致合并冲突或特定于平台的问题。
考虑从仓库中删除这些文件和目录,并将它们添加到 .gitignore
文件中,以防止将来提交。保持仓库的整洁有助于提高清晰度,减少差异噪声,并简化协作。
更新: 已在提交 020f246 的 pull request #4 中解决。
OFTReceipt
从 "../node_modules/@layerzerolabs/lz-evm-oapp-v2/contracts/oft/interfaces/IOFT.sol"
的导入未在 CrossChainTransfer.s.sol
中使用,可以删除。
考虑删除未使用的导入,以提高代码库的整体清晰度和可读性。
更新: 已在提交 e6c1318 的 pull request #7 中解决。
用于定义 ZEROBASE token 的初始供应量的 1000000000
字面量数字使用了许多数字。
对于包含大量数字的字面量数字,请考虑使用 科学计数法和下划线。这将有助于提高可读性并防止误导性代码,这可能会产生意想不到的后果。
更新: 已在提交 679c04d 的 pull request #9 中解决。
在智能合约中提供特定的安全联系人(例如电子邮件地址或 ENS 名称)可以大大简化个人在代码中发现漏洞时进行通信的过程。这种做法非常有益,因为它允许代码所有者指定漏洞披露的通信渠道,从而消除了由于缺乏关于如何操作的知识而导致的沟通不畅或未能报告的风险。此外,如果合约包含第三方库并且这些库中出现了错误,则其维护人员可以更轻松地联系到有关问题的合适人员并提供缓解说明。
考虑在 ZEROBASE
合约 定义上方添加包含安全联系人的 NatSpec 注释。建议使用 @custom:security-contact
约定,因为它已被 OpenZeppelin Wizard 和 ethereum-lists 采用。
更新: 已在提交 dae9b84 的 pull request #10 中解决。
ZEROBASE
合约 缺少文档字符串。
考虑使用 以太坊自然规范格式 (NatSpec) 彻底记录合约。这包括添加一个合约级别的文档字符串来描述其整体目的,为常量添加一个文档字符串来解释其作用和重要性,并为构造函数添加一个文档字符串来阐明其行为及其执行的任何初始化。清晰的文档可以提高可读性、可维护性以及与开发工具的集成。
更新: 已在提交 b4883a1 的 pull request #11 中解决。
SetTrustedRemoteScript
中对等配置的不完整自动化SetTrustedRemoteScript
仅包含 Sepolia 网络的 setPeer
配置。具体来说,它将部署在 BSC 测试网上的 ZEROBASE token 注册为 Sepolia 上 ZEROBASE token 的对等方。但是,对应的配置,即将 Sepolia 部署的 token 注册为 BSC 测试网上的对等方,存在于代码中,但已被 注释掉。尽管对等方已在两个测试网上正确配置,Sepolia 和 BSC,但当前的脚本需要手动干预(例如,取消注释行)才能完成完整的对等方注册。
考虑重构脚本,通过从专用环境或配置文件加载配置参数来自动执行双向的对等方注册。
更新: 已在提交 e6c1318 的 pull request #7 中解决。已添加新的脚本 SetTrustedRemote-BSC.s.sol
。已添加新的脚本以添加 Arbitrum 主网配置,这些配置不在原始审计或修复审核的范围内。
注释掉的代码会对代码的清晰度和可读性产生负面影响。
ZeroBase
脚本的 第 10 行 有冗余的、注释掉的代码。
考虑删除所有注释掉的和冗余的代码实例,以提高代码库的清晰度和可维护性。
更新: 在提交 e6c1318 的 pull request #7 中部分解决。虽然上面提到的实例已解决,但在 PR 中引入了 新的注释掉的代码行。
所有合约的 SPDX 许可证标识符都已设置为 UNLICENSED
。
为了避免有关版权的法律问题并遵循最佳实践,请考虑按照 Solidity 文档 的建议将 SPDX 许可证标识符添加到文件中。
更新: 已在提交 b093bcc 的 pull request #12 中解决。
ZEROBASE
token 合约以及将其与 LayerZero Omnichain 协议集成的部署和配置脚本一起进行了审计。未发现高风险或中等风险问题。提出了一些修复建议,以提高代码库的可读性并促进未来的集成和开发。
审计发现,该项目可以从添加全面的自动化测试套件中受益。测试应涵盖合约级别功能和跨链交互,以确保可靠性,特别是在 omnichain 架构的复杂性和跨链 token 转移的关键性质的情况下。
- 原文链接: blog.openzeppelin.com/ze...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!