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个必须事件:Transfer 和 Approval。
可选方法: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要继承哪些模块?