跳转到主要内容

前置条件

  • 已部署在 Plasma 测试网上的合约。如果尚未部署,请参阅部署合约
  • 合约的源代码和编译设置。
  • 部署时使用的构造函数参数(如果有)。
Plasma 区块浏览器(plasmascan.to)提供一个与 Etherscan 兼容的验证 API。下面的示例直接使用该 API——提交验证无需第三方账号。

示例合约

我们将使用两个示例合约,演示简单与复杂构造函数参数的情况:

简单合约

一个基础的数据存储合约,演示智能合约的基本概念。

复杂合约

一个用于管理代币存款的更复杂的金库系统,带有可配置参数。

使用 Foundry 验证

Foundry 提供了 forge verify-contract 命令来验证合约。
  1. 确保你的 foundry.toml 包含验证所需的设置:
  2. 验证合约。对带有 string 构造函数参数的 SimpleStorage 合约:
    对于含有多个构造函数参数的 TokenVault 合约:
  3. 查看验证状态。使用 --watch 标志时,Foundry 会显示实时验证状态。请关注如下输出:

使用 Hardhat 验证

Hardhat 通过 @nomicfoundation/hardhat-verify 插件提供合约验证。
  1. 更新 hardhat.config.js,加入验证配置:
  2. 验证合约。对于简单合约:
    对于含多个构造函数参数的合约,创建验证脚本 scripts/verify.js
  3. 运行验证脚本:

在部署过程中自动验证

你也可以在部署时一并自动验证合约:

使用 Ethers.js 验证

Ethers.js 需要手动调用区块浏览器的 API 来验证。这种方式可以让你对验证流程拥有完全的控制权。
  1. 安装所需依赖:
  2. 创建验证脚本 verify-ethers.js
  3. 编码构造函数参数。对于复杂构造函数参数,你需要对其进行 ABI 编码。可以使用 Foundry 的 cast 工具:
  4. 最后运行验证:

检查验证状态

验证后,你可以确认它是否成功:

在区块浏览器上

  1. 访问 Plasma 测试网区块浏览器
  2. 搜索你的合约地址。
  3. 查看 “Contract” 标签旁是否有绿色对勾。
  4. 点击 “Contract” 标签查看已验证的源代码。

以编程方式

  1. 创建状态检查脚本 check-verification.js

备用方式

虽然区块浏览器是最常见的验证方式,你也可以使用:

Sourcify

Sourcify 提供去中心化的合约验证:

Tenderly

Tenderly 将验证作为其调试平台的一部分提供。详见其文档

合约扁平化

对于含有导入或库的合约,你可能需要在验证前将合约扁平化为单个文件。常用工具包括: 对于带有外部库的复杂项目,请参阅 Hardhat 验证文档了解高级配置选项。

故障排查

构造函数参数不匹配

请仔细核对构造函数参数与部署时使用的参数完全一致。可使用 cast abi-encode 验证编码。

编译器版本不匹配

确保验证请求中的编译器版本与编译时使用的版本一致。

优化设置不匹配

校验优化设置(启用/禁用与运行次数)与你的编译设置一致。

已经验证

这意味着先前已成功验证过。请查看区块浏览器进行确认。

速率限制

请稍等几分钟再重试。如果需要更高的限额,可以考虑升级 API 套餐。