ERC-1155批量转账怎么解码? 图 1
ERC-1155批量转账怎么解码? · 图 1

ERC-1155的资产身份由“合约地址 + token ID”共同决定。ID 7在两个合约中不是同一资产,同一合约里不同ID也可以有完全不同供应规则。标准允许一个批量调用同时转移多个ID与数量。

safeBatchTransferFrom检查什么

调用参数包含from、to、ids、values和data。ids与values数组长度必须相同,第i个数量对应第i个ID;调用者必须是from或获得operator approval。实现必须按数组顺序更新余额,并用一个或多个TransferSingle或TransferBatch事件完整反映所有变化;OpenZeppelin常见实现会发出一条TransferBatch。若to是合约,还要调用足够次数的ERC1155Receiver回调覆盖全部余额变化。

接收合约必须返回正确选择器

对一次余额变化,标准建议调用onERC1155Received,也允许调用onERC1155BatchReceived;对多次余额变化,建议批量回调,也允许用足够次数的单笔回调覆盖全部变化。每次调用都要核对对应magic value;返回值不匹配、revert或缺少必要接口时,安全转账应整体回滚。转给代币合约自身时,标准允许跳过相应接收回调。这些规则能减少资产被发送到无法处理的合约,但不能防止用户把资产发给错误EOA。

事件字段单笔TransferSingle批量TransferBatch
operator操作发起者操作发起者
from / to资产流向资产流向
id / ids单个IDID数组
value / values单个数量与ids同长度数组

怎样从事件重建供应和余额

标准要求铸造使用from为零地址的Transfer事件,销毁使用to为零地址。索引器可按合约、ID和账户累加事件,但必须从合约部署起完整处理,并应对链重组、批量数组与重复区块。漏掉一次TransferBatch中的某个索引,或漏处理同一批量调用产生的多条TransferSingle,都会让后续余额永久漂移。

链上balanceOf和balanceOfBatch是当前状态的权威查询。事件重建用于历史分析,应定期与固定区块余额抽样对账。自定义合约若违反事件要求,索引器需要标记异常,不能默默修正。

ID本身不告诉你是不是NFT

某ID供应量为1时表现得像NFT,供应量可多份时表现得像同质资产;标准没有强制所有ID唯一,也没有保证metadata永不变化。市场展示要读取uri规则、验证媒体来源,并明确数量。看到ERC-1155标签不能直接套用ERC-721的所有权模型。

批量操作的安全注意

接收器回调会把控制权交给外部合约;实现应先完成该回调所覆盖的内部状态更新和事件,再调用接收器,并防止重入破坏不变量。用户签名时应展开全部ids和values,恶意页面可能在长数组中夹带高价值ID。

单笔与批量事件不能混着解析

TransferSingle的operator、from和to位于indexed topics,id与value在data;TransferBatch的前三个indexed字段相同,但data是两个动态uint256数组。解析器必须依据事件签名选择ABI,再检查ids和values长度相等。把批量data按两个静态整数读取,会得到看似合法但毫无意义的偏移量。

铸造与销毁分别通过from或to为零地址表达,operator不一定等于资产所有者。统计持仓时要按每个id独立加减,并处理同一交易多次事件;URI事件更新的是某个id的元数据位置,不能把合约级name/symbol当成每个资产的唯一描述。

接口探测见ERC-165,日志数组解码见topics与data,NFT版税查询可继续看ERC-2981