ERC-20、BEP-20、TRC-20 三套标准规定的东西大同小异:怎么查余额,怎么转账,怎么授权别人替你动用一部分代币。Solana 的代币程序多管了一层,把增发权和冻结权写成账户里有名有姓的字段。这些规则让钱包知道该怎么和一个代币打交道,却不会让不同链上同名的代币变成同一样东西,也说明不了它背后有没有资产。具体到某一个代币,还得去看那份合约或那个铸币账户本身。
ERC-20 的九个函数,三个可以不实现
ERC-20 的规范文件叫 EIP-20,作者是 Fabian Vogelsteller 和 Vitalik Buterin,2015 年 11 月 19 日创建,状态早已是 Final(定稿)。整份规范的摘要只有五个英文单词:“A standard interface for tokens”,代币的标准接口。正文列了九个方法、两个事件,别的一概没写。
必须实现的方法有六个。totalSupply() 返回代币总供应量,balanceOf(_owner) 返回某个账户的余额,transfer 负责转账并且必须触发 Transfer 事件。transferFrom 是替别人转账,规范要求:除非那个账户「通过某种机制有意授权了消息的发送者」,否则这次调用应当抛出异常。approve 给这种授权设一个额度,allowance 查额度还剩多少。(本页规范引文均由本站从英文原文译出。)
剩下的 name、symbol、decimals 被标成 OPTIONAL,即可选。规范还特意补了一句:界面和其他合约「绝不能指望这些值存在」。习惯了「代币总得报得出自己叫什么」的人,读到这里多半会愣一下。顺着推下去:一个完全合规的 ERC-20 代币可以不提供代币符号;某个界面若给它显示了符号,那个符号是从合约之外的地方查来的。
还有两段说明是写给开发者的,却直接决定持币人在屏幕上看到什么。一段要求调用方「必须处理返回 false 的情况」,「不得假设永远不会返回 false」——转账失败时,合约可能不报错、不回滚,只是安静地交回一个 false。另一段在 approve 条目下:重复调用会覆盖先前的额度,建议客户端给同一个花费方设新额度前,先把额度归零。钱包里弹出的那个授权确认框,背后的规矩就写在这两段里。
谁能增发、总量封不封顶、按什么节奏发行、管理员是谁,ERC-20 一个字都没提。发行方随时能继续增发的代币,和增发功能已被永久关掉的代币,可以把那六个必需方法实现得一模一样。想分清两者,只能去读合约代码,读供应与发行表那一篇就从这一步讲起。
BEP-20 和 ERC-20 差在哪
BNB 智能链的代币标准 BEP-20 从 ERC-20 派生而来,文件里至今留着在 BNB Beacon Chain 与 BNB 智能链之间转移代币的说法。那套机制已经退役:BNB Chain Fusion 文档确认 Beacon Chain 已于 2024 年 12 月关停,这段文字描述的不是今天还能走的路线。九个方法、两个事件按原来的顺序排下来,多数条目连措辞都和 ERC-20 一样。
改动集中在两处。头一处:ERC-20 里可选的 symbol 和 decimals,到 BEP-20 变成必须实现,name 依旧可选。文件拿当年的跨链机制来解释这两项为什么必填。有没有这两个字段,都证明不了代币有没有背书、安不安全。
第二处在 totalSupply。规范要求接入过原 Beacon Chain 跨链通道的代币,报告两条链合计的流通量。这是历史条款,不能据此认定现在哪份合约真在报合并后的数字。区块浏览器和行情聚合网站上的供应量对不上,先看链上部署的合约,再分别查每家数据方对这个数的定义。BNB 那份档案追的正是这条链自己的供应数据怎么算出来。
标准文件自己也会改。2025 年 2 月 12 日,维护者合并了删除 getOwner 的修改,理由是它在 Beacon Chain 上的绑定用途已经过时。早先的版本要求实现这个函数,文件里删掉它,已部署合约里的 getOwner 并不会跟着消失。引用一份标准,光注出处不够,还得写明是哪个版本。
TRC-20 兼容 ERC-20,费用却走能量和带宽
波场开发者文档把 TRC-20 称为它的同质化代币标准,在接口层面与 ERC-20 兼容。实现了规定的函数和事件,软件就能对接这个代币;钱包收不收录、交易所上不上、哪条充值通道支持,则是另外的事,兼容性担保不了。文档还提到字节码层面的兼容,说大多数用 Solidity 写的 ERC-20 代码只要很少改动就能部署。读代币信息和余额,用的还是那几个熟面孔:name()、symbol()、decimals()、totalSupply()、balanceOf()。
调用一样,底下跑的机器不一样。部署一个 TRC-20 代币要花 TRX,花多少由一个以 sun 为单位的 fee_limit 封顶,实际按能量消耗扣除;转账消耗的是这条链的能量和带宽资源,不是以太坊那种按价格出价的 gas。波场转账为什么看起来不要钱,波场 TRX 那份档案专门拆过;几条链的收费方式并排放在费用模型对照表里。
波场文档的要点列表里有一条不起眼的话:decimals「通常是 6 或 18,由合约声明」。链上记的代币数量全是整数。同一个整数 1000000,按 6 位小数读是整整 1 枚,按 18 位读只有 0.000000000001 枚。区块浏览器会先读 decimals() 再替你换算;跳过这一步的东西,比如随手写的脚本、复制来的接口返回值、原始调用结果的截图,都可能差出一万亿倍,而屏幕上的每一位数字本身都没有错。
Solana 的 SPL 代币:规则放在共用程序里
到了 Solana,做法差得够远,再和前面三套逐条比就不太对等了。那里的代币不是一个个单独部署的合约。官方文档的说法是:代币是归代币程序(Token Program)所有的数据账户,处理指令的逻辑在程序里,不在每个代币里。目前在用的程序有两个,一个是最早的 Token Program,文档称它不可更改、使用广泛;另一个是代币扩展程序,即 Token-2022。
识别一个代币,看它的铸币账户(Mint Account)地址,文档称之为该代币的全局计数器。这个账户的字段一句话就能列完:供应量、小数位、增发权限(mint authority)、冻结权限(freeze authority),外加一个是否已初始化的标记。程序源码在增发权限字段旁的注释把后果说得很直接:「如果没有增发权限,这个铸币账户的供应量就是固定的,不能再铸造新的代币。」冻结权限则定义为:有权冻结某个代币账户里的代币、让它们无法转账或销毁的那个账户。
在另外三条链上,这类权力可以写进发行方自己编的合约代码,得一行行去找。Solana 把增发权和冻结权放进有名字的字段,区块浏览器直接读得出来。增发权限为空,能确定的只是不会再有新币铸出;持币人照样可以销毁手里的币,供应量还会往下走。用 Token-2022 发的代币,还要看它开了哪些扩展、有没有带来额外的权力,比如永久委托(permanent delegate)。
账户模型也让持币人多了一道手续。持有某个代币,得先有一个专门对应这个铸币账户的代币账户(Token Account),最常见的是关联代币账户(Associated Token Account,简称 ATA),地址由持有人地址和铸币地址推导而来。照文档原话,创建它「需要为账户存储缴纳一笔可退还的最低余额」,由付这条指令费用的一方出钱,哪怕账户最后归另一个钱包所有。所以在 Solana 上第一次接收某个代币,币还没到,可能就先有一笔小额押金要付。当前具体是多少、Token-2022 账户体积不同会差多少,文档指向它自己的 ATA 费用页面。
Token-2022 在此之上加了一层可选功能,叫扩展(extension),每个扩展都给铸币账户或代币账户添一些状态。公开的枚举里能看到转账手续费配置、新账户的默认状态、不可转让、永久委托、转账钩子等。打算碰这类代币,有两点值得记住:大多数扩展在账户初始化之后就加不上了,等于发行方在创建那一刻已经选定;有些组合会被直接拒绝,文档举的例子是「不可转让」和「转账手续费配置」,两者的行为互相冲突。能做什么,开头就定了,之后谁都能查。
同一个代币代码挂在两条链上,账本是两本
四份规范摆在一起,能推出一个很实在的结论。一个资产同时出现在两条链上,实际上是两次部署:两份合约或两个铸币账户,两个供应数字,两套权限,两份交易历史。ERC-20、BEP-20、TRC-20 和代币程序里,没有哪一条把它们连起来。连起来的,要么是两边都铸币、自己对账的发行方,要么是一座跨链桥,一边锁住原资产、一边流通替身,包装代币那一篇把这种安排拆开讲过。四份文件里,唯一承认还有「另一本账」的,就是 BEP-20 那句跨链供应量的话。
因此,充值页面上选哪个网络,决定的是这笔转账落进哪一次部署。地址格式透露的信息,比旁边印着的代币代码多。凭地址格式能推断到什么程度,见地址格式对照表。
有四个问题,标准名称答不了,只能拿这个代币自己的证据来答:现在谁握着增发权;合约或程序能不能升级;谁能冻结或扣走余额;一枚代币背后是什么。前三个去看部署的代码、权限字段、启用的扩展和升级控制。第四个可能是链上抵押品,也可能是链下储备,或者两样都有,稳定币靠什么背书那一篇讲了怎么查。代币标准这个标签描述的是「接口应该长什么样」,光凭它,既证明不了代币真的合规,也证明不了它安全。
主要出处
- EIP-20:代币标准,方法列表,
name、symbol、decimals的 OPTIONAL 标注,返回 false 与授权额度的两段说明,作者及 2015 年的创建日期。 - BEP-20:BNB 智能链上的代币,从 ERC-20 派生的说明,必须实现的
symbol和decimals,totalSupply的跨链表述,以及 2025 年 2 月删除 getOwner 的提交。 - 波场开发者文档 TRC-20 页,接口与字节码兼容、小数位通常为 6 或 18 的说明、以 TRX 支付的部署费用。兼容不代表会被收录或支持充值。
- Solana 代币与代币账户文档,两个代币程序、铸币账户字段及其源码注释、关联代币账户的押金;Token-2022 的扩展列表以及添加时机和组合限制,见扩展页。
- ethereum.org 中文文档「ERC-20 代币标准」,即本页封面截图的来源。
上面的规范原文于 2026 年 10 月读取。标准文件是会被改的,本页里那条被删掉的 getOwner 就是现成的例子,所以一段引文对应的只是某一个版本。一个具体代币部署在链上的代码,比它声称遵循的任何标准都更算数;合约和文件对不上时,持币人真正面对的是合约。