给钱包地址取个好名字:Tezos TZIP-22 靓名解析的字段与登记方式 图 1
给钱包地址取个好名字:Tezos TZIP-22 靓名解析的字段与登记方式 · 图 1

钱包界面里那串 tz1 打头的长地址,正在被越来越多的 tezos 应用换成一个人类可读的名字。这背后不是各家钱包各自的词表,而是一份正式标准:TZIP-022 靓名解析。它 2021 年 1 月 6 日创建,状态 Final,目标用一句话概括——让生态里所有产品用同一套接口把名字与地址对起来,给用户一致的体验。

标准先诊断了旧做法的毛病。提案的 Motivation 部分列了三条:许多钱包与索引器靠预配置名单(有些干脆写死在代码里)来关联名字与地址,这类名单难维护、易过时;另一些直接借用 TZIP-016 合约元数据里的名字,但元数据是发布在各自合约里的,既非全局唯一也谈不上权威;而个人钱包这类”不属于任何合约”的地址,前两种办法根本覆盖不到。这三条批评界定了 TZIP-022 的设计边界:名字要解析,就得有一个中立的、可查询的登记处,而不是散落在合约与配置文件里的碎片。

接口本体借用了 TZIP-016 的离链视图机制。实现 TZIP-022 的合约必须同时实现 TZIP-016,并在元数据的 interfaces 字段里登记形如 TZIP-022-提交哈希 的标识,让工具能确认版本。然后提供两个离链视图:resolve-name 收一个 UTF-8 编码的字节串(名字),resolve-address 收一个地址;两者的返回都是可选的解析结果,查不到或已过期就返回空。注意这两个方向都必须支持——从名字查地址、从地址查名字,是同一份登记表的两个索引。

解析结果 resolution_result 是记录型数据,四个字段各有讲究。name 是解析出的名字(UTF-8 字节);address 是可选地址,有些登记可能只声明别名而不含转账地址;data 是一个字符串到字节的映射,值要求是合法 JSON——给扩展信息留的口子;expiry 是可选的失效时间戳,指信息不再有效的那一秒起点。规范对过期写得非常硬:返回的 expiry 永远不会落在过去,若信息已经过期,两个视图必须返回空——失效即不存在,不留”过期但还能查出来”的暧昧状态。

标准没有规定名字从哪来、由谁裁决。这是有意为之:tezos 生态里存在多个注册合约(域名系统、靓名服务、DAO 名册),TZIP-022 只统一”怎么问”,不统一”问谁”。钱包要展示地址的别名,可以依次询问它信任的若干个符合 TZIP-022 的合约,取第一个有效答案;不同钱包信任列表不同,同一地址在不同钱包里显示的名字可能不同——这恰恰是标准希望透明化的部分:名字是解析服务的声明,不是链上所有权的组成部分。

对 NFT 收藏场景,这份标准改变的是核对体验。给合约或项目方转账时,钱包显示”某某官库”比显示 36 个乱码字符更让人安心,前提是这个名字来自你信任的解析合约。反过来也提醒两点:其一,看到带名字的收款方不代表安全,攻击者可以在自己的登记服务里把恶意地址注册成诱人的名字,信任锚应该是解析合约本身而不是名字文本;其二,带 expiry 的名字可能改朝换代,项目方迁移金库、更换治理合约后,旧名字到期消失或指向新地址,转账前用钱包的”查看解析详情”确认来源与有效期,是几秒钟的保险。

工程侧的实现要点集中在容错。视图是只读的离链查询,不消耗 gas,钱包可以放心批量预热联系人列表;解析结果缓存必须尊重 expiry 字段,过期前重新拉取;data 里的 JSON 字段是扩展区,展示方认识哪个键用哪个,不认识就忽略,别把未知字段当错误。整套设计沿用了 tezos 标准的一个共同哲学:把”数据怎么读”定义干净,把”数据谁负责”留给市场分工。

本文为机制说明,不构成任何投资建议。