ERC1155 学习

理解 ERC1155 标准:多功能的以太坊代币标准

区块链技术在不断进步,新的代币标准也在不断涌现。继 ERC20 和 ERC721 之后,ERC1155 作为一种多功能代币标准,正越来越受到关注。本文将面向新手,结合类比与个人见解,深入浅出地讲解 ERC1155 标准。

什么是 ERC1155 标准?

ERC1155(Ethereum Request for Comments 1155)是由 Enjin 团队提出的一种新的代币标准。与 ERC20 和 ERC721 不同,ERC1155 标准支持多种代币类型,包括同质化代币(Fungible Token)和非同质化代币(Non-Fungible Token),甚至是半同质化代币(Semi-Fungible Token),都可以在同一个智能合约中实现。

我的理解

ERC20 代币就像是银行发行的货币,每一张 100 元钞票都是一样的,可以互换。
ERC721 代币则像是艺术家的独特作品,每一件都是独一无二的,无法互换。
ERC1155 则像是一个多功能钱包,里面既可以装同样的钞票,也可以装不同的艺术品,甚至还可以装限量版的邮票(半同质化代币)。

为什么 ERC1155 标准很重要?

  1. 多功能性:ERC1155 标准允许在一个合约中同时管理多种类型的代币,这大大简化了代币管理和操作。

  2. 节省 Gas 费:与多个单独的 ERC20 或 ERC721 合约相比,ERC1155 合约在进行批量转移时可以显著减少交易成本,节省 Gas 费。

  3. 更高的灵活性:ERC1155 标准提供了更高的灵活性,允许创建和管理复杂的游戏物品、收藏品和其他数字资产。

ERC1155 标准的核心功能

ERC1155 标准定义了一些基本函数和事件,确保代币的基本操作。以下是 ERC1155 标准中最重要的一些功能:

基本函数

  • balanceOf: 返回某地址拥有的特定代币数量。

    function balanceOf(address _owner, uint256 _id) public view returns (uint256);
    
  • balanceOfBatch: 批量返回多个地址拥有的多个代币的数量。。

    function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) public view returns (uint256[] memory);
    
  • safeTransferFrom: 将特定数量的代币从一个地址转移到另一个地址。

    function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes calldata _data) public;
    
  • safeBatchTransferFrom: 批量将多个代币从一个地址转移到另一个地址。

    function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) public;
    

事件

  • TransferSingle: 当单个代币转移时触发。

    event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value);
    
  • TransferBatch: 当多个代币批量转移时触发。

    event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values);
    
  • ApprovalForAll: 当授权或撤销某地址管理所有代币的权限时触发。

    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    
  • URI: 当某个代币的 URI 更改时触发。

    event URI(string _value, uint256 indexed _id);
    

DEMO

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract MyERC1155Token is ERC1155, Ownable {
  constructor() ERC1155("https://example.com/api/token/{id}.json") {}

  function mint(address account, uint256 id, uint256 amount, bytes memory data) public onlyOwner {
      _mint(account, id, amount, data);
  }

  function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) public onlyOwner {
      _mintBatch(to, ids, amounts, data);
  }
}

可以把 ERC1155 智能合约想象成一个多功能打印机,mint 函数就像是打印单张照片,而 mintBatch 函数则像是批量打印多张照片。这台打印机既可以打印相同的照片(同质化代币),也可以打印每张都不同的艺术品(非同质化代币),甚至还能打印限量版的系列(半同质化代币)。

posted @ 2021-02-19 10:43  sorachannel  阅读(548)  评论(0)    收藏  举报