在区块链的世界里,代币(Token)是构建去中心化应用(DApps)、进行社区融资和实现数字资产化的重要工具,以太坊作为最智能合约平台,其上发行的代币大多遵循ERC20标准,本文将带你一步步了解如何编写一个基础的ETH发币合约(即ERC20代币合约)。
什么是ERC20标准
ERC20是以太坊社区提出的一个代币标准接口(Interface),它定义了一套规则和函数,使得所有遵循该标准的代币都能在以太坊生态中无缝兼容,比如支持主流的钱包(MetaMask)、交易所等,主要包括以下核心函数和事件:
- 函数 (Functions):
name(): 返回代币名称,"MyToken"。symbol(): 返回代币符号,"MTK"。decimals(): 返回代币小数位数,通常为18。totalSupply(): 返回代币总供应量。balanceOf(address owner): 查询指定地址的代币余额。transfer(address to, uint256 amount): 转代币到指定地址。transferFrom(address from, address to, uint256 amount): 从指定地址转代币到另一地址(通常需要授权)。approve(address spender, uint256 amount): 授权某个地址可以花费你的代币。allowance(address owner, address spender): 查询某个地址被授权花费的代币数量。
- 事件 (Events):
Transfer(address indexed from, address indexed to, uint256 value): 代币转移事件。Approval(address indexed owner, address indexed spender, uint256 value): 授权事件。
准备工作:开发环境搭建
在编写合约之前,你需要准备以下工具和环境:
- Solidity 编译器:Solidity是以太坊智能合约的编程语言,你可以使用 Remix IDE(在线,无需安装)或本地安装
solc(Solidity Compiler)。 - 以太坊钱包:如MetaMask,用于测试和部署合约,以及管理私钥。
- 测试网ETH:在以太坊测试网(如Ropsten, Goerli, Sepolia)上部署合约需要消耗ETH作为Gas费,你可以通过水龙头(Faucet)获取测试网ETH。
- 文本编辑器:如VS Code,配合Solidity插件(如Hardhat或Truffle的插件)能提供更好的开发体验。
对于初学者,Remix IDE 是最友好的选择,它集成了编译、部署、测试等功能。
编写一个简单的ERC20代币合约
下面是一个基于OpenZeppelin库的ERC20代币合约示例,OpenZeppelin是一个提供安全、可审计的智能合约库的社区,强烈建议在实际开发中使用,以避免安全漏洞。
步骤1:在Remix IDE中创建新文件
打开Remix IDE,点击左侧文件图标,创建一个新文件,MyToken.sol。
步骤2:编写合约代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor(string memory name, string memory symbol) ERC20(name, symbol) {
// 在部署时向合约创建者(msg.sender)发行100万个代币
// 假设小数位数为18,所以100万 * (10 ** 18) = 1000000 * 10^18
_mint(msg.sender, 1000000 * 10**decimals());
}
}
代码解析:
// SPDX-License-Identifier: MIT:指定Solidity文件的许可证标识符,MIT是常用的开源许可证。pragma solidity ^0.8.20;:指定Solidity编译器版本,^0.8.20表示使用0.8.20到0.9.0(不含0.9.0)之间的版本。import "@openzeppelin/contracts/token/ERC20/ERC20.sol";:导入OpenZeppelin的ERC20标准合约,在Remix中,你可以通过"File Explorers"下的"Import"按钮搜索并导入,或者直接使用这个路径(确保Remix配置了合适的npm包源)。contract MyToken is ERC20 { ... }:定义一个名为MyToken的合约,它继承自OpenZeppelin的ERC20合约,因此自动获得了所有ERC20标准的实现。constructor(string memory name, string memory symbol) ERC20(name, symbol) { ... }:constructor是合约的构造函数,只在部署时执行一次。- 它接收两个参数:
name(代币名称)和symbol(代币符号)。 ERC20(name, symbol)调用父类(ERC20)的构造函数,初始化代币名称和符号。
_mint(msg.sender, 1000000 * 10**decimals());:_mint是ERC20合约中用于增发代币的内部函数。msg.sender是部署合约的地址,也就是合约的创建者。1000000 * 10**decimals()是发行的数量。decimals()返回ERC20默认的小数位数18,所以10**18相当于1个代币的最小单位(如1 ETH = 10^18 wei),这里发行了100万 * 10^18个最小单位,即100万个代币。
编译合约
- 在Remix IDE左侧,点击"Solidity Compiler"图标(第二个)。
- 确保编译器版本(如0.8.20)与你代码中的
pragma版本一致。 - 点击"Compile MyToken.sol"按钮,如果编译成功,会出现一个绿色的勾。

部署合约
- 在Remix IDE左侧,点击"Deploy & Run Transactions"图标(第三个,像以太坊的标志)。
- ENVIRONMENT:选择"Remix VM (Shanghai)" - 这是在Remix内置的模拟环境中部署,无需真实ETH,如果你想部署到真实测试网或主网,可以选择"Injected Provider - MetaMask",并确保MetaMask连接到对应的网络。
- CONTRACT:选择"MyToken - contracts/MyToken.sol"。
- DEPLOY:点击"Deploy"按钮。
- 如果使用的是"Remix VM",会直接部署成功,如果使用"MetaMask",MetaMask会弹窗确认交易,你需要支付Gas费,点击"Confirm"。
- 部署成功后,你可以在"Deployed Contracts"列表中看到你的
MyToken合约实例。
测试合约
部署成功后,你可以与合约进行交互测试:
- 查看代币信息:点击合约实例下的"name", "symbol", "decimals", "totalSupply"等按钮,查看返回值是否符合预期。
- 查看余额:点击"balanceOf",输入你的地址(如
msg.sender),查看你拥有的代币数量,应该是100万。 - 转账测试:
- 点击"transfer",输入接收地址和转账数量(注意数量是带小数的,比如转100个代币,输入
100 * 10**18或使用科学计数法1e26,因为decimals()是18,100 * 10^18 = 1e20,这里注意数量单位)。 - 点击"transact",MetaMask会弹出确认,确认后查看接收地址的余额是否增加。
- 点击"transfer",输入接收地址和转账数量(注意数量是带小数的,比如转100个代币,输入
- 授权和转账From测试:
- 你可以部署另一个地址(或在Remix中切换账户)。
- 首先在原地址(拥有代币的地址)调用"approve",授权给另一个地址一定的代币数量。
- 然后在另一个地址调用"transferFrom",从原地址转移代币到目标地址。
重要注意事项
- 安全性:永远不要直接在生产环境中使用未经审计的合约代码,即使是OpenZeppelin的合约,也要确保你理解其行为并根据你的需求正确使用,对于生产级代币,建议进行专业的安全审计。
- Gas费:在以太坊主网部署和执行合约操作都需要消耗ETH作为Gas费,测试网ETH没有实际价值,但部署过程与主网一致。
- 代币经济学:简单的增发合约可能不适合所有场景,如果需要更复杂的代币经济模型(如燃烧、锁