NEAR 生态的 NFT 标准是一组分层文档:NEP-171 定核心(转账、查所有权、查审批),NEP-178 加可替换语义,NEP-180 管元数据,而 NEP-181 补的是枚举——官方文档给它的定位是”计数与获取代币的标准接口,可按整个合约或按某个持有人来数”,状态 Final,要求依赖 NEP-171 核心。一句话概括:核心标准让合约能收能转,枚举标准让钱包和市场能列出你手里有什么。
枚举缺失时应用层会多难受,值得还原一下。核心接口只回答”token_id X 的主人是谁”,你无法从一枚 id 推出下一枚 id,更无法知道一个账户名下的全部藏品——钱包要渲染资产页,只能让索引服务在链外把转账事件全部扫一遍再回吐;索引滞后,页面就缺币,用户会以为资产丢了。NEP-181 把这些查询搬进合约:nft_supply_for_owner 给某个账户的持有数量,nft_tokens 按 from 和 limit 返回一段带元数据的代币列表,从某个 id 之后继续翻页;面向持有人还有 nft_tokens_for_owner。三条查询都返回结构化数组,市场与钱包直连合约即可分页拉全。
文档的理由部分点了一个关键取舍:有些合约为了省存储费会放弃这个扩展。NEAR 的存储模型要求写入者预付押金,枚举索引意味着每一次转账都要多维护一份表,发行方可以选择不建。于是”枚 NFT 不支持枚举”在 NEAR 上是合法状态而非缺陷,钱包遇到不支持枚举的合约会退回索引服务兜底。读接口返回空数组和”该合约未实现枚举”是两回事,前者是链上真没有,后者要看合约声明的 extensions 列表,NEP-180 的合约元数据里带版本与扩展信息,核对支持性先看这里。
分页语义还有一个容易误读的点:nft_tokens 的 from 参数是”从这个 token_id 之后开始”,返回按 id 排序的一段;nft_tokens_for_owner 同理按持有人过滤。抓取全量数据正确写法是循环:limit 设一页大小,上一页返回的最后一个 id 作为下一页的 from,直到返回空。把 limit 设大想要一次拉完并不可靠,返回体量受合约实现影响,逐页推进才是文档预期的用法。
持有人自查的实操因此变得很短:进合约页调 nft_supply_for_owner 填自己的账户名,拿到的数字应当等于钱包资产页的枚数;对不上,先看差的那几枚是不是最近刚转入(索引滞后),再用 nft_tokens_for_owner 直接从合约拉一遍列表。两个数字一个来自链上合约、一个来自链外索引,冲突时以合约为准——这条原则在 NEAR 与在其他链上没有区别。
最后把它放回 NFT 标准史里看位置。以太坊用 ERC-721 加Enumerable 扩展解决同样的问题,Solana 靠中心化索引,Cardano 靠 Opaque 地址扫描,NEAR 的选择是把枚举做成独立的正式 NEP 并由版本元数据声明。各家的差异不在”能不能列出藏品”,而在列不出来时谁背责任:合约声明了支持却返回错误,是合约的锅;合约声明不支持,是钱包该有兜底的锅。分清这两种情形,遇到”钱包显示不全”就不会先慌。合约版本、扩展声明与当前部署地址以 NEAR 官方标准页与链上合约元数据为准。
把 NEP-181 与 ERC-721 的对应关系摆出来最便于迁移理解:nft_supply_for_owner 对应 balanceOf,nft_tokens 对应按 id 枚举的那组函数,nft_tokens_for_owner 对应 tokenOfOwnerByIndex。语义几乎同构,差别在返回形态——NEAR 的枚举直接带元数据回来,省掉了列表拿到 id 后再逐个查元数据的二次请求,钱包列表页因此一次调用就能渲染。代价也在这里:带元数据的返回体更大,limit 参数就是为此存在的节流阀。设计自己的发行合约时,这个取舍值得先想清楚:列表流畅度与每次调用的响应体积,走的是同一个旋钮。
本文为机制说明,不构成任何投资建议。

发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。