使用Brownie框架向ganache-cli部署OpenZeppelin ERC777合约报错如何解决
问题根因
OpenZeppelin v3.x系列的ERC777合约依赖ERC1820全局地址注册表实现代币收发钩子的逻辑校验,绝大多数本地开发测试链默认不会预先部署该注册表,因此ERC777构造函数执行时会触发检查失败直接回滚,且不会返回明确的错误提示。
解决方案
先在当前测试链上部署ERC1820注册表之后再部署GLDToken即可,操作步骤如下:
- 在brownie console中执行以下命令部署ERC1820注册表:
from brownie import ERC1820Registry, accounts # 本地测试可以用任意账户部署,生产环境建议部署到ERC1820标准地址0x1820a8116927d06924312511a356fBc75E98029E erc1820 = ERC1820Registry.deploy({"from": accounts[0]})
- 重新部署GLDToken合约即可正常完成部署:
t2 = GLDToken.deploy(1e21, [], {"from": accounts[1]})
通用调试方案
如果后续遇到同类无明确报错的交易回滚问题,可以用以下方式获取更多信息:
- 部署交易时添加
allow_revert=True参数,之后通过交易对象的revert_msg属性查看回滚原因:
tx = GLDToken.deploy(1e21, [], {"from": accounts[1]}, allow_revert=True) print(tx.revert_msg)
- 运行部署脚本时添加
--interactive参数进入交互调试模式,单步追踪合约执行逻辑:
brownie run scripts/deploy.py --interactive
额外优化建议
当前使用的openzeppelin-contracts@3.0.0属于较老的版本,存在多个已知的合约bug,建议升级到0.6.x支持的最新稳定版v3.4.2,可避免很多潜在的库兼容性问题。
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

