ERC20 是以太坊上最流行的代币标准,它定义了创建和发行同质化代币的通用规则。本文将带你深入了解 ERC20 标准,并逐步指导你创建和部署自己的代币。
什么是 ERC20 代币标准?
ERC20 标准由 Fabian Vogelsteller 于 2015 年 11 月提出,作为以太坊意见征求提案(ERC)。该提案被自动分配了 GitHub 议题编号 20,因此得名“ERC20”。如今绝大多数以太坊代币都基于这一标准。
ERC20 标准定义了同质化代币的规范,意味着每个代币单位都是可互换的,没有独特属性。该标准提供了一套通用接口,确保所有兼容代币都能以相同方式被访问和使用。
核心功能与事件
每个 ERC20 代币合约必须实现以下函数和事件:
- totalSupply:返回当前存在的代币总量
- balanceOf:查询指定地址的代币余额
- transfer:向指定地址转移代币
- transferFrom:从授权账户向接收账户转移代币
- approve:授权另一地址使用特定数量的代币
- allowance:查询所有者授权给使用者的剩余代币数量
- Transfer 事件:当代币转移成功时触发
- Approval 事件:当授权成功时记录
可选功能
- name:返回代币的人类可读名称(如“US Dollars”)
- symbol:返回代币的符号(如“USD”)
- decimals:返回代币使用的小数位数
ERC20 数据结构与工作流程
数据映射结构
ERC20 合约使用两个主要数据映射结构:
mapping(address => uint256) balances; // 余额跟踪
mapping(address => mapping(address => uint256)) public allowed; // 授权跟踪两种转移工作流程
ERC20 支持两种代币转移方式:
- 直接转移:使用
transfer函数直接向接收地址发送代币,适合钱包之间的简单转账 - 授权转移:先使用
approve授权,再通过transferFrom执行转移,适合智能合约自动化分发代币
创建自己的 ERC20 代币
现在让我们实际创建一个名为“Mastering Ethereum Token”(MET)的代币。
开发环境设置
首先确保已安装 Node.js 和 Truffle 框架:
npm install -g truffle创建项目目录并初始化:
mkdir METoken
cd METoken
truffle init
npm init安装依赖库
我们将使用 OpenZeppelin 库来确保代币的安全性:
npm install openzeppelin-solidity编写代币合约
创建 METoken.sol 文件,继承 OpenZeppelin 的 StandardToken:
pragma solidity ^0.4.23;
import "openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol";
contract METoken is StandardToken {
string public name = "Mastering Ethereum Token";
string public symbol = "MET";
uint8 public decimals = 2;
uint256 public initialSupply = 2100000000; // 2100 万枚,精度为 2
constructor() public {
totalSupply_ = initialSupply;
balances[msg.sender] = initialSupply;
}
}编译与部署
编译合约:
truffle compile创建部署脚本后,在 Ganache 本地网络上部署:
truffle migrate --network ganache测试代币功能
使用 Truffle 控制台与合约交互:
// 查询总供应量
METoken.deployed().then(instance => instance.totalSupply())
// 检查账户余额
METoken.deployed().then(instance =>
{ instance.balanceOf(accounts[0]).then(console.log) })
// 转移代币
METoken.deployed().then(instance =>
{ instance.transfer(accounts[1], 100000) })ERC20 代币的注意事项
避免常见错误
- 不要向合约地址发送代币:除非合约明确支持 ERC20,否则代币将永久丢失
- 保留足够的 ETH 支付 gas:代币交易仍需 ETH 支付网络费用
- 注意小数精度:转移时代币数量应考虑小数位数
安全最佳实践
- 使用经过审计的库如 OpenZeppelin
- 充分测试所有代币功能
- 考虑实现代币回收机制
- 提供清晰的用户文档
常见问题
ERC20 代币与以太币有什么区别?
ERC20 代币是在以太坊区块链上运行的智能合约,而以太币是网络的原生加密货币。代币转移发生在合约内部状态中,而以太币转移直接改变账户余额。
创建 ERC20 代币需要多少成本?
成本取决于网络拥堵程度和合约复杂性。主要包括部署合约的 gas 费用,通常在几十到几百美元不等。
为什么需要 approve 和 transferFrom 两种操作?
这种两步骤流程允许代币所有者授权第三方(如交易所或智能合约)在特定限额内管理其代币,增加了灵活性和安全性。
如果代币发送到错误地址怎么办?
如果发送到普通以太坊地址,可能还可以联系接收方退回。但如果发送到不支持 ERC20 的合约地址,代币很可能永久丢失。
如何让钱包显示我的代币?
大多数钱包支持“添加代币”功能,需要输入合约地址、符号和小数位数。用户添加后即可在钱包中查看余额。
ERC20 有哪些替代标准?
其他流行标准包括 ERC721(非同质化代币)、ERC1155(多代币标准)和 ERC777(增强型代币标准),各针对不同用例设计。
总结
创建和部署 ERC20 代币是一个 straightforward 的过程,但需要仔细注意细节和安全考虑。通过使用 OpenZeppelin 等经过审计的库和 Truffle 开发框架,开发者可以快速启动代币项目。记住始终在测试网络上充分测试,确保了解所有功能后再部署到主网。
随着区块链技术的不断发展,ERC20 标准继续成为代币发行的基石,为去中心化应用和数字资产提供了可靠的基础设施。