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

您所在的位置:网站首页 以太坊合约部署 Web3 开发智能合约部署及合约验证全流程

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

2024-07-13 21:38| 来源: 网络整理| 查看: 265

这篇文章主要讲一下用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

二、智能合约部署

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

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

注册登录好后

创建一个新的API KEY

image.png

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

image.png

最后可以在激活的节点里复制刚才我们选择的节点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

三、智能合约验证

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

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

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

image.png

image.png

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

image.png

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

image.png

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

image.png

运行命令,执行验证

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

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

image.png

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

image.png

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3