以太坊--ERC标准

1. ERC20标准

是以太坊上发布的标准代币,任何人都可以发布自己的ERC20代币,只要其满足以太坊上的ERC20标准,即实现规定的函数和事件

// 函数
function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)
function totalSupply() public view returns (uint256)
function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
function approve(address _spender, uint256 _value) public returns (bool success)
function allowance(address _owner, address _spender) public view returns (uint256 remaining)
//事件
event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)

如果实现了以上函数和事件,即可在以太坊上发布对应的代币,目前以太坊上已有很多ERC20代币。

ERC721标准即非同质化代币,NFT发布的相应标准,与ERC20较为类似。

2. ERC20的问题

但是ERC20标注本身存在很多限制,如果想在ERC20代币==标准的基础上增添附加功能是十分困难的,很多时候无法在一个交易内完成。
主要存在的问题有:

  • 如果收到代币转账,ERC20标准无法在合约里记录是谁发过来的代币
  • ERC20标准没有转账通知机制
  • ERC20代币转账时,无法携带额外的信息。

这时候ERC777标准的出现则较好地解决了这个问题

3. ERC1820–通用注册表合约

ERC1820是兼容ERC165的,ERC165标准本身是标准化了接口如何识别、如何检测合约是否实现了某个标准接口。
ERC1820标准定义智能合约及普通用户账户可以向注册表发布其实现了哪些功能。
任何人都可以查询该注册表,询问哪个地址是否实现给定的接口以及智能合约处理实现逻辑。
ERC1820主要实现两个接口:

  • setInterfaceImplementer(address _addr, bytes32 _interfaceHash, address _implementer)
    用来设置地址(_addr)的接口(_interfaceHash 接口名称的 keccak256 )由哪个合约实现(_implementer)。
  • getInterfaceImplementer(address _addr, bytes32 _interfaceHash) external view returns (address)
    这个函数用来查询地址(_addr)的接口由哪个合约实现。

3. ERC777

主要优点:

  1. ERC777兼容ERC20,其在ERC20的基础上定义了**send(dest, value, data)**来转移代币,额外的参数用来携带其它的信息,send函数会检测持有者和接收者是否实现了相应的钩子函数,如果有实现,则调用相应的钩子函数。
    ERC777使用send转账时,会分别在持有者和接收者地址上使用ERC1820的getInterfaceImplementer函数进行查询,查询是否有对应的实现合约。
    ERC777标准规范中预定了接口及函数名称,如果有实现则进行相应的调用。
  2. 合约和普通地址都可以通过注册tokensToSend hook函数来控制和拒绝发送哪些token(拒绝发送通过在hook函数tokensToSend 里 revert 来实现)。
  3. 合约和普通地址都可以通过注册tokensReceived hook函数来控制和拒绝接受哪些token(拒绝接受通过在hook函数tokensReceived 里 revert 来实现)。
  4. tokensReceived 可以通过hook函数可以做到在一个交易里完成发送代币和通知合约接受代币,而不像 ERC20 必须通过两次调用(approve/transferFrom)来完成。

3-1 接口说明与实现约定

ERC777合约必须要通过ERC1820注册ERC777Token接口 和 ERC20Token接口。

3-2 操作员

ERC777定义了一个新的操作员的角色,操作员是被作为移动代币的地址,每个地址直观地移动自己的代币,将持有人和操作员的概念分开。

3-3发送代币

ERC777发送代币使用以下两个方法:

send(address to, uint256 amount, bytes calldata data) external

function operatorSend(
    address from,
    address to,
    uint256 amount,
    bytes calldata data,
    bytes calldata operatorData
) external

operatorSend可以通过参数operatorData携带操作者的信息,发送代币除了执行对应账户的余额加减和触发事件之外,还有额外的规定:

扫描二维码关注公众号,回复: 17359630 查看本文章
  1. 如果持有者有通过 ERC1820 注册 ERC777TokensSender 实现接口, 代币合约必须调用其 tokensToSend 钩子函数。
  2. 如果接收者有通过 ERC1820 注册 ERC777TokensRecipient 实现接口, 代币合约必须调用其 tokensReceived 钩子函数。
  3. 如果有 tokensToSend 钩子函数,必须在修改余额状态之前调用。
  4. 如果有 tokensReceived 钩子函数,必须在修改余额状态之后调用。

ERC777TokensSender

对于所有的ERC777合约,一个持有者地址只能注册一个ERC777TokenSender接口实现,ERC777TokenSender实现会被多个ERC777合约所调用,在ERC777TokenSender接口的实现合约里,msg.sender是ERC777合约地址,而不是操作者

ERC777TokensRecipient

如果接收者是一个合约地址, 则必须要注册及实现 ERC777TokensRecipient 接口(这样可以防止代币被锁死),如果没有实现,ERC777代币合约必须revert 回退交易状态。

后续会介绍由于ERC721和ERC777标准的一些问题,导致的漏洞

ERC777代币的详细介绍可见如下文档:ERC777标准介绍
上述ERC721,20,165,777,1820等标准的详细说明可见这个文档:以太坊EIP说明

猜你喜欢

转载自blog.csdn.net/m0_53689197/article/details/134043116
今日推荐