概述
ERC1155用于多种代币管理的合约标准接口。 单个部署的合约可以包括同质化代币、非同质化代币或其他配置(如半同质化代币)的任何组合。 这样一来,ERC-1155 代币就具有与 ERC-20和erc-721代币相同的功能,甚至可以同时使用这两者的功能。 它改进了 ERC-20 和 ERC-721 标准的功能,提升了效率并纠正了实现中的明显错误。
功能和特点
批量传输
批量传输与常规 ERC-20 传输非常相似。ERC-1155 中唯一的区别是我们将值作为数组传递,同时也传递了 ids 数组。
// ERC-20
function transferFrom(address from, address to, uint256 value) external returns (bool);
// ERC-1155
function safeBatchTransferFrom(
address _from,
address _to,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external;
批量余额
可以在单次调用中获取多个余额,参数中传递所有者帐户数组和代币的 id 数组。
// ERC-20
function balanceOf(address owner) external view returns (uint256);
// ERC-1155
function balanceOfBatch(
address[] calldata _owners,
uint256[] calldata _ids
) external view returns (uint256[] memory);
批量审批
审批过程与 ERC-20 略有不同。 这里不是批准特定金额,而是通过 setApprovalForAll
函数设置操作帐户为已批准或未批准。查看当前的审批状态可以通过 isApprovedForAll
完成。要么全部批准,要么不批准。 不能定义要批准代币的数量,甚至代币类型。你只能批准一个地址的所有代币。
// ERC-1155
function setApprovalForAll(
address _operator,
bool _approved
) external;
function isApprovedForAll(
address _owner,
address _operator
) external view returns (bool);
接收钩子
function onERC1155BatchReceived(
address _operator,
address _from,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external returns(bytes4);
ERC-1155 只支持智能合约的接收钩子函数。 钩子函数必须返回一个事先预定义的 4 字节值,这个值被指定为:
bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
当接收合约返回这一值时,意味着合约知道如何处理 ERC-1155 代币并接受转账。
支持非同质化代币
当供应量仅为 1 时,代币本质上就是一个非同质化的代币 (NFT)。 按照 ERC-721 的标准,你可以定义一个元数据网址。
安全转账规则
- 调用者必须获得批准才能从
_from
的帐户地址消费代币,或者调用者帐户地址必须与_from
的帐户地址相同。 - 在以下情况下,转账调用将回退
_to
地址为 0;
_ids
的长度与_values
的长度不同;_ids
中代币持有者的任何余额低于发送给接收者的相应_value
金额。- 出现任何其他错误。