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

相关推荐
寻月隐君8 小时前
探索Solana SDK实战:Web3开发的双路径与轻量模块化
后端·web3·github
独行soc9 小时前
2025年渗透测试面试题总结-长亭科技[实习]安全服务工程师题目+回答)
linux·科技·安全·面试·职场和发展·区块链
马丁的代码日记1 天前
智能合约安全专题(一):什么是重入攻击?——从 DAO 事件谈起
安全·区块链·智能合约
Blossom.1181 天前
基于区块链的供应链溯源系统:构建与实践
人工智能·python·深度学习·机器学习·计算机视觉·flask·区块链
寻月隐君1 天前
用 Rust 在 Solana 上打造你的专属代币:从零到一的 Web3 实践
后端·web3·github
穗余1 天前
WEB3全栈开发——面试专业技能点P8DevOps / 区块链部署
面试·web3·区块链
电报号dapp1191 天前
NFT模式:数字资产确权与链游经济系统构建
web3·去中心化·区块链·智能合约
CiaoTool2 天前
零基础完成 Token 创建的全流程教学
web3·区块链·加密货币·solana·开发者工具·ciaotool
穗余2 天前
WEB3全栈开发——面试专业技能点P7前端与链上集成
前端·web3
全干engineer2 天前
web3-基于贝尔曼福特算法(Bellman-Ford )与 SMT 的 Web3 DeFi 套利策略研究
算法·金融·web3·去中心化·区块链·智能合约