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 标准很重要?
-
多功能性:ERC1155 标准允许在一个合约中同时管理多种类型的代币,这大大简化了代币管理和操作。
-
节省 Gas 费:与多个单独的 ERC20 或 ERC721 合约相比,ERC1155 合约在进行批量转移时可以显著减少交易成本,节省 Gas 费。
-
更高的灵活性: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 函数则像是批量打印多张照片。这台打印机既可以打印相同的照片(同质化代币),也可以打印每张都不同的艺术品(非同质化代币),甚至还能打印限量版的系列(半同质化代币)。

浙公网安备 33010602011771号