5月27日 20:11

什么是ERC-20代币标准?

核心答案

ERC-20是以太坊上同质化代币的接口标准(EIP-20),由Fabian Vogelsteller于2015年提出。它规定了6个必须方法和2个事件,保证所有代币合约与钱包、DApp、交易所兼容。

必须实现的6个方法:

  • totalSupply() — 返回代币总量
  • balanceOf(address) — 查询某地址余额
  • transfer(address, uint256) — 直接转账
  • approve(address, uint256) — 授权第三方使用额度
  • allowance(address, address) — 查询已授权额度
  • transferFrom(address, address, uint256) — 用授权额度代为转账

2个必须事件:TransferApproval

可选方法:name()symbol()decimals()(默认18)。

生产环境推荐继承OpenZeppelin的ERC20合约,不要自己写底层逻辑。

approve的竞态问题

approve(A, 100),再改成approve(A, 50),A在第二笔交易上链前用transferFrom转走100,然后第二笔生效后A还能再转50——总共150而非预期的50。

解法:先approve(spender, 0)再设新值,或用OpenZeppelin的SafeERC20

为什么没有接收回调

ERC-20转账时合约不会通知接收方,代币可能被锁死在合约里。ERC-223和ERC-777通过tokensReceived钩子解决了这个问题,但兼容性风险导致主流仍用ERC-20。向合约转账前务必确认它实现了IERC20Receiver

与其他标准的区别

ERC-721是NFT标准,每个token唯一;ERC-1155用单合约管理多类代币,省Gas;ERC-4626是金库代币标准,用于收益聚合。ERC-20只管同质化代币,是最基础也是应用最广的标准。

面试追问方向

  • transfer和transferFrom的区别和典型使用场景?
  • decimals为什么默认18?跟wei的精度有什么关系?
  • 用OpenZeppelin发一个可铸造、可销毁的ERC-20要继承哪些模块?
标签:以太坊