Cosmos SDK 的 x/nft 模块:不写合约也能发出兼容 ERC-721 的藏品 图 1
Cosmos SDK 的 x/nft 模块:不写合约也能发出兼容 ERC-721 的藏品 · 图 1

Cosmos 生态里发 NFT 有两条常见的路:一条是在链上的 CosmWasm 虚拟机里部署合约,用 CW721 这样的合约标准发藏品;另一条干脆不写合约——直接用 Cosmos SDK 自带的 x/nft 模块。后者对应 SDK 架构决策记录 ADR-43,官方把它描述为”在模块层面实现 NFT 的分类、创建、转账、更新与查询,并声称完全兼容 ERC-721 规范”。这条路线的气质和以太坊完全不同:藏品逻辑不是某段可部署的合约代码,而是链核心软件的一部分,所有链上用户共享同一套建币与转账规则。

先读它的状态结构。模块用两个基本对象组织数据。Class(类别)相当于”合集”:每个类别有唯一的 class_id、名称、符号和一段自定义 metadata,由创建者发起、模块登记;同一个类别下可以铸造大量共享同一元数据的 NFT。NFT 对象则记录 id、所属 class_id、uri(指向外部内容的链接)、uri_hash(内容哈希,用于校验外部内容没被换过)以及可选的链上 data 字段。转账走 MsgSend 消息,从持有者账户移到另一个账户;每一次创建、更新、转账都会发出对应事件,供链下索引器订阅。余额、按类别查询、按持有人查询等查询接口由模块直接提供,不需要像合约链那样先知道合约地址。

这套结构里有几个设计选择值得展开。第一,“合集”是全局资源而不是某个合约的私有命名空间:谁都可以发起类别,类别之间用 class_id 区分,市场的任务是把类别映射成用户能理解的合集页面。第二,uri 与 uri_hash 的组合承认了元数据大体在链下,同时用哈希提供篡改可检测性——这和 ERC-721 只约定 tokenURI 字符串、不强制完整性校验形成对比。第三,铸造权限模型比较朴素:按 ADR-43 与模块文档,默认铸造能力可以通过链上参数(如 mint_enabled)控制,这与合约世界里每个项目自定 mint 函数的自由度和风险都不同——它少了”忘记关mint”这类项目方失误,也少了项目方逐条定制领取规则的空间。

所谓”完全兼容 ERC-721”要读得精确一点。它指的是概念与接口语义上的对应——有创建、有转账、有持有人查询,工具链可以按类似心智模型接入;而不是说以太坊上的 ERC-721 合约能直接调用 Cosmos 模块。SDK 生态里还有另一条兼容路线:用 Ethermint 或 EVM 模块的链(如 Injective、Injective 类 EVM 链)在 EVM 层直接跑 ERC-721 合约,和 x/nft 属于不同层级的实现。做跨生态工具时,先分清目标链上藏品到底是 x/nft 模块资产、CosmWasm CW721 合约资产,还是 EVM 层合约资产,三种读法互不通用。

对收藏者来说,这条链上的藏品核对方式和以太坊很不一样。没有”合约地址+Token ID”这一串通用标识,取而代之是 class_id 加 NFT id 的组合;查所有权要落到区块浏览器或节点对 x/nft 状态的查询上,而不是读某个合约的存储。授权转让的生态也 thinner:合约链上市场普遍用 approve 机制,模块链上更多是把币先转到市场或托管账户再成交,任何声称”无需转账即可代持”的产品都要先问清它动用了什么权限。另外,这类链的升级由链上治理推动,模块行为的改变(例如参数开关、字段扩展)跟随投票而非项目方发版——这既是稳定性来源,也意味着个别项目无法”自带规则”。

务实清单:在 Cosmos 系链上收 NFT 前,确认这条链实际启用了哪个 NFT 方案;记录 class_id 与 id 的对应关系;有 uri_hash 的对象尽量把当时的外部内容留档;涉及代持或质押类产品时,把”币在你手里还是在别人手里”这一步在链上验证清楚。模块级 NFT 展示了一种常被忽略的可能性:代币标准不必是第三方写的合约,也可以是链本身的一部分。

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

Cosmos SDK 的 x/nft 模块:不写合约也能发出兼容 ERC-721 的藏品 图 2
Cosmos SDK 的 x/nft 模块:不写合约也能发出兼容 ERC-721 的藏品 · 图 2