ARC-89 的 ASA 元数据注册表:把说明书挂进链上合约而不是外部站点 图 1
ARC-89 的 ASA 元数据注册表:把说明书挂进链上合约而不是外部站点 · 图 1

ARC-69 把说明书塞进交易备注,ARC-89 换了一条路:既然账本没有专门的元数据字段,那就建一个所有人都能查询的合约,把元数据放在里面。这份文档定义了一个单例应用(singleton application)的接口与实现,通过 Algod API 或者在 AVM 内部直接提供 Algorand 标准资产的元数据。

它想解决的形状

ARC-89 的动机段落把问题说得很直白:ASA 在账本上缺少专门的元数据字段,而这个空缺让生态采用了”不太理想的方案”去发现和获取链下资产数据——依赖 Indexer、依赖外部基础设施(例如 IPFS),或者在 ASA 的角色权限上做文章来实现元数据可变性。文档的观点是:图片这类大块数据放链下是务实且被推荐的做法,但更小、更贴合资产本身的数据,不应该付外部基础设施的那套成本、可用性与延迟的代价。

它同时明确了边界:不鼓励把 Algorand 当分布式存储系统去塞能放在别处的数据。换句话说,ARC-89 不是”把 JPG 搬上链”,而是给”这台资产的说明书在哪儿、长什么样”一个标准答案。

ARC-89 的 ASA 元数据注册表:把说明书挂进链上合约而不是外部站点 图 2
ARC-89 的 ASA 元数据注册表:把说明书挂进链上合约而不是外部站点 · 图 2

Last Call 阶段怎么读

规范头部的几个字段值得解释。Last Call 意味着文本进入定稿前的公开征询窗口:接口签名基本冻结,社区在期限内核验实现细节。implementation-required 加 implementation-url 则是”无实现不算合规”的声明,配合基金会担任维护者的信息,读出来的含义是:这套注册表在 Algorand 侧是被当作基础设施建设的,不是某个团队的自选动作。supersedes 一栏写明它取代 ARC-19 与 ARC-69——对新资产,这是首选;对老资产,历史不会重写,生态里会长期存在”字段合规但没有注册表条目”的藏品。

把这三行合起来读,能避免一个常见误读:“支持注册表”不是全有全无的开关,而是”这个资产的说明是否恰好在这个应用里有一份”的事实查询。任何解析器在查不到时都必须回退到旧路径(读交易 note、按 URL 抓取),规范自己给出的正是这种共存画面。

两代约定的分工

ARC-89 与 ARC-69 的分界可以背成一句口诀:说明书在交易里,还是在合约里。ARC-69 把 JSON 挂在资产配置交易的 note 上,查询要回溯交易历史;ARC-89 集中在一个单例应用里,按资产 ID 直取。两种形态对市场工程的要求完全不同,对同一件资产”元数据在哪”也可能给出不同答案。判断一件 Algorand 藏品属于哪一代,可靠路径不是看公告里的标准号,而是打开资产的 URL 字段核对它是否以注册表的标准化 URI 开头,再去那个应用的本地状态里查这个资产 ID 有没有条目。

状态行同样要读:Last Call 表示文本进入定稿前的公开征询窗口,implementation-required 表示它不是一份可选项的说明书——生态要按规范交实现。URL 字段能查到”这份数据在这里”,查不到”这份数据被谁锁死了”:注册表应用的权限结构由部署方配置,元数据更新权在谁手里,仍然要单独核实。

接口形状与新旧交替

实现上,元数据通过这个单例应用查询:外部程序走 Algod 的接口取,链上合约可以在 AVM 执行中直接读。文档规定数据类型的解释方式沿用 ARC-4,并声明自己依赖一组既有 ARC、取代 ARC-19 与 ARC-69、扩展 ARC-3 等标准——这三行元数据本身就是读懂它位置的关键:它不是平行选项,而是把前辈收编的下一代。

对解析器来说,落地变化体现在资产 URL 字段上:ARC-89 确立一个标准化的 URI,看到这个前缀就知道说明书应当去注册表取,而不是当成一个普通网站地址去请求。市场的”元数据加载失败”从此有了可归类的两种情形:非注册表资产的外部依赖挂了,与注册表本身查询失败。

状态方面需要注意:ARC-89 的文本头部标记它处于 Last Call 阶段,且实现为必须(implementation-required),实现仓库由基金会维护。判断一件藏品是否真的用上了这套机制,不能只看它声明了标准号,要看资产的 URL 字段是否指向那个标准化前缀、对应资产 ID 在注册表应用里是否查得到条目。

链上元数据解决的是可读与可达,不解决稀缺与价值。任何解析成功都不等于作品真实或价格有支撑,本文不构成投资建议。