天天看點

ERC777剖析

ERC777是一個新的進階代币标準,可以視為ERC20的更新版本,是以它解決了ERC20以及ERC223存在的一些問題,開發者可以根據自己的具體需求進行選型。

1、使用ERC820進行合約注冊

有别于ERC20的自由散漫,ERC777利用了新的

ERC820

标準提供的集中式的智能合約系統資料庫和合約接口實作查詢功能,以實作某種程度的内省。中心化的注冊機制有助于後向相容性以及更好的功能擴充。一個期望調用ERC777的DApp或智能合約,就可以利用EIP-820傳回的ITokenReceipt接口來确定目标合約是否實作了期望的接口。

2、ERC777概述

ERC777改進了ERC20代币中存在的很多不足,例如,ERC777支援操作員白名單,提供以太币相容的

send()

接口,利用ERC20實作後向相容等。下圖展示了ERC777代币的轉賬實作流程:

ERC777剖析
要快速掌握以太坊區塊鍊應用開發,推薦彙智網的線上互動教程: 以太坊DApp開發入門 | 以太坊電商DApp實戰 ERC721以太坊通證明戰 Web3j以太坊開發詳解 Php以太坊開發詳解 Python以太坊開發詳解 C#以太坊開發詳解 Flutter以太坊開發詳解

與ERC20相比,ERC777有以下方面的優勢:

  • 采用與以太币一緻的哲學發送代币,即采用接口

    send(dest,value,data)

  • 任何合約都可以定義收到代币時觸發的

    tokensReceived

    事件,這避免了在ERC20代币

    中存在的雙重調用問題。

  • 合約和正常位址都可以通過注冊一個

    tokensToSend

    tokensReceivedFunction

    函數來控制或拒絕發送或接收的代币,避免ERC20代币中存在的代币卡死問題。
  • 代币持有者可以授權或回收管理其代币的操作員權限。這些操作員通常是交易所

    合約或自動收費系統中的支付處理器。

  • 每個代币交易都包含

    userData

    資料字段,在操作員操作時也有類似的

    operatorData

    字段,進而可以自由地将資料傳遞給接收方。
  • 可以後向相容那些不支援

    tokensReceived

    函數的錢包。

3、ERC777規範

下面是ERC777規範的内容,完整描述可以到

官網

檢視:

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¹⁸。

Logo

ERC777剖析

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

後向相容性

ERC777沒有引入後向不相容問題,是以可以相容之前的ERC20代币标準。

在這個RIP中,沒有使用

transfer

transferFrom

進行代币轉賬,而是使用

send

operatorSend

來避免混淆與潛在的錯誤。與此同時,ERC777允許你實作ERC20中的

transfer

transferFrom

approve

allowance

以便相容ERC20。

是以一個代币合約可以同時實作ERC20和ERC777。隻讀函數例如

name

symbol

balanceOf

tokenSupply

以及内部資料例如餘額映射表等都可以毫無問題的重疊使用。但是需要注意的是,以下函數是ERC777規範強制要求的:

name

symbol

,不過

decimal

并非ERC777标準中的要求。

兩個标準中的寫操作函數都是解耦的,可以彼此獨立的操作。注意ERC20函數應當僅限于既有合約的調用。

如果代币合約實作了ERC20,那麼它必須通過ERC820注冊ERC20Token接口。如果合約支援切換啟用或禁止ERC20的方法,那麼每次進行切換時,該代币合約必須通過ERC820注冊或解除RC20Token接口的注冊。

對于實作ERC20的新合約而言,唯一的差別在于ERC777TokensSender和ERC777TokensRecipient通過ERC820的注冊必須早于ERC20的注冊。這意味着即使是對ERC20的

transfer

方法的調用,代币合約也必須通過ERC820檢查

from

to

是否實作了

tokensToSend

/

tokensReceived

接口并在可用時進行調用。注意當調用合約的ERC20的

transfer

方法時,如果合約沒有實作

tokensReceived

接口,那麼

transfer

也應當被接受,這意味着代币可能會被鎖定。

原文連結:

ERC777 vs. ERC20 - 彙智網

繼續閱讀