什么是 ERC-20?
ERC-20 是 Ethereum 的一种代币标准,为通过智能合约创建的同质化加密资产定义了通用接口。同质化意味着,根据代币合约的核算规则,同一种代币的等量单位可以互换。例如,普通 ERC-20 代币的一个完整单位与同种代币的另一个完整单位具有相同的合约定义属性。官方ERC-20 规范定义了用于查询代币供应量和余额、转移代币,以及授权第三方使用代币的函数。
该标准还定义了标准化事件,让钱包和应用能够观察转账和授权变更。ERC-20 是最终版 Ethereum 征求意见标准,也是 Ethereum 兼容生态中同质化代币的主要技术基础。该标准提高了互操作性,因为钱包、智能合约、区块链浏览器、托管系统和其他加密应用都可以通过相同的基本方法处理多种代币。ERC-20 不决定代币价格、供应政策、法律分类、用途、抵押支持、治理权或投资质量。ERC 是什么意思?
ERC 是 Ethereum Request for Comments(Ethereum 征求意见)的缩写。ERC 描述了开发者可在 Ethereum 智能合约及相关软件中实现的应用层标准或约定。数字 20 是引入这一同质化代币接口的提案编号。它与代币数量、小数位数、支持的网络或合约函数数量无关。ERC-20 也常称为 EIP-20,因为该文件属于 Ethereum 改进提案流程。为什么要创建 ERC-20?
在出现通用同质化代币标准之前,每个智能合约都可以为余额查询、转账和委托使用设置不同的名称和规则。钱包需要为每种代币编写自定义集成代码。去中心化应用无法安全地假设两个代币合约支持相同操作。ERC-20 创建了一套最低限度的通用接口,让一个应用可以与多种同质化代币交互。这种互操作性有助于代币余额在支付、治理、借贷、流动性系统、金库、游戏、奖励计划和其他加密应用中使用。该标准有意保持精简,以便开发者在不改变基本接口的情况下添加专用功能。ERC-20 的工作原理
ERC-20 代币由部署在 Ethereum 或兼容区块链上的智能合约管理。合约会记录每个地址持有的代币单位数量。合约还会记录代币总供应量以及所有者授予支出方的授权额度。发生有效转账时,合约会减少发送方余额,并增加接收方余额。合约会触发
所有者批准支出方后,合约会更新授权额度并触发
ERC-20 核心函数
ERC-20 必需接口包含 6 个主要函数。这些函数是
该标准还介绍了可选的
totalSupply 函数
用户应查看铸造权限和供应量控制,而不是将
balanceOf 函数
transfer 函数
转账成功后必须触发
应用不能假设返回值永远不会是
许多较新的实现会在失败时回滚,而不是返回
approve 函数
相反,合约会记录一个授权额度,供支出方之后通过
allowance 函数
支出方使用
transferFrom 函数
代币转移时必须触发
ERC-20 事件
ERC-20 标准定义了
Transfer 事件
ERC-20 规范要求,在实现创建供应量时,新铸造的代币必须触发一个从零地址发出的
Approval 事件
授权会让支出方可以在许可额度内使用
ERC-20 名称与符号
什么是 ERC-20 小数位数?
可选的
18 位小数很常见,也是当前 OpenZeppelin ERC-20 实现中的默认值,但 ERC-20 代币也可以采用其他数值。
ERC-20 供应模型
ERC-20 不规定代币供应量必须如何创建。固定供应量代币可以在部署时铸造全部供应量,并且不提供后续铸造函数。有上限的代币可以允许铸造,直到达到合约规定的最大值。无上限代币可以允许授权账户或协议流程继续创建代币,且不设永久上限。算法代币可以根据程序设定的条件调整供应量。包装代币可以在底层资产存入时发行代币单位,并在提取该资产时销毁相应单位。官方 ERC-20 供应指南说明,必须通过适当的铸造机制在基础实现中添加供应逻辑。
铸造 ERC-20 代币
铸造会创建新的代币单位并增加总供应量。ERC-20 核心接口不定义公开铸造函数,也不规定谁可以调用该函数。代币可以将铸造权限限制给管理员、治理流程、跨链桥、质押系统、金库或合约定义的其他权限主体。不安全的铸造权限可能稀释现有持有者的权益,或破坏抵押品相关假设。用户应检查是否可以铸造、由谁控制铸造、是否设有上限,以及实现是否可以升级。代币供应量固定的说法,应通过已部署合约逻辑和特权权限进行核实。销毁 ERC-20 代币
销毁会永久移除代币单位,通常会减少总供应量。核心标准不要求持有者可以公开调用销毁函数。实现可以允许持有者销毁自己的代币,也可以允许获批支出方通过授权额度销毁代币。其他系统只会在赎回、结算或协议操作期间销毁代币。将代币发送到无法访问的地址并不总是等同于合约级销毁,因为报告的总供应量可能保持不变。用户应检查代币实际的销毁逻辑,再解读供应量数据。ERC-20 授权与额度竞态条件
将现有的非零授权额度直接改为另一个非零数值,可能带来交易排序风险。所有者替换授权得到确认前,支出方可能先使用旧授权;之后又获得新的授权额度。原始 ERC-20 规范指出,用户界面应先将授权额度设为 0,再设置不同的非零额度。代币合约本身不应强制要求采用这一流程,否则会降低与旧应用的兼容性。通过精心设计的辅助函数减少或增加授权额度可以提升易用性,但不同实现的支持情况各异。用户应避免留下远超应用实际所需额度的授权。无限代币授权
无限授权通常会将授权额度设为 256 位无符号整数所支持的最大值。这种做法可以减少每次交互前都提交新授权的需要。但这也会让支出方持续拥有操作该代币当前和未来余额的权限。如果支出方合约遭到攻击、被恶意升级,或由权限遭到控制的管理员管理,支出方就可能利用授权转走持有者的代币。用户应权衡便利性与权限的额度和有效时间。有限授权可以降低单个支出方遭到控制时的最大损失。什么是 ERC-2612 Permit?
ERC-2612 是一项扩展,允许 ERC-20 所有者通过签名消息创建授权额度。其他账户或智能合约可以将该签名权限提交到链上。这样可以将授权和应用操作整合为一个用户流程。官方 ERC-2612 Permit 规范为 ERC-20 增加了
Permit 签名风险
Permit 签名可以授权代币支出,即使签署签名本身不会立即从所有者账户发起链上交易。网络钓鱼网站可能将 Permit 描述为登录、验证或无害的免 Gas 消息。在截止时间前,支出方可以提交有效的签名 Permit,并使用由此获得的授权额度。用户签名前应检查代币、支出方、金额、网络、nonce 和有效期。钱包显示无需支付 Gas,并不意味着签名请求安全。智能合约钱包可能需要基础外部拥有账户模式以外的额外签名验证支持。ERC-20 是否支持自动接收方回调?
ERC-20 核心转账函数不要求接收方智能合约确认收到代币。因此,即使接收方合约没有记录或返还代币的函数,转账也可能成功。这可能导致资产被困在不兼容的合约中。普通转账后,ERC-20 也不会自动调用接收方代码。ERC-1363 扩展为需要回调行为的应用增加了转账并调用和授权并调用操作。
支持回调的扩展会增加外部调用,因此必须检查重入和接收方安全风险。SafeERC20 与非标准代币
ERC-20 规范规定,调用方必须处理返回值为
另一些实现则会在失败时回滚,而不是返回
当前的 SafeERC20 工具封装了代币操作,并能处理返回 false 的代币以及某些不返回值的代币。
封装工具可以提高兼容性,但无法让恶意代币在经济层面变得安全。转账扣费代币
转账扣费代币会在转移代币时扣除费用。接收方收到的数量会少于发送方或调用合约请求转出的数量。如果协议按请求数量而不是实际到账数量记账,可能导致抵押不足。支持这类代币行为的应用应比较转账前后的代币余额。如果合约可升级或由管理员控制,费用规则也可能发生变化。ERC-20 标准函数名称不能保证转账结果固定不变。ERC-20 重基代币
重基代币会根据合约定义的调整流程改变账户余额。包装 ERC-20 代币
包装 ERC-20 代币通过智能合约或托管安排代表另一种资产。用户可以存入底层资产,并收到相应的 ERC-20 单位。赎回时通常会销毁或返还包装单位,并释放底层资产。包装代币的价值取决于其支持机制是否可用且运行正常。智能合约攻击、托管故障、跨链桥故障、抵押品冻结或核算错误都可能破坏预期的对应关系。符合 ERC-20 标准只能证明接口兼容,不能证明其背后有足够抵押支持。ERC-20 治理代币
ERC-20 代币可以扩展为链上治理系统中的投票权凭证。投票权可能取决于当前余额、委托余额或历史余额检查点。当前 ERC-20 实现库包含一个ERC-20 投票扩展,用于委托和查询历史投票权。
持有治理代币并不一定会自动获得投票权,因为某些系统要求先进行委托。代币投票也可能受到所有权集中、借入资产、投票参与率低和管理员权限的影响。ERC-20 核心标准不定义治理规则。ERC-20 金库份额
ERC-20 代币可以代表代币化金库中的份额。每份份额代表对金库管理资产的按比例权益,而不是固定数量的底层代币。ERC-4626 代币化金库标准在 ERC-20 的基础上增加了标准化的存款、提现、铸造、赎回和兑换函数。
金库份额对应的底层资产价值可能随策略表现、费用、损失和核算规则而上升或下降。仅凭 ERC-20 兼容性无法了解份额代币由什么支持,或如何赎回。ERC-20 错误消息
原始 ERC-20 标准早于 Solidity 自定义错误,不定义一套标准化的失败消息。不同代币可能返回
最终版 ERC-6093 标准为常见代币故障定义了结构化自定义错误。
例如余额不足、发送方无效、接收方无效、授权额度不足、授权方无效和支出方无效等错误。标准化错误可以帮助钱包和应用以更一致的方式解释失败原因。ERC-6093 不会改变 ERC-20 核心接口,也不要求所有现有代币都采用其错误定义。ERC-20 是否使用 ERC-165?
原始 ERC-20 标准不要求使用 ERC-165 接口检测。应用不能假设调用
ERC-20 与原生 ETH
ETH 是 Ethereum 的原生加密资产,本身不是 ERC-20 代币。Ethereum 账户可以通过协议层的价值转账发送原生 ETH。ERC-20 余额则记录在各自的智能合约中。即使转移的是 ERC-20 代币,支付 Ethereum 交易费仍需使用 ETH,除非另有系统代付或抽象该费用。需要代币接口的应用可以创建 ETH 的 ERC-20 表示形式,但包装资产仍不同于原生 ETH。ERC-20 与 ERC-721
ERC-20 表示同质化余额,而 ERC-721 表示具有独立标识的非同质化代币。ERC-20 账户持有数量不定的可互换单位。ERC-721 账户持有不同的代币 ID。ERC-20 通常使用小数位格式,而一个 ERC-721 代币通常作为完整的独特单位转移。ERC-721 还包含安全转移接收方检查,而 ERC-20 核心标准没有此类检查。ERC-20 与 ERC-1155
ERC-20 通过每个合约接口管理一种同质化代币类型。ERC-1155 允许一个合约管理多个代币 ID,并分别记录其余额。这些 ERC-1155 代币 ID 可以代表同质化、半同质化或独特资产。ERC-1155 还定义了批量转移操作和接收方回调。适用标准取决于项目需要一种同质化资产,还是需要由一个合约管理多种资产类型。ERC-20 的常见应用场景
稳定价值代币可以使用 ERC-20 表示与储备、抵押系统或算法机制相关联的可转让单位。治理系统可以使用 ERC-20 余额或委托单位作为投票权。区块链游戏可以使用 ERC-20 代币作为可互换的游戏货币、奖励或资源。金库和质押系统可以发行 ERC-20 凭证代币,以代表存入的头寸。包装资产可以使用 ERC-20 代币代表存放在其他位置的资产权益。项目还可以将该标准用于忠诚度积分、访问额度、支付单位或代币化金融权益。该接口并不决定某项用途是否合法、是否有足额支持、是否去中心化或在经济上是否可持续。ERC-20 智能合约风险
ERC-20 实现可能在转账、授权额度、铸造、销毁、税费或访问控制逻辑中存在错误。特权管理员可能可以暂停转账、冻结余额、封锁地址、铸造供应量、更改费用或升级合约。代理升级可以在持有者获得代币后改变代币行为。自定义代币逻辑中的外部调用可能带来重入或拒绝服务风险。即使代币本身按照代码运行,错误的集成仍可能导致资金损失。符合标准有助于互操作,但不能取代审计、测试、源代码审查和权限分析。代币授权钓鱼
授权钓鱼会试图诱骗用户授权恶意支出方。界面可能将操作描述为验证、连接、奖励资格确认或账户恢复。授权确认后,支出方可以在授权额度内使用
代币转账诈骗
诈骗者可以在未经钱包所有者许可的情况下向其发送未知 ERC-20 代币。代币名称、符号或元数据可能包含误导性网站或说法。访问宣传的网站可能导致用户授予恶意授权或签署恶意消息。攻击者还可以创建外观与用户交易历史中地址相似的地址。用户应从可信记录中复制已核实的地址,而不是只根据首尾字符相符就选择转账地址。收到未知代币并不意味着钱包所有者必须与其交互。开发者如何实现 ERC-20
开发者通常应从经过审查且积极维护的实现开始。当前的 ERC-20 开发指南提供了核心合约,以及用于 Permit、供应上限、销毁、暂停、投票、包装、金库和其他功能的扩展。
代币供应量的创建应明确规定,并通过适当的访问控制加以保护。转账自定义功能应维护余额、供应量、事件和授权额度不变量。开发者应测试零值转账、最大值、余额不足、授权额度不足、铸造、销毁、授权,以及涉及特殊地址的转账。如果支持此类资产,还应使用返回 false、不返回值、转账扣费、重基、暂停和支持回调的代币进行集成测试。用户如何评估 ERC-20 代币
第一步是核实区块链网络和完整的代币合约地址。第二步是检查当前供应量、最大供应量相关说法和铸造权限。第三步是查看管理员、暂停、冻结、封锁列表、费用和升级权限。第四步是确认代币是否由其他资产支持,以及如何赎回。第五步是了解转账费用、重基行为、限制和对钱包余额的特殊影响。第六步是查看审计、已验证源代码和事故历史,但不要将任何审计视为保证。第七步是检查持有人集中度、可用流动性,以及流动性可能消失的条件。第八步是了解需求或收益的实际来源,而不是依赖代币品牌宣传。第九步是在使用陌生智能合约前后检查授权。第十步是在投入大量资金前,先用有限金额测试新代币或合约。ERC-20 转账示例
假设 Alice 持有 500 个 ERC-20 代币,并想向 Bob 发送 75 个。Alice 的钱包会确认区块链、代币合约、接收地址、金额和交易费用均正确。钱包会提交一笔调用代币
合约会触发
ERC-20 授权示例
假设 Alice 想让金库合约代她存入 100 个 ERC-20 代币。Alice 首先核实金库合约地址以及该合约将使用的代币。她调用
代币合约会记录授权额度并触发
金库通过
常见 ERC-20 错误
一个常见错误是只根据代币名称或符号识别代币。另一个错误是认为每种 ERC-20 代币都使用 18 位小数。第三个错误是向不受信任的合约授予无限授权。第四个错误是认为断开钱包连接会撤销代币授权额度。第五个错误是忽视代币转账的布尔返回值或非标准行为。第六个错误是按请求数量而不是实际到账数量记录转账扣费代币存款。第七个错误是将
常见问题
ERC-20 是什么意思?
ERC-20 是 Ethereum 标准,为同质化智能合约代币定义了通用函数和事件。ERC-20 是加密货币吗?
ERC-20 是一种技术标准,而实现该标准的具体合约可以创建加密货币代币。ERC-20 和 Ethereum 是一回事吗?
不是。Ethereum 是区块链网络,而 ERC-20 是用于该网络上代币的智能合约接口。ETH 是 ERC-20 代币吗?
不是。ETH 是 Ethereum 的原生资产,本身不使用 ERC-20 合约接口。ERC-20 代币是同质化的吗?
是的。同一种普通 ERC-20 代币的等量单位,根据合约的核算规则可以互换。ERC-20 的 6 个核心函数是什么?
它们是
ERC-20 定义了哪些事件?
该标准定义了
name、symbol 和 decimals 是必需的吗?
不是。原始 ERC-20 规范中的这 3 个元数据函数都是可选的。所有 ERC-20 代币都使用 18 位小数吗?
不是。18 位很常见,但每种代币都可以使用不同的小数位数。ERC-20 授权有什么作用?
授权会在指定额度内允许支出方从所有者处转移代币。transferFrom 有什么用途?
它允许获授权的支出方将代币从所有者转移给接收方。什么是 ERC-20 无限授权?
无限授权是指将授权额度设为极大的最大值,让支出方无需反复申请授权即可继续转移代币。断开钱包连接会撤销授权吗?
不会。链上授权额度会继续有效,直到通过代币合约更改,或因其他原因失效。什么是 ERC-20 Permit?
Permit 是可选的 ERC-2612 签名消息,可创建或更改授权额度,而无需所有者直接提交授权交易。ERC-20 代币可以铸造吗?
可以,但实现中必须包含铸造机制,并且要有获授权主体或协议条件允许使用该机制。ERC-20 代币可以销毁吗?
可以,但实现中必须包含销毁代币单位的合约逻辑。ERC-20 是否要求固定供应量?
不要求。供应政策由具体代币实现决定。ERC-20 转账可以收取费用吗?
可以。定制代币可以在转账时扣除费用,尽管核心标准不要求这种行为。ERC-20 余额会在没有转账时发生变化吗?
会。重基和其他自定义核算模式可以在没有持有者普通转账的情况下改变报告余额。ERC-20 代币可能被困在合约中吗?
可能。核心转账函数不要求接收合约确认其能够处理或返还代币。ERC-20 支持 ERC-165 接口检测吗?
不支持。原始 ERC-20 规范不要求 ERC-165。ERC-20 能保证代币有抵押支持吗?
不能。该标准不会核实储备、抵押品、赎回权或偿付能力。符合 ERC-20 标准就能保证代币安全吗?
不能。兼容代币仍可能存在危险权限、代码缺陷、支持不足、流动性差或恶意操作者。用户如何识别正确的 ERC-20 代币?
用户应通过权威来源核实区块链网络和完整合约地址。ERC-20 的主要优势是什么?
其主要优势是通过通用接口实现互操作性,让许多加密钱包和智能合约都能识别并使用。结论
ERC-20 是 Ethereum 上同质化智能合约代币的基础标准。该标准定义了查询供应量和余额、转移代币以及授予委托支出权限的通用方法。授权仍是用户面临的主要风险之一,因为恶意支出方可以通过
您可能也喜欢
反恐融资(CTF)
框架
波动性爆发
热门
目前热门备受市场关注的加密货币
最高成交量
按交易量计算交易量最大的加密货币

