什么是“代币”?
在以太坊区块链上,代币 token 可以表示几乎所有虚拟或现实中的事物:
- 游戏中的角色技能点
- 社交平台的声誉积分
- 公司股票、美元法币或一块黄金的所有权映射
- 更多仍在诞生的细分应用场景
既然用途如此广泛,一套简洁、统一的代币标准便显得格外重要。ERC-20 正是为此而生,它让成千上万的不同项目可以实现跨钱包、跨交易所、跨应用的互通互认,极大降低了开发、集成与交易成本。
什么是 ERC-20?
ERC-20(Ethereum Request for Comments #20)是 Fabian Vogelsteller 于 2015 年 11 月提出的 同质化代币标准。
关键词:同质化意味着 1 个 TokenA 无论流转到哪里,其价值与属性始终等于另 1 个 TokenA,就像 1 ETH 永远等于 1 ETH。借助这一特性,开发者可以轻松发行、转账、销毁资产,同时保证与任何支持 ERC-20 的钱包或协议天然兼容。
开始前你需要掌握
- 以太坊 账户与地址 的工作方式
- 智能合约 的部署与调用逻辑
- 其它 Token 标准(ERC-721、ERC-1155 等)可以稍后再深入
ERC-20 内含的核心功能
| 维度 | 关键动词 | 开发者视角 | 用户视角 |
|---|---|---|---|
| 转账 | transfer / transferFrom |
调用合约写入交易 | 钱包点击“发送”即完成 |
| 余额 | balanceOf |
读链上存储插槽 | 看到“可用余额” |
| 总量 | totalSupply |
发行时写入初始值 | 实时查看通胀/通缩 |
| 批准 | approve & allowance |
授权 DEX 代表用户操作 | 一键把额度交给 Uniswap |
当任意智能合约完整地实现上述方法与事件(Event),它即可被称为 ERC-20 合约。链上所有 DApp 随后只需读取同一份 ABI 接口说明,就能和这款新代币“开箱即用”。
一段最小可运行的 Python 范例
下面用 Web3.py 查询 DAI 与 WETH 的 总发行量 和 指定地址余额,仅用到极简 ABI。
from web3 import Web3
w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
dai_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F"
weth_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
test_acc = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11"
mini_abi = [
{"inputs":[{"name":"account","type":"address"}], "name":"balanceOf",
"outputs":[{"type":"uint256"}], "stateMutability":"view", "type":"function"},
{"inputs":[],"name":"decimals","outputs":[{"type":"uint8"}],"stateMutability":"view","type":"function"},
{"inputs":[],"name":"symbol","outputs":[{"type":"string"}],"stateMutability":"view","type":"function"},
{"inputs":[],"name":"totalSupply","outputs":[{"type":"uint256"}],"stateMutability":"view","type":"function"},
]
for addr,name in [(dai_addr,"DAI"),(weth_addr,"WETH")]:
contract = w3.eth.contract(address=addr, abi=mini_abi)
symbol = contract.functions.symbol().call()
decimals = contract.functions.decimals().call()
supply = contract.functions.totalSupply().call() / 10**decimals
balance = contract.functions.balanceOf(test_acc).call() / 10**decimals
print(f"===== {symbol} =====")
print("Total Supply:", supply)
print("Address Balance:", balance)
两行命令即可复刻此脚本,窥见链上实时数据流。
已知缺陷:代币“打黑洞”风险
由于 ERC-20 的底层设计最早期只为“人与人之间的转账”考虑,当用户把代币 误发到某个合约地址 而非钱包地址,且该合约 没有实现自主接收代币的函数 时,这些代币将被永久锁定,任何人都无法提出。
用日常场景比喻:就像快递默认寄到“公共收件箱”,但当这边没有钥匙和签收人,包裹就再也回不来。
这就是为何社区后续又提出 ERC-223、ERC-777 等改进标准,为合约加入 onTokenReceived 回调或 Hook 机制。
FAQ:开发者与用户高频疑问
Q1:我可以把任何代币改为 ERC-20 吗?
A1:可以,但必须重新部署合约或迁移资产。现有智能合约逻辑无法用“补丁”升级为 ERC-20。
Q2:为什么有些代币发行量无限大?
A2:totalSupply 只是返回一个数字,项目方可在合约里用函数随时增删,这样的机制被称为“可铸造”“可销毁”或“动态供应”。
Q3:在交易所看到 Token 同名怎么办?
A3:以 合约地址 为准。同名不等于同质,肉眼无法分辨时必须核对地址再操作。
Q4:我能一次性撤回 approve 的额度吗?
A4:把额度改为 0 即可撤销授权,大多数钱包现在提供“一键取消授权”按钮。
Q5:gas 费为什么时高时低?
A5:网络拥堵与 BaseFee 友好竞争出价导致。可换用 Layer2 或通过优化签名时段降低。
扩展阅读 & 替代标准
- EIP-20:https://eips.ethereum.org/EIPS/eip-20
- OpenZeppelin 合约实现:https://github.com/OpenZeppelin/openzeppelin-contracts
ERC-223:原生防“黑洞”的转账回调机制ERC-777:高级 Hook 与发送者/接收者通知ERC-4626:把收益农场产品的“份额”标准化,用于 DeFi 金库
在区块链快速发展的年代,ERC-20 既是一座坚实的地基,也是一扇探索无限可能的门。读完此文,你已拥有深入探索任何新型代币机制的钥匙。祝编码顺利,理性投资。