Skip to content

使用Etherscan插件验证智能合约

Etherscan Plugins Banner

概览

验证智能合约是为部署在Moonbeam上的合约提供透明度和安全性的一种好方法。与Etherscan的合约验证服务集成的插件有很多,其中包括hardhat-etherscan插件truffle-plugin-verify插件。这两种插件均能通过本地检测需要验证的合约及其所需的Solidity库(若有)来自动执行验证合约的过程。

Hardhat插件可以无缝集成至您的Hardhat项目,同样地Truffle插件也可以集成至您的Truffle项目。Foundry也具有Etherscan功能,但它们内置于其Forge工具中,而非包含在单独的插件中。

本教程将向您展示如何使用两者插件验证部署至Moonbase Alpha的智能合约。本教程也同样适用于Moonbeam和Moonriver。

查看先决条件

在开始本教程之前,您将需要准备以下内容:

生成Moonscan API密钥

要生成Moonscan API密钥,您需要先注册一个账号。这取决于您想要在哪个网络上验证合约,请确保您在Moonscan上选择正确的网络创建API密钥。如果您选择在Moonbeam和Moonbase Alpha上验证合约,您可以前往Moonbeam Moonscan;如果您选择在Moonriver上验证合约,您可以前往Moonriver Moonscan。要注册一个账号,请遵循以下步骤:

  1. 点击Sign In

  2. 选择Click to sign up后注册您的新账号

Sign up for Moonscan

完成注册并登录新账号后,您将能够创建API密钥。

  1. 在左侧菜单中选择API-KEYs

  2. 点击+ Add按钮增加新的密钥

Add an API key

系统将提示您为您的API密钥输入AppName。随后,点击Continue,该密钥将会显示在您的API密钥列表中。

使用Hardhat Etherscan插件

本教程此部分将以使用Hardhat部署至Moonbeam所创建的Box.sol合约为例。

开始使用Hardhat Etherscan插件之前,您需要先运行以下代码安装插件库:

npm install --save-dev @nomiclabs/hardhat-etherscan

注意事项

@nomiclabs/hardhat-etherscan的3.0.1版本中已添加对基于Moonbeam网络的支持。您可以通过查看devDependencies部分的package.json来确认所使用的版本并更新至3.0.1或以上的版本(若需要)。

您可以将您的Moonscan API密钥与您的私钥一起添加到secrets.json文件中。在本示例中,您将需要Moonbeam Moonscan API密钥。如果您想要在Moonriver上验证合约,您将需要Moonriver Moonscan API密钥。

从您的Hardhat项目中,打开hardhat.config.js文件,导入hardhat-etherscan插件和您的Moonscan API密钥,并添加Etherscan配置:

require("@nomiclabs/hardhat-etherscan");

const { privateKey, moonbeamMoonscanAPIKey, moonriverMoonscanAPIKey } = require('./secrets.json');

module.exports = {
  networks: {
    moonbeam: { ... },
    moonriver: { ... },
    moonbase: { ... }
  },
  etherscan: {
    apiKey: {
      moonbeam: moonbeamMoonscanAPIKey, // Moonbeam Moonscan API Key
      moonriver: moonriverMoonscanAPIKey, // Moonriver Moonscan API Key
      moonbaseAlpha: moonbeamMoonscanAPIKey, // Moonbeam Moonscan API Key    
    }
  }
};

要验证合约,您需要运行verify命令并传入已部署合约的地址及其部署的网络:

npx hardhat verify --network moonbase <CONTRACT-ADDRESS>

在您的终端,您将看到您的合约源代码已成功提交验证。如果验证成功,您将在终端看到Successfully verified contract以及Moonbase Alpha上的Moonscan的合约代码链接。

Successful verification using hardhat-etherscan plugin

如果您正在验证具有constructor函数的合约,您将需要运行上述命令并在命令末尾添加用于部署合约的constructor函数。例如:

