{"content":{"title":"Sui NFT 合约","body":"记录如何写一个 NFT 合约，并且要用到`display`功能，能够在浏览器或者钱包中看到图片。\r\n\r\n## 1. 新建项目\r\n\r\n打开终端，执行命令创建合约目录\r\n\r\n```bash\r\nsui move new nft\r\n```\r\n\r\n结果如下\r\n\r\n```bash\r\n./\r\n├── Move.lock\r\n├── Move.toml\r\n└── sources\r\n```\r\n\r\n## 2. 填充内容\r\n\r\n在`sources`目录新建文件`mynft.move`\r\n\r\n文件内容参考[源码](https://github.com/inscriptiontek/web3-tour/blob/main/move/nft/sources/mynft.move)\r\n\r\n## 3. 关键点讲解\r\n\r\n> 更多`Display`信息参考 [Sui Display 入门](https://learnblockchain.cn/article/7547)\r\n\r\n定义 key 值与模版 value\r\n\r\n```rust\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\nlet values = vector[\r\n  utf8(b\"{name}\"),\r\n  utf8(b\"https://github.com/{name}.png\"),\r\n  utf8(b\"https://github.com\"),\r\n];\r\n```\r\n\r\n使用 Display 函数，并将版本升级到 1\r\n\r\n```rust\r\nlet display = display::new_with_fields<NFT>(&publisher, keys, values,ctx);\r\n\r\n// update version to 1\r\ndisplay::update_version(&mut display);\r\n\r\ntransfer::public_transfer(display, tx_context::sender(ctx));\r\n```\r\n\r\n## 4. 发布合约\r\n\r\n先切换到测试网络 \r\n\r\n```bash\r\nsui client switch --env testnet\r\n```\r\n\r\n接下来使用命令发布到测试网\r\n\r\n```bash\r\nsui client publish --gas-budget=60000000\r\n```\r\n\r\n查看终端，查询到`PackageID:0x6be5ae949644e92fb04cb1714fca6ffcbd830243827d3d60a229ff2badf3785e`\r\n\r\n## 5. 交互\r\n\r\n由于合约函数中添加了`entry`关键词，可以很方便在浏览器中操作\r\n\r\n\r\n![package](https://inscriptiontek.com/assets/images/image-20240309112004239-7160f50ef806f083a8ed756d655da314.png)\r\n\r\n链接钱包之后，第一个参数填写你的 Github 名称，第二个参数写一个描述，点击`Execute`。\r\n成功之后，可以在钱包 -- 资产中看到这个 NFT 了。\r\n\r\n\r\n\r\n![nft_asset.png](https://img.learnblockchain.cn/attachments/2024/03/19Hw5g3q65f94554ec57b.png)\r\n\r\n---\r\n\r\n\r\n星航计划 QQ群：79489587"},"author":{"user":"https://learnblockchain.cn/people/18893","address":null},"history":null,"timestamp":1710835123,"version":1}