一个 Tezos FA2 合约装下多种 NFT:TZIP-12 的代币编号与元数据大映射
一个合约,多种资产
Tezos 上最主要的代币标准叫 FA2,规范文本是 TZIP-12。它和 ERC 家族最大的区别在开头这一句:一个 FA2 合约可以同时定义多种代币,每种代币有自己的编号(token_id),可以是同质的,也可以是非同质的。官方文档说得很直白——如果合约只有一种代币,它的编号必须是 0;多种类型时,编号取互不相同的值即可。对 NFT 项目来说,这带来一种省事的写法:一个合约装下一整个系列,每个编号一枚 NFT,不用像早期 EVM 实践那样每个合集部署一个合约。钱包和应用因为都按 FA2 接口访问,也不需要对每个项目做定制。

NFT 的账本长什么样
TZIP-12 为 NFT 型合约规定了比较明确的存储形态:在所谓 NFT 资产合约里,账本可以是一个以 token 编号为键、持有者地址为值的大映射(big_map),即每个编号直接对应一个地址,天然一物一主;转账换的就是这个映射里的值。操作人授权走 operators 结构,市场代你挂单成交时,靠的是事先登记的 operator 记录——查“谁能动我的币”,FA2 合约上是有一处明确地方可查的。要提醒的是,FA2 标准本身不规定 mint 入口,有的合约部署后不再增发,有的留了管理员可继续铸造的入口,后者从交易记录能追到谁在用。
元数据放在两个层
FA2 的元数据分两层。代币层:每个 token_id 配一条键值对形式的元数据,类型是字符串到字节的映射;提供方式二选一——要么存在标注为 token_metadata 的大映射里,要么实现一个 token_metadata 的离链视图(off-chain view)现场返回。TZIP-12 还预留了几个标准键,例如 decimals,对 NFT 示例通常把 decimals 记为 0,表示数量没有小数概念;name、符号等展示字段也在键值对里。合约层:标准建议合约提供 TZIP-16 格式的合约元数据,其 JSON 里的 interfaces 字段要写明自己实现的是 TZIP-012 及版本信息。很多项目还会把指向 IPFS 的 URI 塞进键值对里,作品文件本身留在链下。
用户怎么查
一是在区块浏览器或节点 RPC 上读合约存储:先看有没有 TZIP-16 的 metadata 大映射,再看 token_metadata 是否直接可读。二是调离链视图:如果合约没存大映射,就要通过视图拿某编号的元数据,工具不支持视图时会显示“无元数据”,别急着以为代币丢了。三是查 ledger:某编号对应的地址就是当前所有人;再查 operators 看有没有市场授权挂着。四是核对 interfaces 声明的版本信息,遇到显示异常时先确认工具是不是按同一版规范解析的。
边界提醒
把多个合集塞进一个合约省了部署成本,也把“权限集中”摆到台面上:合约级的管理员能加铸造入口、能改某些字段时,影响的是合约里所有编号的资产,读条款时要整份读完。和所有链一样,FA2 记账证明的是代币归属,不是作品版权;元数据键值对里写“版权归谁”只是一段声明,法律权利取决于链下协议。风险提示:本文为代币标准科普,不构成投资建议;规范细节以 Tezos 官方文档与 TZIP-12 当前文本为准。
为什么“一个合约多系列”需要读版本声明
把多种代币塞进同一份合约,意味着同一份代码服务着不同时期、不同约定的持有人。TZIP-12 因此要求合约在 TZIP-16 元数据的 interfaces 字段里声明自己实现的规范版本(可带提交哈希前缀或日期),让钱包与索引器能判断“这个合约是按哪一版规范写的”。这个细节在排障时价值很大:同样是读取代币元数据,旧写法可能把信息全放在键值对里,新写法倾向引用一个 JSON 文件;工具按错误的版本假设解析,就会出现一部分编号正常显示、一部分空白的怪现象,而链上数据其实完好。
另一种常见疑问是供应量:FA2 的 NFT 账本没有规定必须维护一个总供应量计数器,有些合约提供 total_supply 离链视图,有些要靠数账本条目。查“这个系列一共发行了多少”之前,先确认该合约暴露了哪种口径,不同口径的数字对不上时,以账本条目数为准更可靠,因为那是所有权本身。
最后把“合约层与代币层”的更新路径说透:代币层元数据键值对里的外链改了,只影响那一个编号的展示;合约层元数据改了,影响所有依赖合约级信息的工具。两种改动在链上都有交易记录可查,怀疑被改时,按合约地址拉历史操作是最快的自证方式。对想批量管理 Tezos 收藏的人,建议把每个合约的接口声明、视图支持情况、管理员地址做成一张自己的清单,每年更新一次,远胜过出问题后临时抱佛脚。风险提示:本文为代币标准科普,不构成投资建议;规范细节以 Tezos 官方文档与 TZIP-12 当前文本为准。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。