重启Ganache后二次运行01_deploy_price_consumer Brownie报ContractNotFound错误
问题根因
报错是Brownie本地部署缓存与重置后的Ganache链数据不匹配导致的:
每次关闭Ganache启动新实例时,原有本地链的所有状态(包括已部署的合约数据)都会被清空,但Brownie会把历史部署的合约地址、ABI等信息存在项目根目录的build/deployments/<对应链ID>文件夹下。再次运行脚本时,Brownie会默认优先加载这些缓存的部署记录,到新的Ganache链上查询对应地址的合约,自然就会抛出ContractNotFound错误。
可用解决方案
方案1:单次运行时添加重置参数(最适配你的需求)
运行部署脚本时加上--reset标识,Brownie会直接忽略之前的部署缓存,完全重新部署所有合约,不会尝试加载旧的地址记录:
brownie run scripts/price_feed_scripts/01_deploy_price_consumer_v3.py --reset
你调整完模拟喂价的返回值后,每次重启Ganache后加该参数运行即可,不需要删除整个仓库重新克隆。
方案2:手动清空部署缓存
如果不想每次加参数,可以在重启Ganache后,手动删除项目根目录下build/deployments文件夹内对应本地网络的子文件夹(Ganache默认链ID为1337,对应子文件夹名称就是1337),也可以直接删除整个build文件夹。Brownie下次运行时会自动生成新的缓存,不会加载旧的部署记录。
方案3:开启Ganache数据持久化(适合长期本地测试)
如果不想每次重启Ganache都重新部署合约,可以在启动Ganache时开启链数据持久化:
- 若使用Ganache GUI,新建工作区时勾选「SAVE WORKSPACE」保存工作区,后续打开该工作区即可保留历史链数据
- 若使用Ganache CLI,启动时添加
--db <自定义存储路径>参数,链数据会保存在指定路径中
重启Ganache后原有合约还会保留,不会触发该报错。
内容的提问来源于stack exchange,提问作者john9
相关产品推荐
相关产品推荐

