ERC-20是什么?代币合约、转账与授权机制一文详解
ERC-20是以太坊上最常见的同质化代币标准,同质化的意思很直接同一合约里发出的每一枚代币,面值和规则完全一样,可以像人民币纸币那样一枚换一枚,彼此没有编号、稀缺度或外观差别。

ERC-20不是某一种具体币,而是一份接口约定。谁按这份约定写合约,钱包、交易所、Defi协议就能用同一套方法识别余额、转账和授权,不用为每个项目单独适配,标准最初由Fabian Vogelsteller提出,现收录在以太坊官方文档与EIPs中,正式名称是Ethereum Request for Comments 20,运行在以太坊及兼容EVM的链上(如部分L2)。
咱们可以把它想成“插座规格”:电压、插孔形状统一了,各种电器才能通用,代币项目负责填具体参数(名字、符号、总量),ERC-20负责规定对外必须暴露哪些函数和事件。

代币合约里通常有什么
一个标准ERC-20合约,核心是账本加几组公开函数,账本用映射保存地址 → 余额,合约本身不“存硬币”,只记录谁有多少。
| 类别 | 名称 | 作用 |
|---|---|---|
| 元数据 | name/symbol/decimals | 全称、简称、小数位(多为18) |
| 供给 | totalSupply | 当前总发行量 |
| 查询 | balanceOf(address) | 查某地址余额 |
| 转账 | transfer/transferFrom | 自己转、或代别人转 |
| 授权 | approve/allowance | 授权额度与查询剩余额度 |
| 事件 | Transfer/Approval | 链上可索引的变动记录 |
decimals容易被忽略。链上实际按整数记账若decimals为18,界面上的1枚代币,合约里是10^18个最小单位。钱包展示时再除回去,所以你看到的“1 USDT”和合约里的大整数是同一笔钱的两种写法。
有的合约还会加mint(增发)、burn(销毁)、暂停交易、黑名单等,这些不属于ERC-20必选,是项目方扩展。读合约或审计报告时,要把“标准部分”和“额外权限”分开看。
转账机制怎么跑通
最简单的路径是transfer你调用自己的代币合约,填收款地址和数量,签名并支付Gas(用链的原生币,如ETH,不是用该代币付手续费),合约检查你的余额足够后,减少你的余额、增加对方余额,并触发Transfer事件。

流程有三步
●发起:钱包构造对代币合约的调用,而不是“把币寄到某个神秘地址”那么笼统。
●校验与改账:合约内更新两个地址的余额映射,失败就整笔回滚,不会扣一半。
●留痕:Transfer(from, to, value)被浏览器和钱包用来拼交易历史。
注意:转的是合约里的记账权利,不是把文件从你手机拷到别人手机。你向交易所“充值某ERC-20”,本质是transfer到交易所给出的充值地址,链上到账后,交易所才在自己的中心化数据库里给你加余额。
另一种是transferFrom调用方不是持币人本人,而是事先拿到额度的第三方(路由合约、交易所合约、清算合约等),没有足够allowance时,这笔代扣会直接失败,这把“自己转”和“允许别人按额度转”拆成了两套动作,也是Defi能组合乐高的基础。
授权(Approve)机制详解
授权解决的问题是:你不想每次操作都亲自点转账,又希望某个合约能在限额内动用你的币——比如把USDC交给DEX路由去换ETH,或存进借贷池。
典型两段
1.你对代币合约调用approve(spender, amount),声明“允许spender最多划走amount”。
2.之后spender再调transferFrom(你的地址, 目标, 实际数量),合约扣你的余额、加目标余额,并减少剩余allowance。
allowance(owner, spender)用来查询还剩多少额度,很多钱包会显示“无限授权”(把amount设成一个极大值),少点几次钱包确认,但风险是只要spender合约被盗或本身恶意,额度内的币都可能被转走。
授权相关的实用安全项
●授权对象是合约地址,不是“某个网页”,钓鱼站常诱导你对假spender授权,页面再漂亮也救不了链上已经写下的allowance。
●改授权不是“叠加心情”,而是写入新的额度。老实现里从非零改到另一个非零,曾有竞态问题,现代做法更稳妥的是先改为0再设新值,或使用increaseAllowance/decreaseAllowance一类扩展。
●授权≠转账完成。只approve成功,币还在你地址里,真正少币是后续transferFrom成功的那一刻。
●可随时收回:对同一spender再approve一个0,或用钱包的撤销授权功能,把额度清掉。
举一个日常场景:你在去中心化交易所用代币A换代币B。路由一般会先检查allowance,不够就弹出授权,授权确认后,同一笔或下一笔交易里路由执行transferFrom拉走A,再按价格给你B。你签的是两样东西——“允许拉”和“执行换”,不要混成一次“网站扣款”。
常见使用场景
稳定币、治理代币、游戏内流通integr、流动性池凭证(LP Token)、跨桥后的映射资产等,大量采用ERC-20。原因很务实生态工具链成熟——MetaMask一类钱包、区块浏览器、做市与借贷协议,都按这套接口集成。
● 从中心化交易所提币到自己钱包(链上出现一笔对你地址的Transfer)。
● 在DEX授权并兑换。
● 把币存进收益或借贷协议(本质仍是授权 + 转入合约)。
● 参与投票(有的项目用余额或快照,有的用单独的投票合约)。
安全提示
合约可以在transfer里加税、黑名单、后门增发,外表仍像ERC-20,认资产时要核对合约地址是否来自官方渠道,而不是只看名称符号——同名山寨合约非常常见。
●转错地址或转错链:ERC-20转账一旦确认,合约不会帮你“客服退款”,跨链要走桥或官方映射,不能只把币转到另一条链的同一字符串地址就完事。
●授权范围宜小:能按需额度就不要无脑无限额,不用的协议定期撤销。
●假代币、假授权弹窗:看清域名、合约地址和spender,硬件钱包更易核对明文。
●decimals与显示:有的山寨把decimals设得很怪,造成“余额特别大/特别小”的错觉,以合约与浏览器读数为准。
●Gas与失败:授权和转账都要耗原生币做Gas,余额不足、额度不足、合约暂停等会导致失败,失败通常不扣代币,仍可能损失Gas。
官方与可信入口方面,机制说明以ethereum.org开发者文档中的ERC-20词条,以及EIPs仓库中的EIP-20原文为准,具体某个代币的合约地址,应去该项目已验证的官网或主流浏览器(如Etherscan)的已验证合约页核对,而不是群文件或广告图。






