ConsecutiveTransfer把一个连续token区间压缩进单个事件。区间两端都包含在内,所以1000到1999代表1000枚NFT;索引器若按半开区间处理,会永久漏掉最后一个token。
本文站在索引器角度解释闭区间展开、零地址语义和仅创建期使用的边界。
故障与停止条件
| 误判 | 正确处置 |
|---|---|
| 把端点当成半开区间漏掉最后一个ID | 保留原始证据,停止外推并按本文步骤复核 |
| 仍等待每枚NFT的Transfer事件导致供应量为零 | 保留原始证据,停止外推并按本文步骤复核 |
| 看到同名事件就忽略它是否在合约创建阶段 | 保留原始证据,停止外推并按本文步骤复核 |
把一个事件展开成所有权记录
若事件给出fromTokenId=1000、toTokenId=1999、fromAddress=0x0、toAddress=Alice,索引器应生成tokenId 1000至1999的1000条铸造所有权记录。展开数量公式是to-from+1,不是to-from。
| 地址组合 | 语义 | 索引动作 |
|---|---|---|
| from=零地址 | 连续批量铸造 | 为区间内每个ID建立Alice所有权 |
| to=零地址 | 连续批量销毁 | 删除或标记区间内所有权 |
| 双方非零 | 规范不鼓励用于普通运行期批量转移 | 检查实现与创建期限制 |
事件还带有operator,但它不能替代from/to解释。索引器要保存部署交易和合约创建区块,用它判断事件是否发生在规范允许阶段。
三个必须保留的事实
- 连续区间字段:ERC-2309用ConsecutiveTransfer事件表达从fromTokenId到toTokenId的连续token区间所有权变化,区间端点均包含在内。
- 铸造与销毁对照:批量铸造时fromAddress为零地址,批量销毁时toAddress为零地址;索引器需要展开区间而不是等待每枚NFT的Transfer事件。
- 索引器展开流程:规范限制该事件用于合约创建阶段的连续铸造场景,普通运行期转移仍应遵循ERC-721逐项事件语义。
操作前后逐项勾选
- 确认事件签名、合约地址和部署区块
- 校验toTokenId不小于fromTokenId并计算闭区间数量
- 按零地址方向区分铸造、销毁或异常转移
- 分批展开大区间并使用幂等主键避免重复写入
- 用ownerOf抽样首尾和中间token核对索引结果
把创建期限制写进回归测试
回归用例先准备一份黄金样本:对象、网络、版本和预期结果均已知。脚本完成“确认事件签名、合约地址和部署区块”后只保存原始数据,再由独立模块执行“校验toTokenId不小于fromTokenId并计算闭区间数量”。黄金样本的作用是发现实现变化,不代表其他对象天然安全;测试报告必须注明它覆盖的具体范围。
负向用例至少两条。第一条构造“把端点当成半开区间漏掉最后一个ID”,第二条构造“仍等待每枚NFT的Transfer事件导致供应量为零”。两条用例分别运行,禁止同时改变多个字段。合格实现会保留原始错误并停止在对应层级;自动切换网络、猜测未知字段或引用旧缓存都应让用例失败。
状态用例在动作前取得连续区间字段快照,执行“按零地址方向区分铸造、销毁或异常转移”后再次取证,并对照铸造与销毁对照和索引器展开流程。如果状态由节点视图、缓存或索引延迟造成,结果应注明观察来源。A时点和B时点必须各自保留,不能只存一条被覆盖的最终记录。
发布前由人工检查结果页是否同时显示原始字段、推导规则、单位或版本以及三态结论。触发“看到同名事件就忽略它是否在合约创建阶段”时,系统必须建议“分批展开大区间并使用幂等主键避免重复写入”并停止自动动作。回归记录由此覆盖正常、错误、状态变化和人工接管四条路径。
来源、增量与风险边界
| 来源 | 本文用途 |
|---|---|
| Ethereum Improvement Proposals | 正式接口、字段与规范语义 |
| ERC-721 | 实现路径、兼容性或安全边界 |
本文资料读取于2026-07-20。历史实现可能偏离创建期限制,索引服务应保存合约版本与部署交易,不能仅按事件名称推断合规。
站内相邻主题可继续阅读:NFT铸造核验、事件解码。历史合约可能偏离标准。索引服务应标记实现版本和部署交易,不因事件名称相同就断言完全兼容ERC-721。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。