准备将 ERC777 用起来了

准备将 ERC777 用起来了

一直以来,在以太坊上创建代币都是用的 ERC20 协议,这个协议简单易实现,但确实存在着很多问题: 1. totalSupply 具体表示什么模糊不清,有的合约用它来表示发行上限,但实际发行量是另外一个数字,有的合约用它来表示实际发行量,总发行量是另外一个数字。上周还有朋友问我为啥把 etherscan 上某个代币转账历史涉及的账户余额加起来和 totalSupply 不一致。 2. decimals 不统一,增加很多麻烦。因为以太币的最小单位是 wei,一个 以太币有 10 ** 18 wei,decimals 和以太币不一致,就要单独存储和处理。 3. 最要命的,把代币发送到合约上之后,合约无法感知,这可能会导致两种情况: a. 发送到合约的代币永远取不出来了。 b. 用户发送代币到合约后,需要另外一个交易来处理用户的转账。 这些问题,ERC777 都不存在了,并且 ERC777 和 ERC20 完全兼容。OpenZeppelin 也添加了对 ERC777 的支持,代码写起来也不太费事了。下面是基于 OpenZeppelin 的 ERC777 示例代码。 ``` pragma solidity ^0.5.0; import "openzeppelin-solidity/contracts/token/ERC777/ERC777.sol"; contract GLDToken is ERC777 { constructor(uint256 initialSupply, address[] memory defaultOperators) ERC777("Gold", "GLD", defaultOperators) public { _mint(msg.sender, msg.sender, initialSupply, "", ""); } } ```

一直以来,在以太坊上创建代币都是用的 ERC20 协议,这个协议简单易实现,但确实存在着很多问题:

  1. totalSupply 具体表示什么模糊不清,有的合约用它来表示发行上限,但实际发行量是另外一个数字,有的合约用它来表示实际发行量,总发行量是另外一个数字。上周还有朋友问我为啥把 etherscan 上某个代币转账历史涉及的账户余额加起来和 totalSupply 不一致。

  2. decimals 不统一,增加很多麻烦。因为以太币的最小单位是 wei,一个 以太币有 10 ** 18 wei,decimals 和以太币不一致,就要单独存储和处理。

  3. 最要命的,把代币发送到合约上之后,合约无法感知,这可能会导致两种情况: a. 发送到合约的代币永远取不出来了。 b. 用户发送代币到合约后,需要另外一个交易来处理用户的转账。

这些问题,ERC777 都不存在了,并且 ERC777 和 ERC20 完全兼容。OpenZeppelin 也添加了对 ERC777 的支持,代码写起来也不太费事了。下面是基于 OpenZeppelin 的 ERC777 示例代码。

pragma solidity ^0.5.0;

import "openzeppelin-solidity/contracts/token/ERC777/ERC777.sol";

contract GLDToken is ERC777 {
    constructor(uint256 initialSupply, address[] memory defaultOperators) ERC777("Gold", "GLD", defaultOperators) public {
        _mint(msg.sender, msg.sender, initialSupply, "", "");
    }
}

  • 发表于 2019-06-29 23:52
  • 阅读 ( 2089 )
  • 学分 ( 5 )
  • 分类:智能合约

评论