🚀 发行自己的加密货币(ERC-20 代币)
你可以使用 Solidity 编写 ERC-20 智能合约 来发行自己的加密货币,然后部署到 以太坊(Ethereum) 或 BNB/Polygon 等 EVM 兼容链。
📌 1. ERC-20 代币是什么?
ERC-20 是 以太坊标准代币协议 ,适用于 DApp、DeFi、ICO 等应用 。
它定义了一些标准函数,例如:
totalSupply()
👉 代币总供应量balanceOf(address)
👉 查询地址余额transfer(address, amount)
👉 代币转账approve()
&transferFrom()
👉 允许代理转账(如 DEX、质押)
✅ ERC-20 适用于创建自己的 Token,如 USDT、UNI、SHIBA。
📌 2. 编写 ERC-20 代币智能合约
创建 MyToken.sol
,粘贴以下代码:
// 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 * (10 ** uint256(decimals())));
}
}
🔹 代码解析
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
👉 使用 OpenZeppelin ERC-20 标准库ERC20("MyToken", "MTK")
👉 代币名称MyToken
,符号MTK
_mint(msg.sender, initialSupply * (10 ** uint256(decimals())));
👉 生成initialSupply
数量的代币
📌 3. 在 Remix IDE 部署(测试网 & 主网)
✅ 方法 1:本地测试(免费)
- 打开 Remix IDE
- 新建
MyToken.sol
,粘贴 Solidity 代码 - 编译合约
- 选择
Solidity Compiler
(🛠️) - 版本
0.8.0+
- 点击
Compile
- 选择
- 部署合约
- 选择
"JavaScript VM (London)"
(本地虚拟机,免费) - 输入初始供应量 (如
1000000
) - 点击
"Deploy"
- 选择
- 测试代币
- 运行
totalSupply()
,查看总供应量 - 运行
balanceOf(你的地址)
,查看余额
- 运行
✅ 本地测试,不消耗 ETH!
✅ 方法 2:以太坊测试网(Goerli / Sepolia)
- 获取测试 ETH
- MetaMask 连接测试网
- 切换到 Goerli / Sepolia
- 在 Remix 选择 Injected Provider
- 选择
Injected Provider - MetaMask
- 点击
Deploy
- MetaMask 确认交易
- 选择
- 获取代币地址
- 在 Remix 终端找到合约地址
- 添加到 MetaMask,查看你的代币
✅ 测试网部署,使用测试 ETH,完全免费!
✅ 方法 3:以太坊主网 / BNB / Polygon(需要 ETH 交 Gas 费)
- 准备 ETH / BNB / MATIC
- 以太坊(Ethereum):需要 ETH
- BNB Chain(BSC):需要 BNB
- Polygon(MATIC):需要 MATIC
- 选择
Injected Provider
- 连接 MetaMask(主网)
- 部署合约
Deploy
合约(需要 Gas 费)- 交易完成后,查看合约地址
- 添加代币到 MetaMask
- 复制合约地址
- 在 MetaMask "导入代币" 并粘贴地址
- 你的代币将出现在 MetaMask 钱包中
✅ 适用于正式上线,但需要真 ETH / BNB!
📌 4. 交互 & 空投代币
如果你想给别人发送你的代币 ,可以调用 transfer()
:
contract MyToken is ERC20 {
constructor(uint256 initialSupply) ERC20("MyToken", "MTK") {
_mint(msg.sender, initialSupply * (10 ** uint256(decimals())));
}
// 空投代币
function airdrop(address recipient, uint256 amount) public {
require(balanceOf(msg.sender) >= amount, "Not enough tokens");
_transfer(msg.sender, recipient, amount);
}
}
调用:
await contract.airdrop("0xRecipientAddress", ethers.utils.parseUnits("100", 18));
方式 | 环境 | 是否收费 |
---|
|--------------------|---------------|----------|
| 本地测试(Remix VM) | JavaScript VM | 免费 ✅ |
|------------------------------|-----|-------------------|
| 以太坊测试网(Goerli / Sepolia) | 测试网 | 免费(需测试 ETH) ✅ |
|---------------------------|-------|----------------------------|
| 以太坊主网 / BSC / Polygon | 真实区块链 | 需要 ETH / BNB 交 Gas 费 ❌ |