Web3 开发智能合约部署及合约验证全流程

  • Blue
  • 更新于 2023-12-15 09:02
  • 阅读 2966

这篇文章主要讲一下用hardhat框架开发好了一个solidity智能合约后,如何部署到以太坊(ETH)网络上,我会以以太坊测试网(Sepolia)来部署,和以太坊主网操作完全一样,其中会包含测试网ETH币领取,以一个ERC20代币的智能合约为例部署上线,以及上线后智能合约的验证。

这篇文章主要讲一下用hardhat框架开发好了一个solidity智能合约后,如何部署到以太坊(ETH)网络上,我会以以太坊测试网(Sepolia)来部署,和以太坊主网操作完全一样,其中会包含测试网ETH币领取,以一个ERC20代币智能合约为例部署上线,以及上线后智能合约的验证(不验证的话在区块浏览器中看不到源码,别人不太相信你的项目)。

一、Solidity 智能合约开发

开发这一块如果各位小伙伴还不太懂的话,建议看一下我之前的文章: 聊一聊Web3是什么,Web3从入门到精通开发学习路线

这里我直接以一个ERC20代币的智能合约为例,项目开源在github上,点此查看

智能合约代码:contract/MyTestToken.sol:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

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

contract MyTestToken is ERC20, Ownable {
    constructor(
        string memory name,
        string memory symbol,
        uint256 initialSupply
    ) ERC20(name, symbol) Ownable(msg.sender) {
        _mint(msg.sender, initialSupply);
    }

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

    function burn(address account, uint256 amount) public onlyOwner {
        _burn(account, amount);
    }
}

单测代码:test/MyTestToken.ts:

import { expect } from "chai";
import { ethers } from "hardhat";

describe("MyTestToken", function () {
  const useMTT = async () => {
    const MyTestToken = await ethers.getContractFactory("MyTestToken");
    const MTT = await MyTestToken.deploy("My Test Token", "MTT", 1000000);

    return MTT;
  };

  it("Deployment", async function () {
    const [owner] = await ethers.getSigners();

    const MTT = await useMTT();

    expect(await MTT.totalSupply()).to.equal(1000000);
    expect(await MTT.balanceOf(owner)).to.equal(1000000);
  });

  it("Transfer", async function () {
    const [owner, address1] = await ethers.getSigners();

    const MTT = await useMTT();

    await MTT.transfer(address1, 400000);
    expect(await MTT.balanceOf(owner)).to.equal(600000);
    expect(await MTT.balanceOf(address1)).to.equal(400000);
  });

  it("Mint", async function () {
    const [owner] = await ethers.getSigners();

    const MTT = await useMTT();
    await MTT.mint(owner, 200000);
    expect(await MTT.totalSupply()).to.equal(1200000);
    expect(await MTT.balanceOf(owner)).to.equal(1200000);
  });

  it("Burn", async function () {
    const [owner] = await ethers.getSigners();

    const MTT = await useMTT();
    await MTT.burn(owner, 300000);
    expect(await MTT.totalSupply()).to.equal(700000);
    expect(await MTT.balanceOf(owner)).to.equal(700000);
  });
});

智能合约部署上线后就不能修改了,单测非常非常非常重要,务必保证每个功能点没问题

运行npx hardhat test执行单测,如下图所示,全部通过

image.png

二、智能合约部署

我们的智能合约部署必须依赖区块链的节点上,如 InfuraAlchemy

这里我以Infura为例,需要我们先上去注册一个账号

注册登录好后

  1. 创建一个新的API KEY

image.png

  1. 进入创建的API KEY里选择对应的部署的节点,这里我们部署到ETH的测试网Sepolia上,Infura也提供了一个可以领Sepolia测试币的水龙头,大家可以点后面这个链接领取测试币,Sepolia水龙头

image.png

  1. 最后可以在激活的节点里复制刚才我们选择的节点URL

回到项目中

1. 安装dotenv并创建env文件

npm i dotenv -D安装支持读取env文件的依赖,并在项目跟目录创建env文件

image.png

ETH_SEPOILA_URL为刚才我们复制的节点URL

PRIVATE_KEY是我们需要准备一个钱包来部署我们的智能合约,这里要填钱包的私钥,请一定要保存好私钥不要泄漏,这个钱包在智能合约部署后为智能合约owner,只有他可以增发代币销毁代币

2. 在hardhat配置文件中添加Sepolia网络节点

hardhat.config.ts:

import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import dotenv from "dotenv";

dotenv.config();

const { ETH_SEPOILA_URL, PRIVATE_KEY = "" } = process.env;

const config: HardhatUserConfig = {
  solidity: "0.8.20",
  networks: {
    sepolia: {
      url: ETH_SEPOILA_URL,
      accounts: [PRIVATE_KEY],
    },
  },
};

export default config;

就是引入我们env中的配置,并通过networks添加sepolia网络节点

3. 编写部署脚本

scripts/deploy.ts:

import { ethers } from "hardhat";

async function main() {
  const [deployer] = await ethers.getSigners();

  console.log("Deploying contracts with the account:", deployer.address);

  const MyTestToken = await ethers.getContractFactory("MyTestToken");
  const MTT = await MyTestToken.deploy("My Test Token", "MTT", 1000000);

  console.log("MyTestToken address:", await MTT.getAddress());
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

其中在MyTestToken.deploy()方法中传入的三个参数就是我们智能合约构造函数所需的三个参数

4. 执行部署

执行npx hardhat run scripts/deploy.ts --network sepolia来部署

image.png

成功后可以看到执行部署的钱包地址,及部署后的智能合约地址,前端就可以根据这个智能合约地址来执行相应的操作了

5. 在区块浏览器中查看部署的智能合约

复制上面的智能合约地址,到 区块浏览器 中,就可以搜索查看了

image.png

这个我们智能合约的主页,因为我们发的是Token代币,还有个Token代币主页,点击上图中间标红查看

image.png

点击下面的Contract后可以看到我们合约是一段编译过的字符,用户并不能看到智能合约的源码,下面教大家如何验证我们的智能合约让用户能够看到源码

image.png

三、智能合约验证

为了增强用户对我们智能合约的信任,我们一般会将智能合约验证开源以增强用户对我们智能合约的信任度

  1. ETH主网区块链浏览器中申请API KEY

API KEY在主网及测试网是通用的,我们在主网申请即可

image.png

image.png

API KEY取个名称创建即可,成功后复制这个API KEY

image.png

  1. 在代码env中添加ETHERSCAN_APIKEY并设置刚才的API KEY

image.png

  1. hardhat.config.ts中添加相应配置

image.png

  1. 运行命令,执行验证

npx hardhat verify --network sepolia 0x634e6E8b817D5975B9808D0272D1f62DF1AdD91b "My Test Token" "MTT" 1000000

这行命令格式为npx hardhat verify --network 您部署的网络 智能合约地址 构造函数参数

image.png

看到如下输出就验证成功了,成功后在区块链浏览器上就可以看到智能合约源码了

image.png

如此就完成了我们Web3 开发智能合约部署的全流程,从最初的开发,到编译,单元测试,部署,最后的验证合约。

点赞 2
收藏 3
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Blue
Blue
0x7C2B...F8b1
积极主动,顺势而为!