• 什么是ERC20

    ERC20是一个同质化Token标准,与NFT(ERC721, ERC1155)对应,每个Token都是一样的可以互换的。比如美元,你拥有的1美元和我拥有的1美元是等价的,购买时是美元区别的。NFT类似艺术品,他们直接是不一样的。

    通俗理解成每个token有两张链上excel表,一张账户余额表,一张授权使用表。

    • 余额表
    账户地址 余额
    0x17***37 100
    0x16***95 20
    1. 查询余额
    2. 自己转账,转账本质上是在表里面做加减法。如账户0x17***370x16***95转账5。 首先0x17***37余额减5。
    账户地址 余额
    0x17***37 95
    0x16***95 20

    然后0x16***95余额加5。

    账户地址 余额
    0x17***37 95
    0x16***95 25

    计算顺序为先减后加,放置程序漏洞。

    • 授权表(允许第三方使用你的账户,三方地址可以为合约地址,也可以为钱包地址)) 使用场景:使用token,在第三方只能中购买时。输入token数量,业务逻辑:1 调用三方智能合约 2 三方智能合约调用接口直接进行转账 3 业务完成。该过程中用户不需要和token合约交互,所以需要提前进行授权。
    账户地址 三方地址 授权额度
    0x17***37 账户1 10
    0x17***37 账户2 1000000
    0x16***95 账户1 0
    0x16***95 账户2 13
    1. 授权更新额度 账户0x17***37允许账户3使用1000的额度。这种操作在钱包中遇到。在使用metamask时,是可以手动设置这个值的。但是因为每次授权都会产生手续费,所以大部分应用都默认设置很大的值。
    账户地址 三方地址 授权额度
    0x17***37 账户1 10
    0x17***37 账户2 1000000
    0x17***37 账户3 1000
    0x16***95 账户1 0
    0x16***95 账户2 13

    可以手动去更新授信额度,更新原来的会被覆盖。如账户0x17***37账户3的额度改为0。账户3就不能再转移账户0x17***37中的当前资产了。

    账户地址 三方地址 授权额度
    0x17***37 账户1 10
    0x17***37 账户2 1000000
    0x17***37 账户3 0
    0x16***95 账户1 0
    0x16***95 账户2 13
    1. 授权人帮忙转账,同时也会更新额度 如:在网页中进行staking操作。操作流程:1 授权, 2 输入token数量,点击完成按钮。假设账户0x17***37,staking合约地址为0x1700066.

    1 授权

    账户地址 三方地址 授权额度
    0x17***37 账户1 10
    0x17***37 账户2 1000000
    0x17***37 账户3 0
    0x17***37 0x1700066 100
    0x16***95 账户1 0
    0x16***95 账户2 13

    2 输入数量为5的token,调用三方合约,三方合约调用ERC20接口,更新ERC20余额状态 授权表

    账户地址 三方地址 授权额度
    0x17***37 账户1 10
    0x17***37 账户2 1000000
    0x17***37 账户3 0
    0x17***37 0x1700066 95
    0x16***95 账户1 0
    0x16***95 账户2 13

    账户表

    账户地址 余额
    0x17***37 90
    0x16***95 25
    0x1700066 5
  • 授权的风险 项目方的风险: 不乱使用授信额度, 代码实现基于标准不在代码中留后门,可以通过审计规避。 空投诈骗,页面展示是一种token,实际调用的是另外一种token, 如0xdac17f958d2ee523a2206206994597c13d831ec7(USDT);

  • ERC20案例(USDT) 官方网站 https://tether.to/en/supported-protocols,其实USDT并没有在BSC中发行(Binance-Peg BSC-USD)。

    ETH链上USDT余额查询 https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#readContract

参考资料

  1. https://eips.ethereum.org/EIPS/eip-20
  2. https://eips.ethereum.org/EIPS/eip-721
  3. https://eips.ethereum.org/EIPS/eip-777
  4. https://eips.ethereum.org/EIPS/eip-1155
  5. https://tether.to/en/supported-protocols
  6. https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7
  7. https://bscscan.com/token/0x55d398326f99059ff775485246999027b3197955
  8. https://community.trustwallet.com/t/what-are-binance-peg-tokens/568