1. 项目概述
在区块链开发领域,ERC-20代币标准已经成为创建可互换代币的黄金标准。而Polkadot Hub作为新一代多链网络的基础设施,为开发者提供了更灵活的部署选择。本文将详细介绍如何使用Hardhat这一专业级以太坊开发环境,在Polkadot Hub上部署符合ERC-20标准的代币合约。
提示:虽然本文以Polkadot Hub为例,但所述方法同样适用于其他兼容EVM的区块链网络。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与工具链配置
2.1 开发环境搭建
首先需要安装Node.js(建议v16+)和npm/yarn。我推荐使用nvm管理Node版本:
bash复制curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
nvm install 16
nvm use 16
2.2 Hardhat项目初始化
创建项目目录并初始化:
bash复制mkdir polkadot-erc20 && cd polkadot-erc20
npm init -y
npm install --save-dev hardhat
npx hardhat
选择"Create a JavaScript project"选项,这将生成基础项目结构。我建议额外安装以下开发依赖:
bash复制npm install --save-dev @nomicfoundation/hardhat-toolbox @openzeppelin/contracts dotenv
2.3 Polkadot Hub网络配置
在hardhat.config.js中添加Polkadot Hub网络配置:
javascript复制require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();
module.exports = {
solidity: "0.8.19",
networks: {
polkadothub: {
url: "https://rpc.polkadothub.io",
accounts: [process.env.PRIVATE_KEY]
}
}
};
注意:务必使用.env文件管理私钥等敏感信息,不要直接硬编码在配置文件中。
3. ERC-20合约开发
3.1 合约创建
在contracts目录下创建MyToken.sol:
solidity复制// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor(uint256 initialSupply) ERC20("MyToken", "MTK") {
_mint(msg.sender, initialSupply);
}
}
这个基础实现包含了:
- 代币名称"MyToken"
- 代币符号"MTK"
- 初始供应量铸造功能
3.2 进阶功能扩展
实际项目中可能需要添加更多功能:
solidity复制import "@openzeppelin/contracts/access/Ownable.sol";
contract MyToken is ERC20, Ownable {
uint256 public constant MAX_SUPPLY = 1000000 * 10**18;
constructor() ERC20("MyToken", "MTK") {
_mint(msg.sender, MAX_SUPPLY / 2);
}
function mint(address to, uint256 amount) public onlyOwner {
require(totalSupply() + amount <= MAX_SUPPLY, "Exceeds max supply");
_mint(to, amount);
}
}
4. 测试与验证
4.1 编写单元测试
在test目录下创建MyToken.test.js:
javascript复制const { expect } = require("chai");
describe("MyToken", function() {
it("Should deploy with correct name and symbol", async function() {
const [owner] = await ethers.getSigners();
const Token = await ethers.getContractFactory("MyToken");
const token = await Token.deploy(1000000);
expect(await token.name()).to.equal("MyToken");
expect(await token.symbol()).to.equal("MTK");
expect(await token.totalSupply()).to.equal(1000000);
});
});
运行测试:
bash复制npx hardhat test
4.2 本地网络测试
可以使用Hardhat本地网络进行更全面的测试:
bash复制npx hardhat node
在另一个终端部署到本地网络:
bash复制npx hardhat run scripts/deploy.js --network localhost
5. 部署到Polkadot Hub
5.1 部署脚本准备
创建scripts/deploy.js:
javascript复制async function main() {
const [deployer] = await ethers.getSigners();
console.log("Deploying contracts with account:", deployer.address);
const Token = await ethers.getContractFactory("MyToken");
const token = await Token.deploy(1000000);
console.log("Token deployed to:", token.address);
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
5.2 实际部署
确保你的账户中有足够的DOT用于支付gas费:
bash复制npx hardhat run scripts/deploy.js --network polkadothub
成功部署后将输出合约地址,类似:
code复制Token deployed to: 0x1234...5678
6. 验证与交互
6.1 合约验证
验证合约源代码以便在区块浏览器中查看:
bash复制npx hardhat verify --network polkadothub <合约地址> 1000000
6.2 前端集成示例
使用ethers.js与合约交互的基本示例:
javascript复制import { ethers } from "ethers";
const provider = new ethers.providers.JsonRpcProvider(
"https://rpc.polkadothub.io"
);
const contractAddress = "0x1234...5678";
const abi = [...]; // 你的合约ABI
const tokenContract = new ethers.Contract(contractAddress, abi, provider);
async function getBalance(address) {
const balance = await tokenContract.balanceOf(address);
return ethers.utils.formatUnits(balance, 18);
}
7. 常见问题与解决方案
7.1 部署失败排查
问题: 交易被拒绝或超时
- 检查RPC端点是否可用
- 确认账户余额足够支付gas费
- 尝试调整gas价格
7.2 合约验证失败
问题: 源代码验证不通过
- 确保部署时使用的编译器版本与验证时一致
- 检查构造函数参数是否正确
- 确认没有在部署后修改合约
7.3 前端无法读取余额
问题: 前端显示余额为0
- 检查是否连接到正确的网络
- 确认合约地址正确
- 验证调用的ABI与部署的合约匹配
8. 优化与进阶
8.1 Gas优化技巧
- 使用Solidity 0.8.x的默认优化器设置:
javascript复制solidity: {
version: "0.8.19",
settings: {
optimizer: {
enabled: true,
runs: 200
}
}
}
- 避免在合约中使用不必要的存储操作
- 考虑使用ERC20Snapshot等扩展合约实现高级功能
8.2 监控与维护
建议设置:
- 交易监控警报
- 合约升级机制(使用Proxy模式)
- 定期备份重要数据
我在实际部署中发现,Polkadot Hub的网络拥堵情况通常比以太坊主网轻很多,但gas价格波动仍然需要关注。建议在部署重要合约前,先用测试网进行充分验证。
