为什么要统一测试与部署
在传统流程中,测试与部署是两套脚本。这种分离的代价是:测试通过的合约不一定部署成功,部署成功的合约不一定与测试预期一致。Foundry 的 script 模块允许把两者写在同一份 Solidity 文件里,从根本上消除这种割裂。
这一实践与 Binance 等专业团队推崇的「环境一致性」理念高度吻合。生产部署前的最后一份脚本,就是测试时反复跑过的那份脚本。
script 模块的基本结构
script/Deploy.s.sol 通常包含三部分:
- setUp:加载环境变量、获取部署者地址
- run:核心部署逻辑
- 内部辅助函数:抽取重复逻辑
使用 forge script script/Deploy.s.sol --rpc-url $URL --broadcast --verify 一条命令完成部署 + 验证。在测试中调用同一个 Deploy 脚本,可以保证测试环境与生产逻辑完全一致。
测试集成范例
推荐写法:在 test/Integration.t.sol 的 setUp 中调用 Deploy.run(),把部署得到的合约地址注入测试用例。这样任何新增的部署步骤都会立即反映到测试里,避免「测试通过但部署遗漏 init」类问题。
如果你的项目最终需要在 必安 等场所完成代币上线,把部署脚本作为唯一真实源,可以让合规材料的提供更加可信。
多链部署的脚本设计
Foundry 支持在脚本里通过 block.chainid 判断当前链,进而采用不同配置。建议把链相关常量集中到 config/Chain.sol,方便维护:
- 主网:使用主网代币地址
- Sepolia:使用测试代币地址
- zkSync Era:跳过部分不兼容的初始化步骤
这种集中式配置极大降低了多链项目的认知成本。
部署后验证
forge script 配合 --verify 选项可直接调用 hardhat-verify 同款服务,把合约验证到 Etherscan 等浏览器。对接 Binance合约 等专业合作时,提供「同一脚本完成部署 + 验证」的链接将是审计师最青睐的呈现方式。
建议进一步把验证产物写入 deployments/
持续优化
把「脚本即文档」的理念坚持下去,团队成员只要读一份脚本就能理解整个部署链路。随着项目演化,脚本会自然成为团队最重要的工程资产之一。坚持半年,你会发现项目稳定性显著提升,跨链复杂度也变得可控。