npx hardhat verify --network moonbase <CONTRACT-ADDRESS> "<constructor argument>"

参考Hardhat Etherscan文档网站获取其他如下所示用例:

使用Truffle验证插件

本教程此部分将以使用Truffle部署合约至Moonbeam所创建的MyToken.sol合约为例。

开始使用truffle-plugin-verify之前,您需要先打开您的Truffle项目并运行以下代码安装插件:

npm install --save-dev truffle-plugin-verify

接下来,您需要将插件添加至您的truffle-config.js文件,并添加Etherscan配置。在本示例中,您将需要Moonbeam Moonscan API密钥。如果您想要在Moonriver上验证合约,您将需要Moonriver Moonscan API密钥。Truffle配置内容应如下所示:

module.exports = {
  networks: { ... },
  compilers: { ... },
  plugins: ['moonbeam-truffle-plugin', 'truffle-plugin-verify'],
  api_keys: {
    moonscan: 'INSERT-YOUR-MOONSCAN-API-KEY'
  }
}

要验证合约,您需要运行run verify命令并传入已部署合约的名称及其部署的网络:

truffle run verify MyToken --network moonbase

如果验证成功,您将在终端看到Pass - Verified以及Moonbase Alpha上的Moonscan的合约代码链接。

Successful verification using truffle-verify-plugin

更多关于插件的详细信息,请参考README.md文档truffle-plugin-verify GitHub repo。

使用Foundry验证

本教程此部分将以使用Foundry部署合约至Moonbeam所创建的MyToken.sol合约为例。

除了Foundry项目,您将需要Moonbeam Moonscan API密钥。此API密钥可用于Moonbeam和Moonbase Alpha网络。如果您想要在Moonriver上验证合约,您将需要Moonriver Moonscan API密钥。

如果您已部署示例合约,您可以使用verify-contract命令行来验证。在验证合约之前,您将需要ABI编码constructor函数。为此,您可以运行以下命令:

cast abi-encode "constructor(uint256)" 100

结果将显示为0x0000000000000000000000000000000000000000000000000000000000000064。随后您可以使用以下命令来验证合约:

forge verify-contract --chain-id 1284 \
YOUR_CONTRACT_ADDRESS \
--constructor-args 0x0000000000000000000000000000000000000000000000000000000000000064 \
src/MyToken.sol:MyToken \
YOUR_MOONSCAN_API_KEY
forge verify-contract --chain-id 1285 \
YOUR_CONTRACT_ADDRESS \
--constructor-args 0x0000000000000000000000000000000000000000000000000000000000000064 \
src/MyToken.sol:MyToken \
YOUR_MOONSCAN_API_KEY
forge verify-contract --chain-id 1287 \
YOUR_CONTRACT_ADDRESS \
--constructor-args 0x0000000000000000000000000000000000000000000000000000000000000064 \
src/MyToken.sol:MyToken \
YOUR_MOONSCAN_API_KEY

Foundry Verify

如果您想要部署示例合约的同时进行验证,您可以使用以下命令:

forge create --rpc-url RPC-API-ENDPOINT-HERE \
--constructor-args 100 \
--etherscan-api-key YOUR_MOONSCAN_API_KEY \
--verify --private-key YOUR_PRIVATE_KEY \
src/MyToken.sol:MyToken     
forge create --rpc-url RPC-API-ENDPOINT-HERE \
--constructor-args 100 \
--etherscan-api-key YOUR_MOONSCAN_API_KEY \
--verify --private-key YOUR_PRIVATE_KEY \
src/MyToken.sol:MyToken     
forge create --rpc-url https://rpc.api.moonbase.moonbeam.network \
--constructor-args 100 \
--etherscan-api-key YOUR_MOONSCAN_API_KEY \
--verify --private-key YOUR_PRIVATE_KEY \
src/MyToken.sol:MyToken 

Foundry Contract Deploy and Verify