rarity 计算、筛选器、地板价统计,几乎每个 NFT 市场功能都建立在一句前提上:这件东西有哪些特征。可特征怎么在元数据里写,各家项目各写各的,于是 Algorand 社区写了 ARC-16——一份标题就叫”约定:如何声明 NFT 的特质”的文档,状态 Final,属于数据类、ASA 子类。它不改协议,只给 traits 这个键定一个必须遵守的形状。
三条硬规则
ARC-16 用 RFC-2119 的语气词下了三条命令。第一,如果元数据里任何位置出现 traits 这个属性,它就必须符合文档给出的 schema。第二,如果这件 NFT 属于某个更大的集合,而该集合有特质,那么集合可用的全部特质都必须作为 traits 对象的属性列出来。第三条最容易被忽视:这件 NFT 若不具备某个特质,它的值必须写成字符串 “none”。
这三条合起来解决的是同一个统计问题。假设一个集合有”帽子”这一维,只有戴帽子的成员才写帽子字段,市场就分不清”没帽子”和”项目忘了写”——稀有权重会算错,筛选器会漏件。强制列全加显式 none,把”缺失”从模糊状态变成有语义的取值:一个属性出现在 traits 里,值域就是集合特质名;没出现才是真的不参与该维度。

与校验字段的配合
ARC-16 abstract 里给的示例形状是一份带 name、description、image 与 traits 的 JSON,traits 下面按维度列值,未具备者填 “none”。文档还展示了”无特质 NFT”的写法:文件里带一个 image_integrity 字段,值是 base64 形式的 SHA-256 摘要——把这条与 ARC-69 的 am 字段合起来读,Algorand 的媒体可信链就是:URL 与摘要定死原件,traits 结构定死属性语言,两者都靠约定文档而非协议强制。
布尔、数组与数字也是值
ARC-16 允许 traits 的值取多种类型:字符串、数字、数组、布尔都可以,只要与声明的 schema 一致。这个自由度在稀有度工具里会引发实际问题——“有纹身”写成 true、“4 处纹身”写成 4、“红蓝两套”写成数组,同一维度三种表达,跨市场的统计算法未必都按文档处理。把 traits 原文导出自己算一遍,是绕开口径分歧最便宜的方法。
还有一层与稀有度的关系值得点破:稀有度从来不是协议概念。链上没有任何字段规定红背景比蓝背景少,所谓稀缺全部来自这份 traits 声明的统计——声明错一行,全集合的排序跟着错。ARC-16 解决的是可比性,可比不等于正确,正确性要回到铸造脚本与生成器那端。
示例文件的形状
ARC-16 的正文以 JSON 代码块给出结构:traits 对象里每个键是一个特质维度名,值可以是字符串、数字、数组或布尔,文档为每一类都给了示例。一件带属性的 NFT 长这样——traits 下 background 为红色、shirt_color 为蓝色、glasses 为 none、tattoos 为数字 4;“无特质 NFT”的示例则演示了另一件事:文件顶层带 image_integrity 字段,值是以 base64 编码的 SHA-256 摘要,形如 sha256- 前缀加一串 base64 字符。把这条与 ARC-69 的 am 字段并排读,整条媒体可信链就完整了:URL 与摘要锁原件,traits 结构锁属性语言,两边都靠解析器自愿采纳。
几份数据类约定叠在一起是有层次的:ARC-3 定元数据 JSON 的字段语言,ARC-16 定特质声明格式,ARC-69 定含媒体资产的参数写法,ARC-72 给合约型 NFT 接口,ARC-89 再把元数据供给收进注册表。它们都属于”约定”而非协议强制,读任何一份稀有度报告之前,先假定统计口径可能错,原始 traits 数组才是底账。
特质之外还有价格、供应量与转手史,这些不在 ARC-16 管辖内;把任何一维当成价值依据都是统计之外的跳跃。约定改变的是数据形状,不是数据背后的商业事实。
读一份 traits 时的自查顺序
先确认它声明的标准号,再看 traits 是否与集合说明的维度一致(缺维度和凭空多出的维度都是警告信号);然后核对 none 用得是否规范,把 none 当 0 或者空串处理的解析器会给出错误的稀有度。最后一步仍是把图片哈希与链上摘要对一遍。特质结构让统计可比,但不改变作品本身的价值判断;稀有度数字不是价格承诺,也不是本文要给出的结论。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。