:2026-02-19 8:00 点击:6
在区块链生态中,以太坊凭借其智能合约平台的灵活性,成为各类代币开发的首选,无论是社区治理、DeFi协议还是NFT项目,开发者都可以基于以太坊标准快速创建自己的代币(即“ETH币”,更准确的说法是“以太坊兼容代币”),本文将详细介绍开发一款以太坊兼容代币的完整流程,从技术原理到代码实现,帮助零基础开发者快速上手。
开发代币前,首先需确定其类型,这直接影响智能合约的设计和功能,目前以太坊主流代币标准包括:
本文以最常用的ERC-20为例,讲解开发流程。
开发以太坊智能合约需以下工具:
安装步骤示例(以Hardhat为例):
npm init -y # 安装Hardhat npm install --save-dev hardhat # 初始化Hardhat项目 npx hardhat # 选择"Create a basic sample project",安装示例依赖
ERC-20代币的核心功能需遵循OpenZeppelin标准库(已通过安全审计,避免常见漏洞),以下是完整代码示例(contracts/MyToken.sol):
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor(string memory name, string memory symbol) ERC20(name, symbol) {
// 初始供应量:1亿代币,18位小数(以太坊标准)
_mint(msg.sender, 10**18 * 10**8);
}
}
代码解析:
SPDX-License-Identifier:声明许可证(MIT为开源常用)。 pragma solidity ^0.8.0:指定Solidity版本(^0.8.0表示兼容0.8.x以上版本)。 import "@openzeppelin/contracts/token/ERC20/ERC20.sol":引入OpenZeppelin的ERC-20标准合约,避免重复造轮子。 contract MyToken is ERC20:继承ERC-20合约,获得代币核心功能(如transfer、balanceOf等)。 constructor:构造函数,在合约部署时执行,用于初始化代币名称(name)、符号(symbol)和初始供应量(_mint函数向部署者地址 mint 1亿代币,10**18是18位小数的精度单位)。 编译合约:
Hardhat会自动在hardhat.config.js中配置编译选项(Solidity版本、路径等),运行以下命令编译合约:
npx hardhat compile
编译成功后,合约的ABI(应用二进制接口,定义合约与外部交互的函数)和字节码(部署到区块链的机器码)会生成在artifacts/contracts/MyToken.sol/MyToken.json中。
编写测试脚本:
测试是保证合约安全的关键,在test/目录下创建myToken.test.js(使用JavaScript测试框架Chai):
const { expect } = require("chai");
const { ethers } = require("hardhat");
describe("MyToken", function () {
it("Should deploy with correct name and symbol", async function () {
const MyToken = await ethers.getContractFactory("MyToken");
const token = await MyToken.deploy("My Token", "MTK");
await token.deployed();
expect(await token.name()).to.equal("My Token");
expect(await token.symbol()).to.equal("MTK");
});
it("Should assign initial supply to deployer", async function () {
const MyToken = await ethers.getContractFactory("MyToken");
const token = await MyToken.deploy("My Token", "MTK");
await token.deployed();
const [deployer] = await ethers.getSigners();
expect(await token.balanceOf(deployer.address)).to.equal(10**18 * 10**8);
});
});
运行测试:
npx hardhat test
测试通过后,说明合约功能符合预期。
部署前需准备测试网ETH(可通过Faucet获取,如Goerli Faucet)。
配置Hardhat连接测试网:
在hardhat.config.js中添加测试网配置(以Goerli为例):
require("@nomicfoundation/hardhat-toolbox");
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: "0.8.0",
networks: {
goerli: {
url: "https://goerli.infura.io/v3/YOUR_INFURA_ID", // 替换为Infura或Alchemy的节点URL
accounts: ["YOUR_PRIVATE_KEY"], // 替换为MetaMask中测试网账户的私钥(仅测试用,勿泄露)
},
},
};
获取Infura ID:注册Infura,创建新项目,获取Goerli节点URL。
部署脚本:
在scripts/目录下创建deploy.js:
async function main() {
const MyToken = await ethers.getContractFactory("MyToken");
const token = await MyToken.deploy("My Token", "MTK");
await token.deployed();
console.log("MyToken deployed to:", token.address);
}
main().catch((error) =
> {
console.error(error);
process.exitCode = 1;
});
执行部署:
npx hardhat run scripts/deploy.js --network goerli
部署成功后,控制台会输出合约地址(如0x123...abc),记录该地址后续交互需使用。
验证合约(可选):
将合约源代码上传到以太坊浏览器(如Etherscan),提升可信度,使用Hardhat插件hardhat-etherscan:
npm install --save-dev @nomicfoundation/hardhat-etherscan
在hardhat.config.js中添加API Key(从Etherscan获取),运行:
npx hardhat verify --network goerli "CONTRACT_ADDRESS" "My Token" "MTK"
交互测试:
ethers.js调用合约函数(示例:查询余额): const tokenAddress = "0x123...abc";
const token = await ethers.getContractAt("MyToken", tokenAddress);
const balance = await token.balanceOf("0x...deployer_address");
console.log("Balance:", ethers.utils.formatUnits(balance, 18));
本文由用户投稿上传,若侵权请提供版权资料并联系删除!