这篇文章主要讲一下用
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
执行单测,如下图所示,全部通过
二、智能合约部署
我们的智能合约部署必须依赖区块链的节点上,如 Infura 或Alchemy
这里我以Infura
为例,需要我们先上去注册一个账号
注册登录好后
- 创建一个新的
API KEY
- 进入创建的
API KEY
里选择对应的部署的节点,这里我们部署到ETH
的测试网Sepolia
上,Infura
也提供了一个可以领Sepolia
测试币的水龙头,大家可以点后面这个链接领取测试币,Sepolia水龙头
- 最后可以在激活的节点里复制刚才我们选择的
节点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
后可以看到我们合约是一段编译过的字符,用户并不能看到智能合约的源码,下面教大家如何验证我们的智能合约让用户能够看到源码
三、智能合约验证
为了增强用户对我们智能合约的信任,我们一般会将智能合约验证开源以增强用户对我们智能合约的信任度
- 在
ETH
主网区块链浏览器中申请API KEY
API KEY
在主网及测试网是通用的,我们在主网申请即可
对API KEY
取个名称创建即可,成功后复制这个API KEY
- 在代码
env
中添加ETHERSCAN_APIKEY
并设置刚才的API KEY
- 在
hardhat.config.ts
中添加相应配置
- 运行命令,执行验证
npx hardhat verify --network sepolia 0x634e6E8b817D5975B9808D0272D1f62DF1AdD91b "My Test Token" "MTT" 1000000
这行命令格式为npx hardhat verify --network 您部署的网络 智能合约地址 构造函数参数
看到如下输出就验证成功了,成功后在区块链浏览器上就可以看到智能合约源码了
如此就完成了我们Web3 开发智能合约部署的全流程,从最初的开发,到编译,单元测试,部署,最后的验证合约。