以太坊ERC-677标准(为什么 LINK 使用 ERC-677 标准发行 token)
发布日期:2021-06-29 22:26:40 浏览次数:2 分类:技术文章

本文共 3836 字,大约阅读时间需要 12 分钟。

以太坊ERC-677标准

为什么 LINK 使用 ERC-677 标准发行 token

参考URL: https://ethfans.org/chainlink/articles/37453

ERC20 是一套协议标准,代码角度来说就是一套接口 API。在这个协议标准下,只要实现了协议标准所规定的方法,都可以作为 ERC20 代币的实现。协议规定必须实现的方法有:

// 1. 代币发行总量function totalSupply() public view returns (uint256)// 2. _owner账户的代币余额function balanceOf(address _owner) public view returns (uint256 balance)// 3. 转移_value数量的代币到_to地址function transfer(address _to, uint256 _value) public returns (bool success)// 4. 从_address地址转移_value数量的代币到_to地址function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)// 5. 允许_spender可以提取总额为_value数量的代币,提取不限次数function approve(address _spender, uint256 _value) public returns (bool success)// 6. 返回_spender还可以从_owner提取的代币数量function allowance(address _owner, address _spender) public view returns (uint256 remaining)

除了这几个方法,ERC20 还规定了两个事件:

// 当成功转移token时,触发Transfer事件,记录转账的发送方、接收方和转账金额event Transfer(address indexed _from, address indexed _to, uint256 _value)// 当调用approval函数成功时,触发Approval事件,记录批准的所有方、获取方和批准金额event Approval(address indexed _owner, address indexed _spender, uint256 _value)

以上基本上就是 ERC20 代币的全部内容了。由于 LINK 代币不仅仅是代币,还承担了链上与链下数据传递的功能,所以如果使用 ERC20 代币的标准无法满足这个需求,于是 LINK 选择了 ERC677 协议标准来实现。

ERC677 标准是 ERC20 的一个扩展,它继承了 ERC20 的所有方法和事件,由 Chainlink 的 CTO Steve Ellis 首次提出。ERC677 除了包含了 ERC20 的所有方法和事件之外,增加了一个 transferAndCall 方法:

function transferAndCall(address receiver, uint amount, bytes data) returns (bool success)

可以看到,**这个方法比 ERC20 中的 transfer 方法多了一个 data 字段,这个字段用于在转账的同时,携带用户自定义的数据。**在方法调用的时候,还会触发 Transfer(address,address,uint256,bytes) 事件,记录下发送方、接收方、转账金额以及附带数据。完成转账和记录日志之后,代币合约还会调用接收合约的 onTokenTransfer 方法,用来触发接收合约的逻辑。这就要就接收 ERC677 代币的合约必须实现 onTokenTransfer 方法,用来给代币合约调用。 onTokenTransfer 方法定义如下:

function onTokenTransfer(address from, uint256 amount, bytes data) returns (bool success)

总结:接收 ERC677 代币的合约必须实现 onTokenTransfer 方法,用来给代币合约调用。

接收合约就可以在这个方法中定义自己的业务逻辑,可以在发生转账的时候自动触发。换句话说,智能合约中的业务逻辑,可以通过代币转账的方式来触发自动运行。这就给了智能合约的应用场景有了很大的想象空间。比如 LINK 的 token 合约就是一个 ERC677 合约,而 Chainlink 的 Oracle 合约,是一个可以接收 ERC677 的合约,它含有 onTokenTransfer 方法,可以在收到 LINK 的转账的时候执行预言机相关的业务逻辑。

LINK token contract:

...  /**  * @dev 转移token到合约地址,并携带额外数据  * @param _to 转到的地址  * @param _value 转账金额  * @param _data 传递给接受合约的额外数据  */  function transferAndCall(address _to, uint _value, bytes _data)    public    returns (bool success)  {    super.transfer(_to, _value);    Transfer(msg.sender, _to, _value, _data);    if (isContract(_to)) {      contractFallback(_to, _value, _data);    }    return true;  }...

Oracle 合约:

...  /**    * @notice 在LINK通过`transferAndCall`方法发送到合约时被调用    * @dev 负载数据的前两个字节会被`_sender`和 `_amount`的值覆盖来保证正确性。并会调用oracleRequest方法    * @param _sender 发送方地址    * @param _amount 发送的LINK数量(单位是wei)    * @param _data 交易的负载数据    */  function onTokenTransfer(    address _sender,    uint256 _amount,    bytes _data  )    public    onlyLINK    validRequestLength(_data)    permittedFunctionsForLINK(_data)  {    assembly {      // solium-disable-next-line security/no-low-level-calls      mstore(add(_data, 36), _sender) // ensure correct sender is passed      // solium-disable-next-line security/no-low-level-calls      mstore(add(_data, 68), _amount)    // ensure correct amount is passed    }    // solium-disable-next-line security/no-low-level-calls    require(address(this).delegatecall(_data), "Unable to create request"); // calls oracleRequest  }...

总结:LINK 代币合约是 ERC677 合约,它是 ERC20 合约的一个扩展,兼容 ERC20 协议标准。它可以在转账时携带数据,并触发接收合约的业务逻辑,这一特点可以帮助智能合约扩大应用场景。

接收 ERC677 代币的合约必须实现 onTokenTransfer 方法,用来给代币合约调用。

参考:

https://eips.ethereum.org/EIPS/eip-20

http://blockchainers.org/index.php/2018/02/08/token-erc-comparison-for-fungible-tokens/

https://github.com/ethereum/EIPs/issues/677

https://etherscan.io/address/0x514910771af9ca656af840dff83e8264ecf986ca#code

https://etherscan.io/address/0x64fe692be4b42f4ac9d4617ab824e088350c11c2#code

转载地址:https://docker.blog.csdn.net/article/details/111997212 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:VRF是什么?
下一篇:Chainlink官方文档翻译(二) 中间件-随机数 Intermediates - Random Numbers)

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月24日 20时20分42秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章