{"content":{"title":"Let's Move - 学 Move 得 Sui（三）：完成 NFT 的上链部署","body":"> [letsmove](https://github.com/move-cn/letsmove)\r\n>\r\n> Let's Move 一项学Move获得SUI的激励计划，鼓励更多的人学习Move语言\r\n>\r\n> 学习日志 ([alva-lin](https://github.com/alva-lin/letsmove))\r\n> \r\n> 本文首发于[ xLOG](https://xlog.yuheng.site/letsmove-task3)，如需转载，请联系作者\r\n\r\n# Task 3 - 完成 NFT 的上链部署(mainnet)\r\n\r\n> 任务\r\n>\r\n> - 完成 NFT相关知识的学习\r\n>\r\n> - 完成可以mint NFT的合约上链\r\n>\r\n> - 给自己地址mint一个NFT\r\n>\r\n> - mint 一个 nft 发送到地址: `0x7b8e0864967427679b4e129f79dc332a885c6087ec9e187b53451a9006ee15f2`\r\n\r\n主要参照 [创建 NFT - Sui Move by Example (中文版)](https://examples.sui-book.com/samples/nft.html)\r\n\r\n## NFT 合约代码\r\n\r\nNFT 合约代码如下，包含了 NFT 的定义，各类事件以及 entry function。\r\n\r\n```move\r\nmodule new_nft::simple_nft {\r\n    use sui::url::{Url, Self};\r\n    use std::string;\r\n    use sui::object::{Self, ID, UID};\r\n    use sui::event;\r\n    use sui::transfer;\r\n    use sui::tx_context::{TxContext, Self};\r\n\r\n    struct SimpleNFT has key, store {\r\n        id: UID,\r\n        name: string::String,\r\n        description: string::String,\r\n        url: Url,\r\n    }\r\n\r\n    struct SimpleNftMintEvent has copy, drop  {\r\n        object_id: ID,\r\n        creator: address,\r\n        name: string::String,\r\n    }\r\n\r\n    struct SimpleNftTransferEvent has copy, drop {\r\n        object_id: ID,\r\n        from: address,\r\n        to: address,\r\n    }\r\n\r\n    struct SimpleNftBurnEvent has copy, drop {\r\n        object_id: ID,\r\n    }\r\n\r\n    // Public view function\r\n    public fun name(nft: &SimpleNFT): string::String {\r\n        nft.name\r\n    }\r\n\r\n    public fun description(nft: &SimpleNFT): string::String {\r\n        nft.description\r\n    }\r\n\r\n    public fun url(nft: &SimpleNFT): Url {\r\n        nft.url\r\n    }\r\n\r\n    // Entrypoints\r\n    public entry fun mint_nft(\r\n        name: vector<u8>,\r\n        description: vector<u8>,\r\n        url: vector<u8>,\r\n        ctx: &mut TxContext\r\n    ) {\r\n        let sender = tx_context::sender(ctx);\r\n        let nft = SimpleNFT {\r\n            id: object::new(ctx),\r\n            name: string::utf8(name),\r\n            description: string::utf8(description),\r\n            url: url::new_unsafe_from_bytes(url),\r\n        };\r\n\r\n        event::emit(SimpleNftMintEvent {\r\n            object_id: object::id(&nft),\r\n            creator: sender,\r\n            name: nft.name,\r\n        });\r\n\r\n        transfer::public_transfer(nft, sender);\r\n    }\r\n\r\n    public entry fun transfer_nft(\r\n        nft: SimpleNFT,\r\n        recipient: address,\r\n        _: &mut TxContext\r\n    ) {\r\n        event::emit(SimpleNftTransferEvent {\r\n            object_id: object::id(&nft),\r\n            from: tx_context::sender(_),\r\n            to: recipient,\r\n        });\r\n\r\n        transfer::public_transfer(nft, recipient);\r\n    }\r\n\r\n    public entry fun update_description(\r\n        nft: &mut SimpleNFT,\r\n        description: vector<u8>,\r\n        _: &mut TxContext\r\n    ) {\r\n        nft.description = string::utf8(description);\r\n    }\r\n\r\n    public entry fun burn(\r\n        nft: SimpleNFT,\r\n        _: &mut TxContext\r\n    ) {\r\n        let SimpleNFT { id, name: _, description: _, url: _} = nft;\r\n\r\n        event::emit(SimpleNftBurnEvent {\r\n            object_id: object::uid_to_inner(&id),\r\n        });\r\n\r\n        object::delete(id);\r\n    }\r\n}\r\n```\r\n\r\n## mint NFT\r\n\r\n首先切换到主链，并发布\r\n\r\n```bash\r\n❯ sui client switch --env mainnet\r\nActive environment switched to [mainnet]\r\n\r\n❯ sui client publish --gas-budget 200000000 --skip-dependency-verification\r\n# ....\r\n```\r\n\r\n拿到发布的 package ID，然后调用公共方法\r\n\r\n```bash\r\n# 声明变量\r\nexport PACKAGE_ID=0xf78fb118efd9a86d8e2c54ac18766a1313bd8b0df80c85f859f83d01a5f78981\r\nexport NFT_NAME=\"\\\"joker\\\"\"\r\nexport DESCRIPTION=\"\\\"simple nft, power by alva-lin\\\"\"\r\nexport URL=<YOUR_NFT_IMAGE_URL>\r\nsui client call --gas-budget 7500000 --package $PACKAGE_ID --module simple_nft --function mint_nft --args $NFT_NAME $DESCRIPTION $URL\r\n```\r\n\r\n再将 mint 的 NFT，转移给指定地址\r\n\r\n```bash\r\n# 刚才铸造的 NFT Object ID\r\nexport NFT_ID=0xc1d108cdeef7666aa3f414bb3ead5faa7cd351e4dc75d0307e2888b640232787\r\nexport ADDRESS=0x7b8e0864967427679b4e129f79dc332a885c6087ec9e187b53451a9006ee15f2\r\n\r\n# 调用方法\r\nsui client call --gas-budget 7500000 --package $PACKAGE_ID --module simple_nft --function transfer_nft --args $NFT_ID $ADDRESS\r\n```"},"author":{"user":"https://learnblockchain.cn/people/18887","address":"0xc56870f55418de844afa6f159dda40824639c0de"},"history":null,"timestamp":1711560690,"version":1}