# 关于FERC20智能合约验证的说明

By [jackygu's blog](https://paragraph.com/@jackygu) · 2023-06-07

---

FERC20 社区，大家好，

我是Jacky，这两天一直忙于FERC20的合约验证，但因为合约在编译过程中使用了新的`viaIR`技术，至今未能在以太坊区块链浏览器上成功验证合约，我找了国内外技术圈的朋友，尚未解决。

这意味着大家暂时无法在区块链浏览器的Contract标签页中看到合约源码。

但合约的验证是非常重要的，这决定了社区对智能合约是否信任。所以我想了一个临时方案来证明目前部署在主网上的智能合约，与`github`上公布的合约相同。并希望社区里熟悉智能合约技术的同学来验证这件事。

下面我将验证步骤详细介绍如下：（以下方法用于V1，V2版本方法也可一样验证）

### 1\. 合约简介

`FERC20`一共有两个合约：`InscriptionFactory.sol`和`Inscription.sol`。

*   前者用于管理所有的`FERC20`代币合约，包括生成代币、检索代币等功能；
    
*   后者即`FERC20`合约，它继承了标准的`ERC20`并做了一些功能上的扩展。
    

因为`Inscription.sol`合约被包含在`InscriptionFactory.sol`中，所以只需要一份`InscriptionFactory.sol`源文件即可。

合约源文件：[https://github.com/jackygu2006/ferc20\_contracts](https://github.com/jackygu2006/ferc20_contracts)

为方便社区技术同学验证，我已将`InscriptionFactory.sol`合约做扁平化处理，扁平化后的源文件：[https://gist.github.com/jackygu2006/5d1cb712cbd7ac46e9950f5832494a74](https://gist.github.com/jackygu2006/5d1cb712cbd7ac46e9950f5832494a74)

### 2\. 验证方式

#### 第一步

将`InscriptionFactory.sol`合约部署到与以太坊主网一模一样的`Goerli`测试网上。

打开[Remix](https://remix.ethereum.org)工具，新建一个空合约文件，命名为`InscriptionFactory.sol`，然后将从上面`github`复制下来的源文件粘贴至合约文件里。如下图：

![](https://storage.googleapis.com/papyrus_images/bedfda9f08d673502de840b9b19d6db06495bdff0f8e6e25aae7c6450e1e364d.png)

![](https://storage.googleapis.com/papyrus_images/5b9c19d1d2d22677dd97cc84179787793728b4cd69dc249799402f37285b0673.png)

然后点击上图下方的红色框位置，选择 `Use configuration file`, 并点击 `compiler_config.json`，会在主窗口看到配置文件，如下图。

![](https://storage.googleapis.com/papyrus_images/c245fdbe7f15c10429197f514fd1dccbecedb46c34f5bed152057893ca68f983.png)

**重点：在**`compiler_config.json`**配置文件中加上** `"viaIR" : true`，如上图中红色部分。

![](https://storage.googleapis.com/papyrus_images/1dbcc79e731263694fe765ab8d319c5ac84402eb640dab29598dcfde482cd6fc.png)

按上图指示，先选择编译环境为`Injected Provider - MetaMask`，这时候Remix会链接Metamask钱包，请确保连接到`Goerli`测试网，并确保操作账户中有一些测试币（0.1E就够了）。Metamask钱包链接成功后，会看到显示`Goerli(5) network`

然后在合约中选择`InscriptionFactory`，并点击 `Deploy` 按钮。

如果一切顺利，会弹出Metamask钱包，你可以选择较低的Gas价格，并签名发送交易，约15秒后，合约部署完毕，将在测试网上新部署的`InscriptionFactory`合约地址复制保留。

#### 第二步 生成`standard-json-input.json`文件。

因为编译合约时使用了`viaIR`方式，所以无法通过常规的在区块链浏览器中上传合约源码的方式进行验证，只能通过standard-json-input方式验证。因此，我们需要一个包括合约源码和配置的json文件。

关于如何生成该文件，在`reddit`上有个帖子可以参考，[链接](https://www.reddit.com/r/etherscan/comments/ywuklk/verify_your_smart_contract_on_etherscan_using/)。

如果你使用`hardhat`开发合约，则可以在`build`下得到`standard-json-input.json`文件。

![](https://storage.googleapis.com/papyrus_images/c52b2623103b4a34dcc2d8c26af76d061772e7e014b69a6a4f9a0221d87d766d.png)

#### 第三步 查看测试网上的合约字节码

通过上述方式部署完成后，即得到一个合约地址。大家可以按我下面的方法进行操作（但请将我的合约地址换成你们部署后得到的地址）

我部署后得到的在`Goerli`上的`InscriptionFactory`合约地址为：`0xfb1be5133e61012de5790589c9b8f9e5d79978df`

打开`Goerli`浏览器：[https://goerli.etherscan.io/](https://goerli.etherscan.io/)

![](https://storage.googleapis.com/papyrus_images/dcf87cedb1cd842e7e7af1e0d753df97eeec56a96e29e244ac74a0fd44e4ecb8.png)

![](https://storage.googleapis.com/papyrus_images/7ea0201f48db7c26a0e8719b2c9388a17562464db625d4532a6bce3597cb22e1.png)

![](https://storage.googleapis.com/papyrus_images/91c943c6346dda5e949bb7ffaa388d31d31c3e9d185563f4a04d6ef42cd91f9c.png)

请务必按上图中的选项选择，即：

*   编译类型为`Solidity(Standard-Json-Input)`
    
*   编译器版本为`v0.8.18+commit.87f61d96`
    
*   开源协议选择`MIT`
    

然后点击`Continue`按钮，进到下一页，见下图：

![](https://storage.googleapis.com/papyrus_images/52a0210cc491df2606da6480c333f5d953a8660135f17697eea30cbeaa2c1900.png)

选择第二步生成的`standard-json-input.json`文件，然后点击`Step2`上传该文件。

接着点击下方的蓝色`Verify and publish` 按钮，半分钟左右，出现下图页面：

![](https://storage.googleapis.com/papyrus_images/9c991b6a3c5262d80861cbe7ed667a28ed5660ca160ef6418ec6af24350374de.png)

**注意：上面这个页面表示源码验证失败，不过这无关紧要。**

在上面页面上找到下图红色位置，复制`Goerli`测试链上已经部署的智能合约字节码，并保存为文件。因为较长，就不粘贴在这里了。

![](https://storage.googleapis.com/papyrus_images/3b88268c873772129b75833a9607b9139bb1be9fcd46fa5d361b2d31b05c0c0d.png)

#### 第四步 查看以太坊主网上的合约字节码

与第三步的步骤相同，只是打开的是以太坊主网浏览器，合约地址是主网上的。

主网已经在运行的`InscriptionFactory`合约地址为：`0x47B9949041EbF2472332883e64025D5d024941C6`

（这里省略，请参考第三步）

最后，拿到在主网上部署的`InscriptionFactory`合约字节码，复制并保存。

#### 第五步 对比Goerli测试链和主链的字节码

![](https://storage.googleapis.com/papyrus_images/73ad7b81e303fe5ad9ae20015ad261b03d0c0c357fe634ebe365d2868f8e8fdb.png)

**注意，必须要每个字节都相同，才能证明两段程序的相同**

**我已按照上述方案验证通过，每个人都可以按上述方式验证**

### 3.验证原理

智能合约是将源代码编译后得到的字节码部署到区块链上的一段程序。原则是：**源码相同，字节码必然相同，源码不同，字节码必然不同。**

以太坊`Goerli`测试网与主网完全一致，所以，我们就可以通过对比测试网和主网上的字节码来验证`github`上开源的合约是否就是部署在区块链上的智能合约。

### 尾声

以上只是用于验证开源合约与链上合约一致性的临时解决方案，我称之为通过以太坊官方主网和官方测试网的间接验证。

社区里有同学能解决直接在以太坊主网上验证该合约的，请下载合约源码后自行处理，解决后，请截图后通过推特跟我联系，或者发推特并 @jackygu2020，第一个解决该问题的同学将从捐赠池中获得`1000 ferc`。

我相信通过社区，很快能解决这个问题。

谢谢大家的支持！！！

Jacky 2023-6-7 18:00(+8)

---

*Originally published on [jackygu's blog](https://paragraph.com/@jackygu/ferc20)*
