Hardhat验证ProxyAdmin合约失败:字节码不匹配问题求助
排查Hardhat验证ProxyAdmin字节码不匹配问题
核对Hardhat Upgrades版本一致性
这个错误最常见的原因是部署合约时使用的@openzeppelin/hardhat-upgrades版本和现在验证时的版本不一致,插件不同版本的默认ProxyAdmin合约字节码可能存在差异。- 找到部署时的包锁文件(
package-lock.json或yarn.lock),搜索@openzeppelin/hardhat-upgrades获取当时的版本号 - 本地安装对应版本:
npm install @openzeppelin/hardhat-upgrades@x.x.x # yarn用户执行 yarn add @openzeppelin/hardhat-upgrades@x.x.x - 重新运行验证命令:
npx hardhat verify --network matic 0x877D0e3fB2732d074aa70D961320e3AE58320705
- 找到部署时的包锁文件(
检查是否使用了自定义ProxyAdmin
如果部署时未使用插件默认的ProxyAdmin,而是自定义了该合约,直接用默认逻辑验证会出现字节码不匹配:- 确认部署脚本中是否有自定义ProxyAdmin的部署代码,比如手动部署了自研的ProxyAdmin合约并关联代理
- 验证时直接指定自定义的ProxyAdmin合约进行验证,若合约无构造参数,运行:
npx hardhat verify --network matic 0x877D0e3fB2732d074aa70D961320e3AE58320705 - 如果自定义ProxyAdmin有构造参数,需要在命令后追加对应的参数(比如管理员地址)
手动比对字节码定位差异
若上述方法无效,直接对比区块链上的字节码和本地编译的字节码:- 从Polygon Scan获取已部署ProxyAdmin的字节码(合约详情页的「Bytecode」板块)
- 本地编译对应版本的ProxyAdmin(默认的在
@openzeppelin/hardhat-upgrades依赖中,自定义的则编译自研合约),拿到编译后的字节码(项目artifacts目录下) - 忽略字节码开头的构造参数编码部分,对比核心运行时字节码是否一致,找到差异点后针对性排查
检查部署脚本的配置修改
查看部署脚本是否修改了Hardhat Upgrades的默认配置:- 是否用
configureUpgradeable方法修改了ProxyAdmin的相关配置 - 是否在部署代理时指定了非默认的ProxyAdmin地址
- 是否用
内容的提问来源于stack exchange,提问作者codr
相关产品推荐
相关产品推荐

