一文读懂 ERC-20:以太坊最主流的代币标准

Posted by PDQ881 加密视角 on September 5, 2025

什么是“代币”?

在以太坊区块链上,代币 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 既是一座坚实的地基,也是一扇探索无限可能的门。读完此文,你已拥有深入探索任何新型代币机制的钥匙。祝编码顺利,理性投资。