ERC777 vs. ERC20

ERC777是一个新的高级代币标准,可以视为ERC20的升级版本,因此 它解决了ERC20以及ERC223存在的一些问题,开发者可以根据自己的 具体需求进行选型。

1、使用ERC820进行合约注册

有别于ERC20的自由散漫,ERC777利用了新的ERC820 标准提供的集中式的智能合约注册表和合约接口实现查询功能,以实现某种程度的内省。 中心化的注册机制有助于后向兼容性以及更好的功能扩展。一个期望调用ERC777的 DApp或智能合约,就可以利用EIP-820返回的ITokenReceipt接口来确定目标合约是否 实现了期望的接口。

2、ERC777概述

ERC777改进了ERC20代币中存在的很多不足,例如,ERC777支持操作员白名单,提供 以太币兼容的send()接口,利用ERC20实现后向兼容等。下图展示了ERC777代币的 转账实现流程:

erc-777 token transfer

要快速掌握以太坊区块链应用开发,推荐汇智网的在线互动教程:

以太坊DApp开发入门 | 以太坊电商DApp实战 | ERC721以太坊通证实战
Web3j以太坊开发详解 | Php以太坊开发详解 | Python以太坊开发详解 | C#以太坊开发详解 | Flutter以太坊开发详解 |

与ERC20相比,ERC777有以下方面的优势:

  • 采用与以太币一致的哲学发送代币,即采用接口send(dest,value,data)
  • 任何合约都可以定义收到代币时触发的tokensReceived事件,这避免了在ERC20代币 中存在的双重调用问题。
  • 合约和常规地址都可以通过注册一个tokensToSendtokensReceivedFunction 函数来控制或拒绝发送或接收的代币,避免ERC20代币中存在的代币卡死问题。
  • 代币持有者可以授权或回收管理其代币的操作员权限。这些操作员通常是交易所 合约或自动收费系统中的支付处理器。
  • 每个代币交易都包含userData数据字段,在操作员操作时也有类似的operatorData 字段,从而可以自由地将数据传递给接收方。
  • 可以后向兼容那些不支持tokensReceived函数的钱包。

3、ERC777规范

下面是ERC777规范的内容,完整描述可以到官网查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
interface ERC777Token {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function totalSupply() external view returns (uint256);
function balanceOf(address holder) external view returns (uint256);
function granularity() external view returns (uint256);

function defaultOperators() external view returns (address[] memory);
function isOperatorFor(
address operator,
address holder
) external view returns (bool);
function authorizeOperator(address operator) external;
function revokeOperator(address operator) external;

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

function burn(uint256 amount, bytes calldata data) external;
function operatorBurn(
address from,
uint256 amount,
bytes calldata data,
bytes calldata operatorData
) external;

event Sent(
address indexed operator,
address indexed from,
address indexed to,
uint256 amount,
bytes data,
bytes operatorData
);
event Minted(
address indexed operator,
address indexed to,
uint256 amount,
bytes data,
bytes operatorData
);
event Burned(
address indexed operator,
address indexed from,
uint256 amount,
bytes data,
bytes operatorData
);
event AuthorizedOperator(
address indexed operator,
address indexed holder
);
event RevokedOperator(address indexed operator, address indexed holder);
}

ERC777代币合约必须通过ERC820标准注册ERC777Token接口。基准单位必须是10¹⁸。

erc777 logo

ERC777代币logo采用Creative Commons Attribution-ShareAlike 4.0授权, 并且不可以用于广告、推广或其他任何不兼容ERC777的技术。

后向兼容性

ERC777没有引入后向不兼容问题,因此可以兼容之前的ERC20代币标准。

在这个RIP中,没有使用transfertransferFrom进行代币转账,而是 使用sendoperatorSend来避免混淆与潜在的错误。与此同时,ERC777 允许你实现ERC20中的transfertransferFromapproveallowance 以便兼容ERC20。

因此一个代币合约可以同时实现ERC20和ERC777。只读函数例如namesymbolbalanceOftokenSupply以及内部数据例如余额映射表等 都可以毫无问题的重叠使用。但是需要注意的是,以下函数是ERC777规范 强制要求的:namesymbol,不过decimal并非ERC777标准中的要求。

两个标准中的写操作函数都是解耦的,可以彼此独立的操作。注意ERC20 函数应当仅限于既有合约的调用。

如果代币合约实现了ERC20,那么它必须通过ERC820注册ERC20Token接口。 如果合约支持切换启用或禁止ERC20的方法,那么每次进行切换时,该代币 合约必须通过ERC820注册或解除ERC20Token接口的注册。

对于实现ERC20的新合约而言,唯一的区别在于ERC777TokensSender和 ERC777TokensRecipient通过ERC820的注册必须早于ERC20的注册。这意味 着即使是对ERC20的transfer方法的调用,代币合约也必须通过ERC820 检查fromto是否实现了tokensToSend/tokensReceived接口并在 可用时进行调用。注意当调用合约的ERC20的transfer方法时,如果合约 没有实现tokensReceived接口,那么transfer也应当被接受,这意味着 代币可能会被锁定。


原文链接:ERC777 A New Advanced Token Standard

汇智网翻译整理,转载请标明出处