Solana 可编程 NFT 为什么常年是冻结状态:Token Record 与授权规则怎么配合 图 1
Solana 可编程 NFT 为什么常年是冻结状态:Token Record 与授权规则怎么配合 · 图 1

在 Solana 上买过 NFT 的人,偶尔会在区块浏览器里发现一件反直觉的事:某枚代币的账户状态是 frozen,可它照样能被卖出、被转走。这不是数据错乱,而是可编程 NFT(pNFT)刻意选择的一种约束方式。理解它需要先看清一个绕过问题。

要解决的是”绕过元数据程序”

Metaplex 文档的解释是:Token Metadata 程序建立在 SPL Token 程序之上,任何所有者或 SPL Token 委托都能直接与 SPL Token 程序交互,在转账、烧毁这些关键操作上绕过 Token Metadata。组合性因此变好,但代价是 Token Metadata 无法替创建者强制执行任何规则。文档举的例子就是二级版税:比例虽然存在 Metadata 账户里,是否真的付出去,取决于执行转账的那个人或程序。

Solana 可编程 NFT 为什么常年是冻结状态:Token Record 与授权规则怎么配合 图 2
Solana 可编程 NFT 为什么常年是冻结状态:Token Record 与授权规则怎么配合 · 图 2

冻结不是惩罚,是收口

pNFT 的做法写得很具体:无论有没有设置委托,pNFT 的 Token 账户在 SPL Token 程序上始终处于冻结状态,这就没人能绕过 Token Metadata 直接操作它;每当有操作发生,Token Metadata 会先解冻、执行操作、再冻结回来,整个过程在同一条指令里原子完成。所以在浏览器里看到的 frozen,描述的是”必须走元数据程序”这条路,而不是”资产被锁住不能动”。

同时,因为所有影响 pNFT 的操作都要经过 Token Metadata,这里就形成了一个天然的授权检查点:规则定义在 Rule Set 账户里,由另一个叫 Token Auth Rules 的程序管理。文档提醒,这个程序本身是通用的,任何用例都能拿它来创建和校验授权规则。

Token Record 才是”到底锁没锁”的账本

设置委托时的信息不会只写在代币账户上。文档说明:Token Metadata 会把委托信息同时同步到 Token 账户和 Token Record 账户;由于 pNFT 在 SPL Token 层始终冻结,真正记录这枚 NFT 是否真的被锁住的责任,落在 Token Record 上。可编程 NFT 指南进一步给出这个派生账户的种子形状:

["metadata", program id, mint id, "token_record", token account id]

同一时间只能有一个代币层委托,其角色与状态记录在 Token Record 结构里,包括 state、rule_set_revision、delegate、delegate_role 与 locked_transfer 等字段。

委托分场景,操作也有命名规范

指南列出的代币层委托角色包括 Sale、Transfer、LockedTransfer、Utility、Staking,以及迁移期专用的 Migration。能力差别很具体:Sale 委托可以转账,并且在委托存在期间能阻止所有者自己转账;Transfer 委托可以转账;LockedTransfer 既能锁定、解锁,也能把资产转到创建委托时通过 locked_address 预先指定的地址;Utility 可以锁定与烧毁;Staking 只负责锁定;Migration 与 Utility 类似但多了转账能力,用完即清空且不能被替换。

授权规则里操作的命名遵循 Operation:Scenario 的形式,例如由所有者发起的转账写作 Transfer:Owner,由 Sale 委托发起的写作 Transfer:SaleDelegate,批准一个 Sale 委托则写作 Delegate:Sale。另外文档提到 Transfer:WalletToWallet 目前并未投入使用。

持有人核对顺序

1. 确认资产是 NFT 还是 ProgrammableNonFungible(TokenStandard 里的枚举值)
2. 看 Token Record 的 delegate_role 与 state,判断谁此刻有权操作
3. 若涉及规则集,核对 rule_set_revision 指向哪个 Rule Set
4. 冻结标志单独看:它说明必须经 Token Metadata,不等于资产被锁定

需要提醒的是,规则能否真正约束买家,取决于市场与钱包是否走元数据程序那条路径;协议提供的是一条可执行的通道,不是一句承诺。

把冻结、委托与挂单串起来看,能解释很多界面现象。所有者把 Sale 委托交给某个市场程序后,自己在这段时间内并不能随意转走这枚 pNFT——文档写明 Sale 委托除了能转账,还可以在委托存在期间阻止所有者转账;如果这枚资产此前交给 Staking 或 Utility 委托,则处于被锁定或可被烧毁的授权状态。反过来,一旦委托被撤销、Token Record 里的角色被清空,操作权才回到所有者手里。因此在“明明挂单已撤、为什么还转不出去”这类求助里,第一步该读的是 Token Record,而不是订单页面。

还有一条历史遗留会干扰判断:Migration 委托。指南说明它是在从普通 NFT 迁移到 pNFT 期间由迁移流程创建的临时委托,除了 Utility 的能力之外还能转账,目的是让当时那些免托管的程序继续工作;它一旦被使用就被清空且不能再被替换,此后程序必须改用正式委托类型。也就是说,一枚较早迁移的资产上如果还挂着这种角色,其含义与新建的 Sale、Transfer 委托并不相同,读账户时应当区分对待。

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