# 使用区块浏览器在 Polygon zkEVM 上验证智能合约

> 部署在 Polygon POS 链上的智能合约可以通过区块浏览器验证源代码，同样，部署在 Polygon zkEVM 测试网上的合约也可以通过 Polygon zkEVM 测试网浏览器进行验证……

作者 Shodipo Ayomide，发布于 2023年1月19日。网页版本：https://blog.shodipoayomide.com/zh/verifying-smart-contracts-on-the-polygon-zkevm-using-the-explorer

![](https://blog.shodipoayomide.com/banners/Verifying-Smart-Contracts-on-the-Polygon-zkEVM-Using-the-Explorer.png)

部署在 Polygon POS 链上的智能合约可以通过区块浏览器验证源代码，同样，部署在 Polygon zkEVM 测试网上的合约也可以通过 Polygon zkEVM 测试网浏览器进行验证。在这篇技术教程中，我们会一步步演示具体怎么做。

经过验证的智能合约提供了无需信任（trustlessness）的保障，因为这类合约公开的源代码与其字节码是一致的。经过验证的智能合约能够确保这一点。这让用户可以阅读合约、理解它是如何实现的，还可以直接通过浏览器与它交互。

在开始验证之前，我们需要明白，合约既可能是单个文件，也可能由多个文件组成。单文件 Solidity 合约指的是不继承其他合约、库或接口的 Solidity 合约。

在实际场景中，部署的合约很少是单个 Solidity 文件，所以在本教程中，我们将验证一个部署在 zkEVM 测试网上的 ERC20 代币。单个 Solidity 文件也可以用完全相同的方式进行验证。

现在，让我们开始验证 zkEVM 合约吧！

## 部署合约

第一步是部署我们的合约

要部署到测试网，你必须先把测试网导入到你的 MetaMask 钱包中。如果还没有导入，请按照这篇[博客文章](https://polygon.technology/blog/your-three-step-guide-to-using-polygon-zkevm-yes-its-that-easy)中介绍的步骤操作。这篇文章详细讲解了如何导入测试网，以及如何获取测试网 ETH。

部署时，打开 [Remix IDE](https://remix.ethereum.org/)，新建一个文件，然后粘贴下面这段代码。

```rust
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract zkToken is ERC20, Ownable {
    constructor() ERC20("zkToken", "ZKT") {
        _mint(msg.sender, 10000 * 10 ** decimals());

    }

    function mint(address to, uint256 amount) public onlyOwner {
            _mint(to, amount);
    }

}
```

切换到“compile”标签页，在编译之前，你需要记下当前使用的编译器版本。这里我们使用的是 0.8.12 版本。

![](https://i.ibb.co/x1Bp8Dp/Screenshot-90-LI.jpg)

点击“compile”并且合约成功编译之后，就可以开始部署了。

现在切换到“Deploy & Run Transaction”标签页。把默认的“Remix VM London”切换为“Injected Web3 Provider”，这时 MetaMask 会弹出来。在此之前，请确保你已经切换到了 Polygon zkEVM 测试网。

![](https://i.ibb.co/5xn2pmS/Screenshot-92.png)

连接你的钱包，点击橙色的“deploy”按钮，合约马上就会部署完成！

由于我们的合约导入了其他合约，所以不能直接粘贴源代码来验证，我们需要先把代码扁平化（flatten）。

## 使用 Remix 中的 Flattener 插件扁平化合约

扁平化智能合约，就是把所有 Solidity 代码合并到一个文件中，而不是分散在多个源文件里。也就是说，原本通过 import 引入的代码，现在会直接嵌入到同一个文件中。

要扁平化我们的智能合约，需要执行以下步骤：

**第 1 步** - 在 Remix 中找到“plugin manager”，它就在设置标签页的正上方。

![](https://i.ibb.co/tpH6QVn/Screenshot-97-LI.jpg)

**第 2 步** - 搜索“Flattener”插件并激活它

![](https://i.ibb.co/0JKL8Lx/Screenshot-98-LI.jpg)

**第 3 步** - 现在切换到 flattener 标签页，点击“Flatten Contracts/zkToken”。

![](https://i.ibb.co/MZH7FzL/Screenshot-99.png)

**第 4 步** - 点击保存按钮，保存扁平化后的合约

## 在浏览器上查看合约

合约已经部署好了，现在我们可以在[区块浏览器](https://explorer.public.zkevm-test.net/)上查看它。

首先，我们把合约地址粘贴到搜索栏中，然后就会看到下面这个界面。

![](https://i.ibb.co/HNRNbMd/Screenshot-94.png)

切换到“code”标签页，找到“verify and publish”按钮。

![](https://i.ibb.co/NSJwHXm/Screenshot-95-LI.jpg)

点击“verify and publish”按钮之后，会出现三个选项，我们选择第一个选项“verify via flattened source code”，然后点击“Next”

![](https://i.ibb.co/gSfzjGN/Screenshot-96-LI.jpg)

接下来，填写出现的表单。

- contract name：“zkToken”
- compiler：v0.8.12（这是我们使用的编译器版本）
- optimization：no（我们没有对合约进行优化）
- 最后，把扁平化后的源代码复制粘贴到“Enter the Solidity Contract Code”中，然后点击“verify & Publish”按钮。

其余选项保持默认即可。

![](https://i.ibb.co/1MgLVzz/Screenshot-100.png)

瞧！我们现在看到了表示合约已经验证成功的对勾标记！

![](https://i.ibb.co/2Kddxnr/Screenshot-101.png)

---

## 总结

我们已经成功地在 Polygon zkEVM 测试网上验证了 ERC20 合约，现在任何人都可以与它交互了。前面我提到过，单个 Solidity 文件也可以按照同样的步骤进行验证，只是不需要扁平化代码。

我相信很快，像 Sourcify 这样利用合约元数据提供完整验证的验证工具就会支持 Polygon zkEVM 测试网，到时候我会再写一篇文章来介绍！
