代币标准详解:ERC-20、ERC-721、ERC-1155 等
面向开发者的代币标准详解:ERC-20、ERC-721、ERC-1155、TRC-20 和 SPL 的定义、小数位工作原理,以及集成前需检查的关键点。

代币标准是一份已发布的规范,它告诉代币合约要暴露哪些函数、要触发哪些事件。钱包、交易所和应用程序随后无需为每个代币编写定制代码,即可处理任何合规代币。本指南涵盖您最常遇到的标准(ERC-20、ERC-721、ERC-1155 及其在 Tron 和 Solana 上的对应标准)。同时也涵盖 ERC-20 decimals(精度)的工作原理,以及在将代币集成到支付流程前需要检查的事项。
TL;DR
- 代币标准定义了一个接口(函数和事件)加上行为规则,使软件能以相同方式与任何合规代币交互。
- ERC-20 用于同质化代币,ERC-721 用于唯一 NFT,ERC-1155 用于在一个合约中管理多种代币类型。
- TRC-20 在 Tron 上镜像 ERC-20,而 Solana 使用其自身的 SPL 代币程序,因此“相同标准”绝不意味着“相同链”。
- 链上金额为整数。可选的
decimals值告诉您在显示时将小数点放在何处。 - 合规性无法保证。在依赖某代币前,请测试其真实行为。
目录
- 代币标准实际上定义了什么
- ERC-20:同质化代币标准
- ERC-20 decimals:正确处理金额
- ERC-721:非同质化代币
- ERC-1155:一个合约管理多种代币类型
- 对比三大以太坊标准
- 其他链上的代币标准
- 集成代币前要检查的事项
- 视角:为什么标准只是完成了一半工作
- 结合 Chaingateway 让标准落地
- 常见问题
- 来源
代币标准实际上定义了什么
代币不是原生币。它是智能合约内部保存的一条记录:谁持有多少,以及移动它遵循什么规则。若无共享规范,每个代币都会暴露自己的函数名称,每个钱包都需要定制代码来读取余额或发送转账。
标准解决了这个问题。根据 ethereum.org 的代币标准页面,标准定义了代币的行为和交互方式,这使智能契约保持可组合性,并让新代币能与现有的去中心化交易所和应用程序协同工作。NIST 的代币设计概述 将 ERC 描述为提供函数和事件声明、约束与要求,有时还提供参考实现。
在实践中,一个标准为您提供四样东西:
- 可调用函数,例如读取余额或移动代币。
- 事件,合约触发这些事件以便外部软件跟踪活动。
- 数据类型和约束,例如金额如何表示。
- 行为要求,例如哪些调用必须触发哪些事件。
在以太坊上,这些规范以 ERC 的形式提出,属于以太坊改进提案的应用层类别。其他链有自己的流程和名称,但核心思想是相通的。
ERC-20:同质化代币标准
ERC-20 创建于 2015 年,定义了智能合约中代币的标准 API,以便钱包和去中心化交易所复用。“同质化” 意味着每个单位都可与其他单位互换,就像美元或公斤黄金。稳定币、治理代币和大多数支付代币都遵循该标准。
ERC-20 文档中列出的接口包括:
| 函数或事件 | 作用 |
|---|---|
totalSupply | 返回存在的代币总数 |
balanceOf | 返回某地址的余额 |
transfer | 从调用者向另一地址转移代币 |
approve | 允许另一地址(花费者)动用最多设定数量的你的代币 |
allowance | 返回花费者仍可代表所有者动用的数量 |
transferFrom | 利用授权,代表所有者转移代币 |
name、symbol、decimals | 描述性元数据,通常均存在 |
Transfer、Approval 事件 | 在转账和授权时触发 |
规范规定转账必须触发 Transfer 事件,成功的 approve 调用必须触发 Approval。这一规则使得支付检测成为可能:你可以监听事件,而无需轮询每个地址。我们在ERC-20 Transfer 事件指南中深入探讨了这一点,ERC-20 标准概览则演示了完整接口。
approve 和 transferFrom 模式
这种两步模式容易让新手困惑。使用 transfer 时,代币持有者直接发送代币。使用 approve 加 transferFrom 时,持有者先授权花费者,花费者稍后再拉取代币。这是去中心化交易所或订阅合约在不持有你私钥的情况下收款的方式。如果你只需从自己控制的钱包发送代币,transfer 就足够了。我们在如何发送 ERC-20 代币演示中对比了钱包、代码和 API 方法。
ERC-20 decimals:正确处理金额
智能合约不存储小数。所有余额均为整数,decimals 告诉你最右侧多少位是小数部分。ERC-20 规范将该方法设为可选,并给出示例:若为 8 位小数,将代币数量除以 100000000 即可得到用户可见的表示。
这有三个实际影响。
始终从合约读取 decimals。 不要为所有代币硬编码一个值。两个显示均为 “1.00” 的代币,其存储的整数可能截然不同。
使用整数或大数类型进行计算。 原始数量可能超过标准浮点数能精确表示的范围。请使用 BigInt、BigNumber 或你所用语言的十进制类型,仅在最后展示时格式化。
将缺失的 decimals 方法视为一种需要处理的情况。 由于该方法是可选的,合规代币可能不会暴露它。应决定一个回退方案,例如拒绝该代币或要求手动配置,而不是静默地假设一个默认值。
一个实际示例:一个拥有 6 位小数的代币显示原始余额为 2500000。除以 10^6 得到 2.5 个代币。要发送 0.75 个代币,您应提交 750000,而不是 0.75。错误地提交显示值会发送极微小的数量,而交易仍会成功。

