如何在Foundry Fork环境中检测与测试zkSync链?foundry-devops的vm.createSelectFork完整测试实践
如何在Foundry Fork环境中检测与测试zkSync链foundry-devops的vm.createSelectFork完整测试实践【免费下载链接】foundry-devops项目地址: https://gitcode.com/gh_mirrors/fo/foundry-devops想在 Foundry Fork 环境中同时测试以太坊主网和 zkSync 链foundry-devops是一个面向 Foundry 开发者的运维工具库核心能力有两个自动读取broadcast目录获取合约最近一次部署地址以及在 Fork 测试中智能检测当前是否运行在 zkSync 链上。本文将用一套完整实践带你看懂vm.createSelectFork双 Fork 测试、ZkSyncChainChecker检测原理以及foundry-zksync的特殊处理技巧。 快速上手安装 foundry-devops环境要求清单工具验证命令预期输出示例gitgit --versiongit version 2.x.xfoundryforge --versionforge 0.2.0 (…)foundry-zksyncfoundryup-zksync --help显示安装器帮助信息jqjq --versionjq-1.6克隆仓库并安装依赖git clone https://gitcode.com/gh_mirrors/fo/foundry-devops cd foundry-devops makemake会依次执行清理、安装依赖、更新和构建对应命令都定义在 makefile 中。 核心机制ZkSyncChainChecker 如何识别 zkSync 链项目的核心检测逻辑在src/ZkSyncChainChecker.sol中它提供了两条互补的判断路径路径一chainId 判断——isOnZkSyncChainId()检查block.chainid是否为 324主网、300Sepolia 测试网或 260In-Memory 节点。在 Fork 环境中这是最快的方式。路径二预编译合约探测——isOnZkSyncPrecompiles()通过调用 zkSync 不支持的预编译合约0x03、0x04、0x05、0x08来反推如果调用失败说明当前就运行在 zkSync 上。两个判断被isZkSyncChain()串联并暴露了两个非常好用的修饰器skipZkSync在 zkSync 链上自动跳过该测试函数onlyZkSync只允许在 zkSync 链上执行 完整实践用 vm.createSelectFork 构建双 Fork 测试第一步配置 RPC 端点Fork 测试需要本地配置文件foundry.toml中声明两条链的 RPC本项目已配置好见 foundry.toml[rpc_endpoints] mainnet ${MAINNET_RPC_URL} zksync ${ZKSYNC_RPC_URL}只需在环境变量中设置MAINNET_RPC_URL和ZKSYNC_RPC_URL即可。第二步在 setUp 中创建并切换 Fork参考test/ZkSyncChainCheckerTest.t.sol的写法测试骨架长这样function setUp() public { vm.createSelectFork(mainnet); // 创建以太坊主网 Fork mainnetForkId vm.activeFork(); vm.createSelectFork(zksync); // 创建 zkSync Fork zkSyncForkId vm.activeFork(); }关键技巧vm.createSelectFork返回后必须立刻用vm.activeFork()记录 Fork ID之后再用vm.selectFork(id)在任意测试函数中随时切换上下文。例如function testIsOnZkSyncChainByChainId_zksync() public { vm.selectFork(zkSyncForkId); assertEq(checker.isOnZkSyncChainId(), true); // zkSync Fork 上为 true }配合ZkSyncChainChecker的skipZkSync/onlyZkSync修饰器同一份测试代码就能在两条链上跑出不同的预期结果真正做到一次编写、双链验证。第三步区分 foundry 与 foundry-zksync 运行器这里有一个新手最容易踩的坑foundry-zksync编译为 EraVM 后无法识别部分 cheatcodes不支持vm.selectFork。因此项目采用了分离策略见test/ZkSyncChainCheckerLocalTest.t.solZkSyncChainCheckerTest.t.sol仅在原版 foundry 下运行负责vm.createSelectFork双 Fork 切换测试ZkSyncChainCheckerLocalTest.t.sol在foundry-zksync下直接跑本地节点验证预编译合约探测为了自动识别当前是哪种 Foundrysrc/FoundryZkSyncChecker.sol通过vm.ffi执行forge --version命令并比对版本前缀原版 foundry 报0.2.x/0.3.x而foundry-zksync报0.0.2。由此提供onlyFoundryZkSync和onlyVanillaFoundry两个修饰器让不同运行器只执行各自的测试。注意使用 FFI 需要在foundry.toml中开启ffi true本项目已开启。⚡ 运行测试两条命令搞定项目通过 makefile 提供了开箱即用的入口make test # 原版 foundry 下运行全部测试 make test-zksync # 切换到 foundry-zksync 运行 --zksync 模式测试其中 zkSync 模式的实现是foundryup-zksync forge test --zksync foundryup见 makefile执行完会自动切回原版 foundry无需手动操作。 注意事项与已知限制不能部署带检查器的合约foundry-zksync对 cheatcodes 兼容性有限编译到 EraVM 后无法识别因此含ZkSyncChainChecker的合约不适合在 zkSync 模式下部署详见 README.md 的 Limitations 部分。预编译探测是临时方案如果未来 zkSync 支持了相关预编译合约该检测路径可能失效代码注释中已明确提醒。RPC 必须可达vm.createSelectFork需要真实 RPC建议在测试前先用cast chain-id --rpc-url $ZKSYNC_RPC_URL验证连通性。广播权限foundry.toml中已为./broadcast目录配置了fs_permissions读取权限用于最近部署地址查询功能Fork 测试中若需读取本地文件同样受益于此配置。小结foundry-devops用三个抽象合约一套 make 命令把多链 Fork 测试这件繁琐的事变得简单ZkSyncChainChecker负责链上环境识别FoundryZkSyncChecker负责运行器识别vm.createSelectForkvm.selectFork组合则实现了测试中自由穿梭主网与 zkSync 的上下文切换。掌握这套模式后你也可以将它迁移到自己的多链项目中快速搭建跨链兼容性测试体系。【免费下载链接】foundry-devops项目地址: https://gitcode.com/gh_mirrors/fo/foundry-devops创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

