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

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

一、Solidity 智能合约开发

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

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

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

ts 复制代码
// 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:

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执行单测,如下图所示,全部通过

二、智能合约部署

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

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

注册登录好后

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

回到项目中

1. 安装dotenv并创建env文件

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

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

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

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

hardhat.config.ts:

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:

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来部署

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

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

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

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

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

三、智能合约验证

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

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

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

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

  1. 在代码env中添加ETHERSCAN_APIKEY并设置刚才的API KEY
  1. hardhat.config.ts中添加相应配置
  1. 运行命令,执行验证

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

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

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

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

相关推荐
电报号dapp11916 分钟前
链游系统定制化开发:引领游戏产业的新时代
游戏·机器人·去中心化·区块链
MavenTalk1 小时前
Move开发语言在区块链的开发与应用
开发语言·python·rust·区块链·solidity·move
YSGZJJ11 小时前
股指期货套利交易详解
区块链
MavenTalk20 小时前
区块链里的Layer 1(L1)和 Layer 2(L2)是什么
区块链·arbitrum·layer2·layer1·optimism
dingzd952 天前
Web3推动社交媒体的去中心化转型:挑战与机遇
web3·去中心化·区块链
Footprint_Analytics3 天前
Web3 游戏周报(11.03 - 11.09)
游戏·web3
Koi慢热3 天前
WEB3.0介绍
web3
q22472388204 天前
期货配资系统行情源对接通讯协议范本
大数据·前端·前端框架·区块链·开源软件
TheFirst0084 天前
The First项目报告:MANTRA如何实现世界金融区块链化?
金融·区块链
程序员 jet_qi5 天前
区块链应用第1讲:基于区块链的智慧货运平台
区块链·智能合约·数字身份·did·货运平台·可验性证明·vc