ERC-721:非同质化代币
ERC-20 将每个单位视为相同,而 ERC-721 是非同质化代币的接口,例如独特的艺术品或歌曲。每个代币在其合约内都有一个唯一标识符,因此所有权是按代币跟踪的,而不是按余额。典型用例包括收藏品、门票、游戏道具和所有权证明。
权衡在于成本和复杂性。转移十个无关的 NFT 意味着十次单独的转账。有关接口详情,请参阅我们的 ERC-721 标准指南。
ERC-1155:一个合约中的多种代币类型
ERC-1155 是一种多代币接口。一个已部署的合约可以代表任意数量的同质化、非同质化或半同质化代币类型,每种类型由一个代币 ID 标识,并可拥有自己的元数据和供应量。该规范还支持在一次操作中转移多种代币类型。
这使其非常适合游戏场景,在游戏中,单个合约可能持有货币、一组消耗品和几个独特物品。您只需部署一次,即可批量移动资产,而无需针对每种资产类型发送一笔交易。
三大以太坊标准对比
| ERC-20 | ERC-721 | ERC-1155 | |
|---|---|---|---|
| 代币类型 | 同质化 | 非同质化 | 同质化、非同质化或半同质化 |
| 跟踪对象 | 每个地址的余额 | 每个代币 ID 的所有者 | 每个地址每个代币 ID 的余额 |
| 所需合约数 | 每种代币一个 | 每个系列一个 | 一个合约管理多种代币类型 |
| 批量转账 | 非标准组成部分 | 非标准组成部分 | 内置支持 |
| 典型用例 | 稳定币、支付和治理代币 | 收藏品、门票、独特资产 | 游戏、混合资产目录 |
其他链上的代币标准
名称因链而异,但核心理念保持不变。
Tron:TRC-20 和 TRC-10。 TRC-20 是 TRON 上的同质化代币标准,在接口层面与 ERC-20 兼容,因此大多数以太坊代币合约只需少量更改即可在 TRON 上运行。Tron 还拥有较旧的协议层标准 TRC-10。我们在 TRC-10 vs TRC-20 中解释了实际差异。
BNB Chain:BEP-20。 BEP-20 在 EVM 兼容链上遵循 ERC-20 模型,因此函数名称和事件结构看起来会很熟悉。
Solana:SPL 代币。 Solana 不会为每个代币部署新合约。代币通过共享的 SPL Token 程序创建,其中 NFT 就是用零位小数创建的代币。其思维模型与 Ethereum 不同,尽管互操作性的目标相同。
Cosmos 生态系统:CW20。 CW20 规范使用 Uint128 整数处理余额和转账,将小数处理留给 UI,这与 ERC-20 的整数与显示分离方式相同。
同名标准在不同链上永远不可互换。TRC-20 USDT 和 ERC-20 USDT 是不同网络上的不同资产,发送到错误网络可能导致资金丢失。请始终在数据模型中将地址与其网络配对。

