1. 程式人生 > 其它 >ERC1155和ERC721的區別(概括)

ERC1155和ERC721的區別(概括)

簡單來說,ERC1155 是 ERC721 的升級版,ERC1155 在 ERC721 的基礎上,主要增加或改善了如下功能:

同時支援可替換代幣(同質化代幣)和不可替換代幣(非同質化代幣);
批量轉賬: 僅需要一次智慧合約呼叫,就可以轉賬多種代幣資產;
批量查詢餘額:一次智慧合約呼叫可以查詢多種代幣餘額資料;
批量授權:一次智慧合約呼叫可以向指定地址授權多種代幣的使用權;
用再簡單一些的人話來講,就是一張 ERC1155 智慧合約,裡面可以同時包含類似 USDT 這種代幣,和類似 MekaVerse ,無聊猿等這種獨一無二的 NFT 代幣。 另外,傳統的 ERC721 合約,如果要轉移 NFT,必須一個一個操作,沒有辦法做到批量轉賬。而 ERC1155,則加入了類似“購物車”的概念,可以一堆代幣一次轉移。不要小看這個“批量”功能,要知道每次和區塊鏈互動,都要消耗 gas,如果有某些應用場景需要大量、頻繁轉移資產,那 ERC1155 相比 ERC721 則能節約大量的 gas 成本。

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

我們不妨對比一下 ERC721 和 ERC1155 合約的規範介面:
 ERC721

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

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 了。
 

function _mint(
    address account,
    uint256 id,
    uint256 amount,
    bytes memory data
) internal virtual {
    require(account != address(0), "ERC1155: mint to the zero address");
    address operator = _msgSender();
    _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);
    _balances[id][account] += amount;
    emit TransferSingle(operator, address(0), account, id, amount);
    _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
}