ERC721和ERC1155协议对比

Seven 2022-02-16 09:37:58
Categories: > > Tags:

区别

開始介紹 ERC1155 智能合約的寫法之前,我覺得先要說說 ERC1155 和 ERC721 到底有什麼區別。 簡單來說,ERC1155 是 ERC721 的升級版,ERC1155 在 ERC721 的基礎上,主要增加或改善了如下功能:

用再簡單一些的人話來講,就是一張 ERC1155 智能合約,裡面可以同時包含類似 USDT 這種代幣,和類似 MekaVerse無聊猿等這種獨一無二的 NFT 代幣。 另外,傳統的 ERC721 合約,如果要轉移 NFT,必須一個一個操作,沒有辦法做到批量轉賬。而 ERC1155,則宛如加入了類似「購物車」的概念,可以一堆代幣一次過轉移。不要小看這個「批量」功能,要知道每次和區塊鏈交互,都要消耗 gas,如果有某些應用場景需要大量,頻繁轉移資產,那 ERC1155 相比 ERC721 則能節約大量的 gas 成本。

我們可以試想一下,假如現在想要創作一款區塊鏈遊戲,裡面有類似 USDT 的可替換同質化代幣以進行金融操作,也需要有各種遊戲裝備,英雄角色等獨一無二不可替換代幣來進行遊戲,這兩種代幣也需要透過一定的機制進行交易互換,這個場景,使用 ERC1155 則可以完美實現。

替代品和非替代品

ERC-721:仅限于不可替代品

ERC-1155:允许替代品和非替代品

ERC-1155:允许新概念,例如半替代性代币。例如,可替代令牌可以被“转换”为不可替代代币,反之亦然。

批量转移

ERC-721:支持一次转移一个代币

ERC-1155:支持在单个事务中批量转移许多代币ID。

(由于每个以太坊交易大约需要15-30秒,所以ERC-721需要很长时间才能传输许多代币,而ERC-1155可以在单个块中发送数百个不同的代币

对于ERC-1155的某些优化实现已针对每秒最多传输150-200个代币!)

单个智能合约,不浪费数据

ERC-721:需要为每种新型令牌部署新的智能合约(例如,CryptoKitties合约,CryptoCuties合约等)

ERC-1155:可在单个智能合约中部署无限代币类型。

* ERC-1155令牌不能意外锁定在不支持ERC-1155的合同中。

您只能将代币发送到支持ERC-1155的合同!这样可以防止意外的代币丢失–如果收件人不支持ERC-1155,则会立即还原您的代币

ERC-721试图实现这一目标,但最终无济于事,因为它们在标准中包括了传统的“非安全”功能。如果钱包使用非安全转移方法,则您的代币可能会永久丢失。

通过发送代币触发智能合约将

ERC-1155代币发送到智能合约可以触发区块链上的一系列功能和事件。例如,交换(DEX)可以允许用户直接发送代币,而交换到另一个代币将在原子链上即时进行。

由于这些代币遵循严格的“ onERC1155Received”规则,因此使用ERC-1155可以100%可靠。

您不能依赖使用此方法发送的ERC-721代币,因为它支持非安全传输。如果钱包使用非安全转移将代币发送到该交易所,它将丢失给用户。

这意味着dapp无法依赖预期行为的ERC-721接收器功能。这些应用程序将无法创建,因为它们与ERC-721不兼容。

本地化

ERC-721:仅支持1种语言

ERC-1155:支持所有元数据的语言本地化,例如代币名称,描述,甚至代币图像。这使所有代币通用。

旧版元数据

ERC-721:包含传统元数据,例如“符号”和“名称”,这对于许多现代代币而言并非必需

ERC-1155:将所有元数据推迟到可以在Web或IPFS上的URI中

ID替代

ERC-721:仅支持静态元数据,因此每个代币ID必须具有由智能合约存储或管理的元数据URI。

ERC-1155:合同可以指向无数个代币URI,而无需在链上存储任何其他数据。这甚至可以用于指向Web服务,该服务为数据库中的每个代币托管动态生成的代币JSON。

丰富事件日志

ERC-721:发出转移和批准。

ERC-1155:包括薄荷糖,烧伤,转移,批准和元数据更改的标准化事件。这样可以带来很酷的生态系统收益,例如对代币和丰富的令牌浏览器进行深度数据分析。

你有它!使ERC1155成为可能的人的见解。我对Enjin将为区块链游戏领域带来的其他事物感到非常兴奋,希望您也是如此!

接口规范

ERC721

1
2
3
4
5
6
7
8
9
function balanceOf(address _owner) external view returns (uint256);
function ownerOf(uint256 _tokenId) external view returns (address);
function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
function approve(address _approved, uint256 _tokenId) external payable;
function setApprovalForAll(address _operator, bool _approved) external;
function getApproved(uint256 _tokenId) external view returns (address);
function isApprovedForAll(address _owner, address _operator) external view returns (bool);

ERC1155

1
2
3
4
5
6
function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external;
function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data) external;
function balanceOf(address _owner, uint256 _id) external view returns (uint256);
function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory);
function setApprovalForAll(address _operator, bool _approved) external;
function isApprovedForAll(address _owner, address _operator) external view returns (bool);

可以明顯看到,ERC1155 在原有 ERC721 基礎上增加了很多 batch 的接口。再看看 OpenZeppelin 中的 ERC1155 實現,其中的 mint function 增加了 amount 參數, 不難想象,如果 amount = 1, 則代表這個代幣總共只發行一個,那這個代幣就是類似 ERC721 的 NFT 了。

附言

参考资料