{"content":{"title":"Sui Display 入门","body":"---\r\ntitle: display\r\ndescription: sui display 介绍\r\nkeywords: [sui, nft, display]\r\n---\r\n\r\n## 1. 介绍\r\n\r\n通常，每个 NFT 都会有个图像信息需要展示。用户拥有一个 NFT Object，如何在钱包/浏览器中以图片形式展示？\r\n常用的定义方式如下：\r\n\r\n```rust\r\nstruct NFT has key {\r\n    id: UID,\r\n    name: string,\r\n    image_url: string, // 钱包/浏览器等通过这个值显示图片\r\n}\r\n```\r\n\r\n前端拿到用户的 NFT 信息之后，通过`image_url`属性再次访问图片信息。\r\n但是在`Sui`这里，更推荐使用`Display`。\r\n\r\n## 2. display\r\n\r\nsui 对象 Display 标准是一个模版引擎，可以对类型的链下显示进行链上管理。通过 Display 将对象的数据替换为模版字符串。可以使用 `{property}` 语法访问所有对象属性，然后将他们作为模板字符串的一部分插入。\r\n\r\n```rust\r\nstruct Display has<NFT> key {\r\n    name: {name},\r\n    image_url: {imageUrl},\r\n}\r\n```\r\n\r\n建议的基本属性集包括：\r\n\r\n- name：对象名称\r\n- description：对象描述\r\n- image_url：对象的图像的 URL 或 blob\r\n- thumthumbnail_url：用于钱包、浏览器或其他产品作为浏览的小图像的 URL\r\n- project_url：项目的 URL\r\n- link：在应用程序中使用的对象的链接\r\n\r\n## 3. 实践\r\n\r\n通过一个[合约](https://github.com/inscriptiontek/web3-tour/blob/main/move/nft/sources/mynft.move)来看下是如何使用的。\r\n\r\n关键代码如下：\r\n\r\n```rust\r\n// 定义有哪些 key\r\nlet keys = vector[\r\n  utf8(b\"name\"),\r\n  utf8(b\"image_url\"),\r\n  utf8(b\"project_url\"),\r\n];\r\n\r\n// 对应的key的值是什么，对应key的定义顺序\r\nlet values = vector[\r\n  // `name`值 从对象的`name`中获取\r\n  utf8(b\"{name}\"),\r\n  // 可以提前设置一个模版，动态拼接\r\n  utf8(b\"https://github.com/{name}.png\"),\r\n  // 也可以设置固定值\r\n  utf8(b\"https://github.com\"),\r\n];\r\n...\r\n```\r\n\r\n部署该合约，然后调用 `mint` 函数\r\n\r\n![mint](https://inscriptiontek.com/assets/images/image-20240309112004239-7160f50ef806f083a8ed756d655da314.png)\r\n\r\n这里使用如图示例参数，然后在浏览器查看该[交易内容](https://suiexplorer.com/txblock/GFUw4fvPR7jji8i3pHpwB2bjzQmWP3BBdGc9y4PEfX49?network=testnet)，F12 可以看到这样一个请求\r\n\r\n![json-rpc](https://inscriptiontek.com/assets/images/image-20240309112204585-d998c35816090e3251d59ef5fea17418.png)\r\n\r\n```json\r\n// 请求 showDisplay 内容\r\n{\r\n    \"jsonrpc\":\"2.0\",\r\n    \"id\":4,\r\n    \"method\":\"sui_multiGetObjects\",\r\n    \"params\":[\r\n        [\r\n            //\"0x4c372c5a2202bc42178b26fff3e342db3a5cba1ad35f4a53e048155bb6bab7ab\",\r\n            \"0x8651a86be0724cf6fbd85ceca11f325bbc01f4b64d3c1cd52a753e1c6cb9e9a3\"\r\n        ],\r\n        {\r\n            \"showDisplay\":true\r\n        }\r\n    ]\r\n}\r\n\r\n// 响应内容为:\r\n{\r\n   // ...\r\n        {\r\n            \"data\": {\r\n                \"objectId\": \"0x8651a86be0724cf6fbd85ceca11f325bbc01f4b64d3c1cd52a753e1c6cb9e9a3\",\r\n                \"version\": \"24403529\",\r\n                \"digest\": \"EGx97cr5NuYJ5H9vY2726ZXp6hWapPJXGTtJ6KfpKXF4\",\r\n                \"display\": {\r\n                    \"data\": {\r\n                        \"image_url\": \"https://github.com/inscriptiontek.png\", // 这里是按照模版拼接好的字段\r\n                        \"name\": \"inscriptiontek\", // 动态值\r\n                        \"project_url\": \"https://github.com\" // 固定字段\r\n                    },\r\n                    \"error\": null\r\n                }\r\n            }\r\n        }\r\n    ],\r\n// ...\r\n}\r\n```\r\n\r\n从 `json-rpc` 返回中类似`\"image_url\": \"https://github.com/inscriptiontek.png\"`这些就是按照模版组装好的字符串，这样浏览器/钱包等就可以通过访问指定链接展示图片信息。\r\n\r\n\r\n---"},"author":{"user":"https://learnblockchain.cn/people/18893","address":null},"history":"bafkreidsk42op4m6cozfavfircjum3tohohpi3vx7ngb7zmfoxrrz2fdvq","timestamp":1711416501,"version":1}