ERC777是一個新的進階代币标準,可以視為ERC20的更新版本,是以它解決了ERC20以及ERC223存在的一些問題,開發者可以根據自己的具體需求進行選型。
1、使用ERC820進行合約注冊
有别于ERC20的自由散漫,ERC777利用了新的
ERC820标準提供的集中式的智能合約系統資料庫和合約接口實作查詢功能,以實作某種程度的内省。中心化的注冊機制有助于後向相容性以及更好的功能擴充。一個期望調用ERC777的DApp或智能合約,就可以利用EIP-820傳回的ITokenReceipt接口來确定目标合約是否實作了期望的接口。
2、ERC777概述
ERC777改進了ERC20代币中存在的很多不足,例如,ERC777支援操作員白名單,提供以太币相容的
send()
接口,利用ERC20實作後向相容等。下圖展示了ERC777代币的轉賬實作流程:

要快速掌握以太坊區塊鍊應用開發,推薦彙智網的線上互動教程: 以太坊DApp開發入門 | 以太坊電商DApp實戰 ERC721以太坊通證明戰 Web3j以太坊開發詳解 Php以太坊開發詳解 Python以太坊開發詳解 C#以太坊開發詳解 Flutter以太坊開發詳解
與ERC20相比,ERC777有以下方面的優勢:
- 采用與以太币一緻的哲學發送代币,即采用接口
。send(dest,value,data)
- 任何合約都可以定義收到代币時觸發的
tokensReceived
事件,這避免了在ERC20代币
中存在的雙重調用問題。
- 合約和正常位址都可以通過注冊一個
或tokensToSend
函數來控制或拒絕發送或接收的代币,避免ERC20代币中存在的代币卡死問題。tokensReceivedFunction
-
代币持有者可以授權或回收管理其代币的操作員權限。這些操作員通常是交易所
合約或自動收費系統中的支付處理器。
- 每個代币交易都包含
資料字段,在操作員操作時也有類似的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代币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 - 彙智網