LaTeX2JS完整指南:如何在浏览器里直接编写真实的LaTeX数学公式与图示

LaTeX2JS完整指南:如何在浏览器里直接编写真实的LaTeX数学公式与图示

LaTeX2JS完整指南:如何在浏览器里直接编写真实的LaTeX数学公式与图示 【免费下载链接】LaTeX2JS LaTeX web components 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX2JS LaTeX2JS 是一套开源 JavaScript 组件库,让你在浏览器里直接编写真实…

2026/11/13 15:00:48 阅读更多 →
django-csp 4.0破坏性变更迁移指南:一条manage.py check命令自动生成新配置

django-csp 4.0破坏性变更迁移指南:一条manage.py check命令自动生成新配置

django-csp 4.0破坏性变更迁移指南:一条manage.py check命令自动生成新配置 【免费下载链接】django-csp Content Security Policy for Django. 项目地址: https://gitcode.com/gh_mirrors/dj/django-csp django-csp 是 Django 项目最常用的 Content Securit…

2026/10/22 23:43:32 阅读更多 →
新技术分享:ComfyUi+MinimaxH3进阶教程(四)导演台工作流搭建

新技术分享:ComfyUi+MinimaxH3进阶教程(四)导演台工作流搭建

说明:若对文章中的内容有任何困惑的地方,可以对文章进行赞赏,赞赏后,可以发私信给作者,赞赏金额不限制,多少都可以! 前面我们做的MinimaxH3的工作流,只能出单段的视频&#…

2026/11/9 7:44:28 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/13 5:13:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/13 5:13:25 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/13 5:13:25 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/12 18:22:26 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/13 5:13:25 阅读更多 →

日新闻

周新闻

月新闻