• 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);
    }
     
  • 相关阅读:
    Redis原理篇
    Redis基础
    CentOS7 Redis5.0.5环境搭建
    通用后台管理系统(10)项目打包、修改配置文件、项目开源地址
    通用后台管理系统(9)-编写首页接口、实现、控制器
    通用后台管理系统(8)-编写登入控制器
    生成常用的msf
    badusb资料收集
    后渗透之meterpreter攻略
    linux命令备忘录
  • 原文地址:https://www.cnblogs.com/peteremperor/p/16162694.html
Copyright © 2020-2023  润新知