ConfluxScan 验证合约
ConfluxScan 提供了合约验证的功能,本文将介绍如何在 Scan 验证一个合约。
为什么要进行合约验证?
合约验证之后会有如下几个好处:
- 合约验证之后可在 Scan 上看到 Solidity 源码及 ABI,更加透明,人人可审查合约逻辑。
- 验证之后的合约可直接在 Scan 合约详情页,调用合约方法读取合约状态,或通过链接 Fluent 更新合约状态。
- 合约验证之后,Scan 会显示绿色✅标识,用户更放心。
如何在 Scan 进行合约验证?
合约详情页,如果合约未验证的话, Contract Tab 会展示合约验证的跳转链接,点击之后可以进入到验证页面
合约验证需要开发者提供合约一些原始信息,Scan 验证服务会用来进行验证操作:
- 合约地址: Base32 格式地址,目前只支持主网,测试网合约地址
- 主合约名: 被验证主合约的名字,提交源码中可能包含多个合约,需要正确的指定需要验证合约的名字。
- License: 合约所采用的许可证类型
- Solidity 编译器版本
- 编译优化配置: 编译时是否打开了优化选项,选项是多少
- 合约源码: 被验证合约对应的源码,需要注意的一点时,如果合约中引入了其他文件中的合约,需要将所有文件代码 flatten 到单个文件中。
Flatten Solidity 代码
因为目前 ConfluxScan 验证只支持单文件,所以在验证前需要进行 flatten 操作,从而获取主合约及所有依赖的完整代码。目前主流的 Solidity 开发工具均提供 flatten 功能,比如:
- truffle-flattener
- npx hardhat flatten
- chainIDE 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 功能模块。
选择需要 Flatten 的合约,点击 Flatten 按钮,完成即可看到完整代码下载按钮,点击即可下载完成合约文件。
使用 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 服务配置
No Comments