Skip to content

使用区块浏览器验证智能合约

Explorer Banner

概览

通过区块浏览器上验证智能合约,这对于部署在Moonbeam上的智能合约是能够大幅提升透明度和安全性的方法。用户直接查看已被验证的智能合约的源代码,同时也可以使用部分区块浏览器的接口与合约的公开函数/代码互动。

本教程将会列出通过区块浏览器在Moonbeam网络上验证智能合约的所有步骤。

部署合约

要在区块浏览器上验证一个智能合约,首先确保该合约已部署至目标网络。本教程将演示在Moonbase Alpha上部署智能合约。

关于如何使用Moonbeam上的以太坊库部署智能合约,您可以查看此教程。同样,您也可以使用如RemixTruffle或其他开发者工具在Moonbeam上部署智能合约。

本教程将会使用以上提及的部署教程中所使用的智能合约作为验证范本。

所使用的合约为简单的增量函数,根据功能命名为Incrementer.sol。内含的Solidity代码如以下所示:

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract Incrementer {
    uint256 public number;

    constructor(uint256 _initialNumber) {
        number = _initialNumber;
    }

    function increment(uint256 _value) public {
        number = number + _value;
    }

    function reset() public {
        number = 0;
    }
}

收集验证合约所需信息

为验证合约,您将需要收集合约编译器和部署细节的相关信息以保证验证能够顺利进行。

  1. 记录用于编译和部署合约的Solidity编译器版本。通常Solidity编译器的版本会在使用的部署工具中提及和描述

  2. 记录任何在Solidity开源文件开头使用的任何SPDX证照识别码

    // SPDX-License-Identifier: MIT
    
  3. (可选) 如果在编译过程中开启过Optimization,记录Optimization运行系数的数值

  4. (可选)如果合约构造方法接受参数,记录构造函数的ABI编码形式

  5. 在部署后,记录智能合约部署的合约地址。合约的部署地址可以通过使用Truffle、Hardhat或以太坊库等基于命令行的开发工具,在控制台输出中获得,也可以通过Remix IDE等工具中在GUI中复制获得

Example Compiler Options in Remix IDE

Contract Address in Remix IDE

验证合约

下一步将在您部署到的Moonbeam网络的EVM兼容浏览器中验证智能合约。

Moonscan

在Moonscan中跟随以下步骤以验证合约:

  1. 在Moonscan中导向至Verify & Publish Contract Source Code页面

  2. 在第一个输入框中填入0x开头的合约部署地址

  3. 选择编译器类型。在此Incrementer.sol示例中,选取Solidity(Single file)

  4. 选取完编译器类型后,选取用于部署合约的编译器版本。如果所使用的编译器版本为nightly commit,取消输入框下的勾选框,即选取nightly版本

  5. 选取所使用的开源证照。在此Incrementer.sol示例中,选取MIT License(MIT)。如果未使用任何证照,选取No License(None)

  6. 在表格底下点击Continue按钮以进入下个页面

    First Page Screenshot

在第二个页面,Contract AddressCompilerConstructor Arguments的输入框应该都已自动填写完毕,您只需填写以下信息:

  1. 在文字输入框中粘贴复制的合约内容

  2. (可选)如果在编译时曾经开启Optimization,则选取Yes,并在Misc Settings/Runs (Optmizer)下输入运行次数

  3. (可选)如果曾使用合约库及其地址,则新增合约库和地址

  4. (可选)勾选任何可应用至您的合约的输入框,并根据指示填写信息

  5. 在页面底下点击CAPTCHA和Verify and Publish按钮以确认信息并开始验证

Second Page Screenshot

经过一段时间后,验证的结果将会显示在浏览器上,成功结果的页面将会显示合约的ABI编码构造函数、合约名称、字节码和ABI。

Result Page Screenshot

BlockScout

BlockScout上通过搜寻地址导向至指定网络的合约页面,并在Code标签下点击Verify & Publish按钮

BlockScout Verify Button

在验证页面,合约地址将会被自动填写,您只需输入以下信息:

  1. 输入合约名称,这必须与合约定义上的名称相同。在本示例中,合约名称为Incrementer

  2. 填写CompilerEVM VersionOptimization输入框(如果Optimization在编译时曾被开启)

  3. 复制Solidity智能合约的完整内容并粘贴至文字输入框

  4. (可选)将Try to fetch constructor arguments automatically切换至Yes,即自动获取构造函数,或是在合约构造函数接受参数的情况下手动输入ABI编码的构造函数argument

  5. (可选)如果曾使用合约库及其地址,则新增合约库和地址

  6. 在所有信息填写完毕后点击页面下方的Verify & Publish按钮

BlockScout Verify Page

经过一段时间后,如果验证完全成功,浏览器将会回到合约的Code页面,显示合约的相关信息,包含构造函数ABI编码、合约名称、字节面、ABI和源代码。合约页面将同时拥有两个新的标签,Read ContractWrite Contract,方便用户阅读和直接撰写合约。

BlockScout Result Page

智能合约扁平化

要验证由多个文件组成的智能合约,其过程与先前略微不同,并且需要一些前置步骤以将目标智能合约的所有依赖项合并至单一的Solidity文件。

该预处理通常被称为智能合约扁平化。目前有部分工具可以用来扁平化多个部分的智能合约至单一的Solidity文件,如Truffle Flattener。请参考各自智能合约扁平化工具的文档以获得更详细的说明。

扁平化多个部分的智能合约后,可以在区块浏览器上使用新的扁平化后的Solidity文件进行验证,其方式与本教程中所描述的验证单一文件智能合约的方式相同。

在Moonscan上验证多个部分的智能合约

关于在Moonscan上进行验证,其有一个内建功能可以处理多个部分的智能合约。

Compiler Type(上述示例中的第三个步骤)选取Solidity (Multi-part files)。在下个页面,选取并上传所有组成其智能合约的不同Solidity文件,包含嵌入依赖项的合约文件。

Moonscan Multifile Page

除此之外,其余验证过程与在Moonscan上验证单一文件合约的过程相同。