@@ -15,6 +15,162 @@ timezone: UTC+8
1515## Notes
1616
1717<!-- Content_START -->
18+ # 2025-08-19
19+
20+ ## EIP-1155 多代币
21+
22+ ** EIP-1155** 是以太坊的多代币标准,允许单个智能合约管理多种代币类型,包括同质化代币(FT)、非同质化代币(NFT)或其他配置(如半同质化代币)。
23+
24+ ### 核心特点
25+ - ** 单合约多代币类型** :一个部署的合约可以包含任意组合的同质化、非同质化代币
26+ - ** 高效批量转账** :支持一次交易转移多种代币类型
27+ - ** 降低 Gas 成本** :相比多个单独的代币合约,显著减少交易费用
28+ - ** 统一接口** :为所有代币类型提供标准化的操作接口
29+
30+ ## 与现有标准的对比
31+
32+ | 标准 | 特点 | 局限性 |
33+ | ------| ------| --------|
34+ | ERC-20 | 同质化代币 | 每种代币需要独立合约 |
35+ | ERC-721 | 非同质化代币 | 每个集合需要独立合约 |
36+ | ERC-1155 | 多代币类型统一管理 | 更复杂的实现逻辑 |
37+
38+ ## 核心接口
39+
40+ ### 主要函数
41+
42+ #### 1. 单个代币转账
43+ ``` solidity
44+ function safeTransferFrom(
45+ address _from,
46+ address _to,
47+ uint256 _id,
48+ uint256 _value,
49+ bytes calldata _data
50+ ) external;
51+ ```
52+
53+ #### 2. 批量代币转账
54+ ``` solidity
55+ function safeBatchTransferFrom(
56+ address _from,
57+ address _to,
58+ uint256[] calldata _ids,
59+ uint256[] calldata _values,
60+ bytes calldata _data
61+ ) external;
62+ ```
63+
64+ #### 3. 余额查询
65+ ``` solidity
66+ // 单个余额查询
67+ function balanceOf(address _owner, uint256 _id) external view returns (uint256);
68+
69+ // 批量余额查询
70+ function balanceOfBatch(
71+ address[] calldata _owners,
72+ uint256[] calldata _ids
73+ ) external view returns (uint256[] memory);
74+ ```
75+
76+ #### 4. 授权管理
77+ ``` solidity
78+ // 设置全部代币授权
79+ function setApprovalForAll(address _operator, bool _approved) external;
80+
81+ // 查询授权状态
82+ function isApprovedForAll(address _owner, address _operator) external view returns (bool);
83+ ```
84+
85+ ### 重要事件
86+
87+ #### TransferSingle 事件
88+ ``` solidity
89+ event TransferSingle(
90+ address indexed _operator,
91+ address indexed _from,
92+ address indexed _to,
93+ uint256 _id,
94+ uint256 _value
95+ );
96+ ```
97+
98+ #### TransferBatch 事件
99+ ``` solidity
100+ event TransferBatch(
101+ address indexed _operator,
102+ address indexed _from,
103+ address indexed _to,
104+ uint256[] _ids,
105+ uint256[] _values
106+ );
107+ ```
108+
109+ ## 接收者合约(Token Receiver)
110+
111+ 接收 ERC-1155 代币的智能合约必须实现 ` ERC1155TokenReceiver ` 接口:
112+
113+ ### 单个代币接收
114+ ``` solidity
115+ function onERC1155Received(
116+ address _operator,
117+ address _from,
118+ uint256 _id,
119+ uint256 _value,
120+ bytes calldata _data
121+ ) external returns (bytes4);
122+ ```
123+
124+ ### 批量代币接收
125+ ``` solidity
126+ function onERC1155BatchReceived(
127+ address _operator,
128+ address _from,
129+ uint256[] calldata _ids,
130+ uint256[] calldata _values,
131+ bytes calldata _data
132+ ) external returns (bytes4);
133+ ```
134+
135+ ## 安全转账规则
136+
137+ ### 关键规则
138+ 1 . ** 权限检查** :调用者必须获得转出账户的授权
139+ 2 . ** 地址验证** :接收地址不能是零地址
140+ 3 . ** 余额验证** :转出余额必须充足
141+ 4 . ** 事件发出** :必须发出相应的转账事件
142+ 5 . ** 合约检查** :如果接收者是合约,必须调用相应的钩子函数
143+
144+ ### 安全检查流程
145+ 1 . 验证转账参数有效性
146+ 2 . 检查授权和余额
147+ 3 . 更新余额状态
148+ 4 . 发出转账事件
149+ 5 . 如果接收者是合约,调用接收钩子
150+ 6 . 验证钩子返回值
151+
152+ ## 元数据标准
153+
154+ ### URI 模板
155+ 代币元数据 URI 支持 ID 替换:
156+ ```
157+ https://token-cdn-domain/{id}.json
158+ ```
159+ 其中 ` {id} ` 会被替换为64位十六进制代币ID(小写,补零)。
160+
161+ ### JSON Schema
162+ ``` json
163+ {
164+ "name" : " 代币名称" ,
165+ "decimals" : 18 ,
166+ "description" : " 代币描述" ,
167+ "image" : " https://example.com/image/{id}.png" ,
168+ "properties" : {
169+ "custom_property" : " 自定义属性值"
170+ }
171+ }
172+ ```
173+
18174# 2025-08-18
19175
20176##### ERC721
0 commit comments