集成代币前要检查什么
标准描述的是代币应该做什么,而不是每个已部署合约实际做什么。2022 年发表在 IET Software 上的一项研究指出,ERC-20 接口的歧义可能导致现实世界中的代币合约产生不同解释和合规漏洞。
ethereum.org 上的代币集成清单是一个很好的基准。它要求开发者审查:
- 标准函数的合规性和返回值,
- 可选函数和 decimals,
- 批准操作上的竞争条件缓解,
- 代币内部的外部调用,
- 转账时收取的费用或利息,
- 可升级性、铸造、暂停和黑名单权限,
- 所有者和团队风险,以及供应集中度。
对于支付产品,最常遇到的问题是转账手续费行为(收到金额少于发送金额)、黑名单(转账事后可被阻止)和非标准返回值。在测试网上用真实转账测试每个计划支持的代币,并根据实际收到的金额而非请求的金额记账入账。
视角:为什么标准只是完成了一半工作
标准解决了一个代币如何与一条链对话的问题。它们没有解决在多条链上运行产品的问题。如果你在 Ethereum、Tron 和 Solana 上接受支付,你仍然面临不同的地址格式、不同的费用模型、不同的事件结构和不同的节点基础设施。
我们围绕这一缺口构建了 Chaingateway。我们的观点是,开发者不应仅为了知道客户已付款而维护特定链的端点或运行自己的节点。这就是为什么我们返回预解码数据,使转账以可读字段而非原始日志主题的形式到达,以及为什么我们自动估算 gas。我们用 HMAC 对 webhook 请求签名,以便你的后端验证支付通知是真实的。
给初创团队的建议:选择与你的资产匹配的标准(同质化、唯一或混合),每次都从合约读取 decimals,并基于事件而非轮询构建支付检测。其余都是管道工作,而管道工作正是 API 应该吸收的。
— Bitblade
结合 Chaingateway 让标准落地
如果您正在基于这些标准构建支付或钱包,我们的区块链 API 为您提供了一个统一的 REST 接口,用于创建钱包、发送代币和 NFT 转账、获取解码后的交易数据以及跨以太坊、比特币、波场、Solana、Polygon、BNB Chain 和 Arbitrum 估算费用。它支持主流代币标准,包括 ERC-20、BEP-20、TRC-20 和 ERC-721。Chaingateway Webhooks 会在收到付款时推送实时通知,因此您无需轮询。

套餐起价为 Plus 版每月 49 欧元,Pro 版每月 99 欧元,Premium 版每月 249 欧元,Enterprise 版每月 499 欧元。年付价格分别为 490 欧元、990 欧元、2,490 欧元和 4,990 欧元。请查看定价页面了解每个套餐包含的内容。针对以太坊,我们的以太坊 API 展示了如何通过 REST 发送 ERC-20 代币,而无需使用 web3.js。
常见问题
代币和币有什么区别?
币(如 ETH)是其区块链的原生资产,用于支付交易费用。代币是由遵循标准的智能合约创建的,并运行在该链之上。移动代币时您仍需原生币支付 Gas,这在我们的以太坊概览中有介绍。
ERC-20 中的 decimals 函数是必须的吗?
不是。ERC-20 规范将其标记为可选。大多数代币都实现了它,但您的代码应处理其缺失的情况,而不应假设默认值。
我可以对 ERC-20 和 BEP-20 代币使用同一个地址吗?
两条链使用相同的地址格式,因此同一个地址可以同时存在于两条链上,但余额是分开的。发送到错误网络的资金不会出现在另一条链上。我们的ERC-20 地址指南解释了该格式及如何读取余额。
发行新代币应使用哪个标准?
对于可互换的单位(如支付或实用代币),请使用 ERC-20(或其 TRC-20、BEP-20 对应标准)。当每个物品必须唯一时使用 ERC-721,当一个合约需要管理多种资产时使用 ERC-1155。请先选择链,因为每条链的工具和费用会影响选择。
来源
- Token Standards, ethereum.org
- Ethereum Development Standards, ethereum.org
- ERC-20 Token Standard, ethereum.org
- ERC-20: Token Standard, EIP-20
- ERC-1155: Multi Token Standard, EIP-1155
- Token integration checklist, ethereum.org
- Blockchain Networks: Token Design and Management Overview, NIST
- Conformance evaluation of the top-100 Ethereum token smart contracts, IET Software
- TRC-20 fungible token standard, TRON developer docs
- Token, Solana SPL documentation
- CW20 specification, CosmWasm
推荐阅读
准备好自己动手构建了吗? 获取你的 API key — 7 天试用,无需信用卡 — 或查看 区块链 API 获取完整的 endpoint 参考。