You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证通过create2部署的TransparentUpgradeableProxy合约?

解决TransparentUpgradeableProxy代理合约Hardhat验证失败的思路
  • 直接指定代理合约源码进行验证
    跳过Hardhat Upgrades插件的自动验证逻辑,用原生hardhat verify命令直接指定OpenZeppelin官方的TransparentUpgradeableProxy合约。执行命令时传入代理地址、构造函数的三个参数:

    npx hardhat verify --network <你的网络名称> <代理合约地址> <implementation地址> <proxyAdmin地址> ""
    

    若本地已安装@openzeppelin/contracts包,可明确指定合约路径确保版本匹配:

    npx hardhat verify --network <你的网络名称> --contract @openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol:TransparentUpgradeableProxy <代理合约地址> <implementation地址> <proxyAdmin地址> ""
    
  • 核对合约版本与编译参数
    字节码不匹配的核心原因通常是版本或编译配置不一致:

    • 确认部署时代码引用的@openzeppelin/contracts版本,和当前Hardhat项目依赖的版本完全相同(查看package.json里的版本号)。
    • 检查编译时的优化开关、Solidity版本,必须和部署时的hardhat.config.js里的solidity配置一致。
  • 对比字节码定位差异
    编写Hardhat脚本生成你手动部署时的完整字节码,和链上代理合约的字节码对比,确认差异来源:

    const { ethers } = require("hardhat");
    async function main() {
      const implementation = "0x..."; // 替换为你的实现合约地址
      const proxyAdmin = "0x..."; // 替换为你的ProxyAdmin地址
      
      // 获取TransparentUpgradeableProxy的创建字节码
      const proxyFactory = await ethers.getContractFactory("TransparentUpgradeableProxy");
      const creationCode = proxyFactory.bytecode;
      
      // 拼接和部署时一致的字节码
      const bytecode = ethers.utils.solidityPack(
        ["bytes", "bytes"],
        [creationCode, ethers.utils.defaultAbiCoder.encode(["address", "address", "bytes"], [implementation, proxyAdmin, ""])]
      );
      
      console.log("生成的部署字节码:", bytecode);
      // 对比链上字节码
      const proxyCode = await ethers.provider.getCode("<代理合约地址>");
      console.log("链上字节码:", proxyCode);
    }
    main().catch(err => console.error(err));
    

    如果生成的字节码和链上一致,说明合约版本和编译参数没问题,只需调整验证命令即可。

  • 手动在区块浏览器验证
    若Hardhat CLI验证仍失败,直接通过对应区块链的浏览器(如Etherscan)手动提交:

    1. 进入代理合约的浏览器页面,点击"Verify and Publish"。
    2. 选择对应Solidity版本、编译器优化选项(需和部署时一致)。
    3. 复制对应版本的TransparentUpgradeableProxy.sol源码(从OpenZeppelin仓库对应版本分支复制)。
    4. 填写构造函数参数:implementation地址、proxyAdmin地址、空字符串(对应空字节数组)。
    5. 提交验证,等待审核通过。

内容的提问来源于stack exchange,提问作者Navid Far

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:05:40