在以太坊上,钱包和前端要显示一张 NFT,通常去读合约的 tokenURI,拿到一个 JSON 文件,再按约定好的字段名猜哪一个是图片、哪一个是名字。Sui 的思路不一样:对象自己带类型,链上还有一类叫 Display 的对象专门告诉前端「这个类型的对象,哪些字段可以显示、对应哪个字段路径」。这是一个小而重要的机制差异,直接影响了「为什么同一个 NFT 在两个钱包里长得不一样」这类日常问题。
先交代 Sui 的对象模型背景。Sui 把链上资产组织为对象,每个对象有唯一地址、有类型标签,可以被转移、组合、转移进其他对象。NFT 在 Sui 里就是某个用户拥有的一个对象,它的属性(名字、图片链接、等级)写在对象自己的字段里,而不是像 ERC-721 那样存放在合约集中管理的映射加外部文件里。既然属性已经在对象上了,为什么还需要 Display?因为「字段在对象里」和「前端敢不敢显示」是两件事——对象字段可能被写进攻击性字符串、内部字段或开发者不想公开的字段。Display 就是创建者发出的正式展示声明:按类型声明哪些字段可以被界面渲染,字段路径叫什么,模板文本是什么。
Display 对象本身也是一个链上对象,由某个类型的创建者(或授权方)创建并可以升级版本。前端拿到一个对象后,查询该类型的当前 Display 版本,按声明的字段路径取值渲染。如果创建者后来修改了展示声明——比如把图片字段从 image_url 改成 imageUrl,或者调整了字段顺序——新版本生效后,所有前端读到的显示结构都会变。于是出现了一个以太坊上少见的现象:不是图片文件变了,而是链上的展示元数据升级了,前端如果缓存了旧版本就会显示空白或错字段。这解释了同一资产在不同钱包显示不一致的一大来源:两边各自读取的 Display 版本不同,或其中一方没有跟随新版本。
版本机制还带来一个实用核验点。对象上的展示声明带有版本号和创建者签名,前端可以校验「这份声明确实是该类型创建者发布的第 N 版」,而不是任何第三方伪造的字段说明。对于仿冒者来说,在 Sui 上想给冒牌对象挂上正牌的显示模板,需要在链上冒充 Display 对象的创建者,这在对象所有权模型下比在以太坊上复制一段 tokenURI JSON 难得多。反过来说,买家看到「字段齐全、显示漂亮」也不等于东西是真的,仍然要看对象类型、包(Package)地址和创建交易本身。
与以太坊方案对比可以总结三条差异。其一,元数据位置:以太坊偏向外部 JSON 文件,Sui 的对象属性天然在链上,Display 只是展示层声明;其二,升级方式:以太坊改 tokenURI 或 baseURI 指向,Sui 升级 Display 版本;其三,多合集隔离:同一个 Sui 包里的不同类型可以有各自独立的 Display 声明,互不影响。对习惯了 ERC-721 生态的读者,这些差异意味着「读元数据」这个动作在 Sui 上要换一套排查思路——不是去合约里读字符串,而是查对象的类型与 Display 对象。
给使用者的具体检查清单:在 Sui 浏览器里打开对象,记下它的类型全名与包地址,和官方公告逐字符对比;遇到显示异常时,先用同类型另一个正常对象对照,判断是对象字段问题还是 Display 版本问题;交易前留意该 Display 是否最近升过版本,异常的字段改动可能意味着项目方调整了展示结构,也可能意味着你访问的页面读了错误的声明来源。Sui 的对象模型让展示层更规整,但规整不等于安全,地址核验仍是第一步。本文为机制说明,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。