Skip to main content

ConfluxScan 验证合约

ConfluxScan 提供了合约验证的功能,本文将介绍如何在 Scan 验证一个合约。

为什么要进行合约验证?

合约验证之后会有如下几个好处:

  1. 合约验证之后可在 Scan 上看到 Solidity 源码及 ABI,更加透明,人人可审查合约逻辑。
  2. 验证之后的合约可直接在 Scan 合约详情页,调用合约方法读取合约状态,或通过链接 Fluent 更新合约状态。
  3. 合约验证之后,Scan 会显示绿色✅标识,用户更放心。

Screen Shot 2022-06-22 at 10.56.30.png

Screen Shot 2022-06-22 at 10.56.47.png

如何在 Scan 进行合约验证?

合约详情页,如果合约未验证的话, Contract Tab 会展示合约验证的跳转链接,点击之后可以进入到验证页面

Screen Shot 2022-06-22 at 10.57.27.png

合约验证需要开发者提供合约一些原始信息,Scan 验证服务会用来进行验证操作:

  • 合约地址: Base32 格式地址,目前只支持主网,测试网合约地址
  • 主合约名: 被验证主合约的名字,提交源码中可能包含多个合约,需要正确的指定需要验证合约的名字。
  • License: 合约所采用的许可证类型
  • Solidity 编译器版本
  • 编译优化配置: 编译时是否打开了优化选项,选项是多少
  • 合约源码: 被验证合约对应的源码,需要注意的一点时,如果合约中引入了其他文件中的合约,需要将所有文件代码 flatten 到单个文件中。

Flatten Solidity 代码

因为目前 ConfluxScan 验证只支持单文件,所以在验证前需要进行 flatten 操作,从而获取主合约及所有依赖的完整代码。目前主流的 Solidity 开发工具均提供 flatten 功能,比如:

npx hardhat flatten

假如开发者的合约项目使用 hardhat,则可以使用如下方式获取 merge 后的合约.

$ npx hardhat flatten ./contracts/ERC20Token.sol > ERC20TokenMerged.sol

该命令执行完之后,项目根目录下会有一个完整的合约代码的 ERC20TokenMerged.sol 文件。可直使用 ConfluxScan 的验证页面的合约文件上传功能上传代码,或手动复制文件内容到源代码编辑框中。

关于 npx hardhat flatten 使用也可参看 How to Flatten a Solidity file using Hardhat.

chainIDE flatten 插件

ChainIDE 是一个在线 Solidity 开发工具,通过插件,可以非常方便的扩展功能, @chainide/solidity-flattener 模块即是用于合并合约代码的插件,点击激活,即会在右侧增加一个 Flattener 功能模块。

WechatIMG254.jpeg

选择需要 Flatten 的合约,点击 Flatten 按钮,完成即可看到完整代码下载按钮,点击即可下载完成合约文件。

Screen Shot 2022-06-22 at 14.56.10.png

使用 hardhat-conflux 进行合约验证

EtherScan 跟 ConfluxScan 都对外提供 OpenAPI 接口,其中也包含合约验证的接口。从而衍生了一些工具可用于直接验证合约,比如 hardhat-etherscan 插件可用于在 EtherScan 直接验证以太坊合约。

hardhat-conflux 是一个 Hardhat 插件,不仅可以用于 Conflux 合约部署与交互,同样也提供了合约验证功能,使用 npm 安装之后,在 hardhat.config.js 文件引入之后,hardhat 将会增加一个 verifyCfxContract 命令,可用于验证合约

# npx hardhat verifyCfxContract CONTRACT_NAME DEPLOYED_CONTRACT_ADDRESS
$ npx hardhat verifyCfxContract Greeter cfxtest:acba7cvb1k6bhctzsfshybg5zgch39gnpuc8teem53

FAQs

为什么合约验证不通过?

合约验证不通过,大概率是因为某个参数设置不正确,比如 主合约名,编译器版本,是否开启优化等。

Conflux eSpace 如何验证合约?

整体验证方式相同,也可以使用 hardhat-etherscan 插件验证,但需要自行配置 OpenAPI 服务配置