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 开发智能合约部署的全流程,从最初的开发,到编译,单元测试,部署,最后的验证合约。

相关推荐
Rockbean3 天前
10分钟智能合约:进阶实战-7.2 Foundry开发环境
web3·智能合约·solidity
davidrevo5 天前
Solidity 学习总结:核心特性与实战指南
web3
Rockbean6 天前
10分钟智能合约:进阶实战-6.4 使合约拒绝服务
web3·智能合约·solidity
Rockbean6 天前
10分钟智能合约:进阶实战-6.3 重入攻击提取资金
web3·智能合约·solidity
木西8 天前
实战:基于 Solidity 0.8.27 与 OpenZeppelin V5 构建多链恶搞代币(以 SPX6900 为例)
web3·智能合约·solidity
m0_380167149 天前
面向开发者的Top10加密货币数据API(2026年最新)
大数据·人工智能·区块链
2601_959480159 天前
Moneta Markets亿汇:“比特币高位修复风险偏好”
区块链
m0_3801671410 天前
加密货币价格 API、市场数据 API 与 分析 API 有什么区别?
人工智能·ai·区块链
LedgerNinja10 天前
AEGET:提升决策效率,助力交易者建立清晰的交易体系
区块链
2601_9619633810 天前
Spring Boot集成电子签章的7个典型问题与解决方案:从入门到生产级实践
大数据·人工智能·spring boot·python·区块链·智能合约