玩转 Sui 区块链:Move NFT 合约从零开始的实战教程

  • huahua
  • 更新于 2024-11-26 11:14
  • 阅读 323

在上一篇文章《Task2:move coin》中,我们学习了如何通过Move 编程语言创建一个简单的代币合约,并实现了合约的发布与调用。在此过程中,我们逐步掌握了Move 的模块化设计资源管理机制以及合约间的交互方法,为构建链上金融场景提供了强大的工具支持。本篇文章将延续之前的学习路径,完成Move

系列文章目录

Task1:hello move🚪 Task2:move coin🚪 Task3:move nft🚪 Task4:move game🚪

更多精彩内容,敬请期待!✌️


@TOC


前言

在上一篇文章《Task2:move coin》中,我们学习了如何通过 Move 编程语言 创建一个简单的代币合约,并实现了合约的发布与调用。在此过程中,我们逐步掌握了 Move 的模块化设计资源管理机制 以及合约间的交互方法,为构建链上金融场景提供了强大的工具支持。

本篇文章将延续之前的学习路径,完成 Move 共学活动中的 Task3:move nft 任务。在这一任务中,我们将进一步探索 Move 的资源管理优势,学习如何使用 Move 实现一个简单的 NFT(非同质化代币)合约。通过构建并调用 NFT 合约,你将深入理解 Move 的独特特性,例如:

  • 如何创建不可复制、不可销毁的资源;
  • 如何为资源赋予独特的属性;
  • 以及如何实现链上资产的唯一性管理。

NFT 的应用场景广泛,包括数字艺术品、虚拟地产、游戏道具等。在完成本任务后,你将能够为后续开发更复杂的 NFT 应用奠定基础。让我们一起探索 Move 的更多可能性,开启 Move NFT 合约 的开发之旅吧!

image.png

什么是 Sui 链?

Sui 是一个高性能的区块链平台,旨在为去中心化应用提供快速、安全且可扩展的基础设施。它由 Aptos Labs 团队开发,基于新型的共识协议——Narwhal & Tusk。Sui 的设计目标是解决区块链性能瓶颈,提供极高的交易吞吐量和低延迟,适应复杂应用场景的需求。

Sui 链的主要特点:

  1. 高吞吐量与低延迟: Sui 的共识机制允许并行处理大量交易,而无需等待整个网络的全局共识。这种并行化的设计能够实现每秒处理成千上万的交易,极大提高了区块链的吞吐量,并减少交易确认的延迟。

  2. 面向对象的资源管理: Sui 将区块链中的资源视为对象进行管理。这些资源(例如代币、NFT)有独立的标识符,能够被直接跟踪和操作。通过这种方式,Sui 可以在多个节点之间高效并行地处理资源,而不需要处理全局状态,进一步提升性能。

  3. 灵活的交易模型: Sui 提供了灵活且高效的交易模型,支持在多个资源对象之间并行执行交易。这意味着不同用户的交易可以独立且高效地进行,避免了传统区块链的性能瓶颈。

  4. 高效的账户和权限管理: Sui 提供了多样化的账户管理机制,可以应对去中心化应用中复杂的权限需求。无论是个人账户、智能合约账户,还是多签账户,都能灵活配置和管理。


什么是 Move 编程语言?

Move 是专为区块链开发设计的编程语言,最初由 MetaLibra(后来的 Diem)团队开发,后被 Sui 区块链采用。Move 的设计重点是资源的管理、所有权的控制以及类型安全,它特别适用于处理去中心化应用中的资产和数字资源。

Move 语言的主要特点:

  1. 资源类型系统: Move 语言将所有的资源(如代币、NFT、智能合约中的数据等)视为“资源类型”。这些资源在系统中不能被复制或销毁,只能转移或借用。这确保了每个资源的唯一性和安全性,从根本上避免了传统智能合约中的资源丢失和重复转移问题。

  2. 所有权与借用机制: Move 通过严格的所有权和借用机制管理资源。每个资源都有一个唯一的所有者,资源的借用必须显式声明,这种机制避免了“共享资源”时的安全隐患。资源的借用可以确保开发者在不修改资源所有权的前提下共享和操作资源。

  3. 模块化编程: Move 支持模块化的编程结构,每个模块可以包含不同的资源类型和函数。模块化设计使得代码更加清晰、可复用,并有助于提高开发效率和降低代码出错的概率。

  4. 类型安全与可验证性: Move 是一门强类型语言,这意味着开发者必须在编译时明确地定义每个变量和资源的类型。Move 的类型系统能够确保合约中的大部分错误在编译阶段就被发现,从而避免了运行时错误,提高了智能合约的安全性。

Move 语言的示例代码: 以下是一个简单的 Move 合约示例,展示了如何创建和转移一个名为 Coin 的资源:

address 0x1 {
    module CoinModule {
        resource struct Coin has store {
            value: u64,
        }

        public fun create_coin(value: u64): Coin {
            Coin { value }
        }

        public fun transfer_coin(coin: Coin, recipient: address): Coin {
            let new_coin = Coin { value: coin.value };
            // 这里可以执行实际的转账操作
            return new_coin;
        }
    }
}

在这个示例中,Coin 是一个资源类型,包含一个 value 字段,表示代币的值。create_coin 函数用来创建新的 Coin 资源,而 transfer_coin 函数则用于将 Coin 资源转移到指定的账户。


Move 共学活动:快速上手 Move 开发

为了帮助更多开发者快速了解和掌握 Move 编程语言,Move 共学活动由 HOH 社区HackQuestOpenBuildKeyMap 联合发起。该活动旨在为新手小白提供一个良好的学习平台,带领大家一步步熟悉 Move 语言,并了解如何将其应用到 Web3 开发中。

通过与 Move 领域的专业导师们合作,参与者可以快速掌握 Move 语言的基础知识,逐步向更复杂的应用开发进阶。无论是区块链初学者,还是有一定开发经验的工程师,都能从中获益。

资源链接:

  • sui官方文档🚪:获取关于 Sui 链的详细文档,包括开发指南、API 参考等。
  • move学习B站视频🚪:通过 B 站的视频教程,跟随导师学习 Move 编程语言的基础与进阶。
  • letsmove仓库🚪:这是一个 Move 学习资源的 GitHub 仓库,包含了各种示例代码和教程,帮助开发者掌握 Move 语言。

一、 创建项目

1.1. 新建 Move 项目

运行以下命令创建名为 my_nft 的 Move 项目:

sui move new my_nft
cd .\my_nft\

image.png

1.2. 空编译项目

确保初始的 Move 项目可以正确编译:sui move build

image.png


二、编写 NFT 合约代码

在这部分,我们将详细解析基于 Sui 区块链和 Move 编程语言 编写的 NFT 合约代码,并参考 Sui 的 NFT 显示标准🚪 实现一个具有显示功能的 NFT 合约

2.1. 理解合约逻辑

根据上述合约代码,我们将实现一个基于 Sui 链的 NFT 合约,分为以下部分:

  1. MyNFT结构体:表示一个 NFT 对象,包含以下字段:

    • id: 唯一标识符,由 Sui 链生成的 UID
    • name: NFT 的名称。
    • image_url: NFT 的图像链接。
  2. DISPLAY_NFT结构体:占位符资源,用于初始化 display 模块。

  3. init函数:

    • 创建 display 显示信息,定义了 NFT 的元数据结构。
    • 创建并发布一个默认 NFT 到当前用户。
  4. mint函数:

    • 允许用户自定义 nameimage_url 铸造新的 NFT。
    • 将新铸造的 NFT 转移到调用者地址。

2.2. 编写合约代码

将以下代码保存到 my_nft 项目的 sources 目录中作为 display_nft.move 文件:

image.png

module my_nft::display_nft {
    use std::string;
    use std::string::{utf8, String};
    use sui::tx_context::{sender};
    use sui::package;
    use sui::display;

    // 定义 NFT 的结构体
    public struct MyNFT has key, store {
        id: UID,              // 唯一标识符,确保每个 NFT 是独一无二的
        name: String,         // NFT 的名称
        image_url: String,    // NFT 的图片链接
    }

    // 定义用于初始化的结构体
    public struct DISPLAY_NFT has drop {}

    // 初始化函数,设置 NFT 的显示字段
    fun init(otw: DISPLAY_NFT, ctx: &mut TxContext) {
        let keys = vector[
            utf8(b"name"),             // 显示字段:名称
            utf8(b"link"),             // 显示字段:链接
            utf8(b"image_url"),        // 显示字段:图片链接
            utf8(b"description"),      // 显示字段:描述
            utf8(b"project_url"),      // 显示字段:项目链接
            utf8(b"creator"),          // 显示字段:创建者
        ];

        let values = vector[
            utf8(b"{name}"),           // 名称的占位符
            utf8(b"https://sui-heroes.io/hero/{id}"),  // 动态链接
            utf8(b"{image_url}"),      // 图片链接占位符
            utf8(b"A true Hero of the Sui ecosystem!"), // 固定描述
            utf8(b"https://sui-heroes.io"),           // 固定项目链接
            utf8(b"Unknown Sui Fan"), // 默认创建者
        ];

        let publisher = package::claim(otw, ctx); // 声明发布者权限

        let mut display = display::new_with_fields<MyNFT>(
            &publisher, keys, values, ctx
        ); // 创建显示对象,并设置字段

        display::update_version(&mut display); // 更新显示版本

        transfer::public_transfer(publisher, sender(ctx)); // 将发布者对象转移给调用者
        transfer::public_transfer(display, sender(ctx));   // 将显示对象转移给调用者

        let nft = MyNFT {
            id: object::new(ctx), // 创建新的唯一 ID
            name: string::utf8(b"huahuahua1223 display nft"), // 默认名称
            image_url: string::utf8(b"https://avatars.githubusercontent.com/u/138219491"), // 默认自己的github头像
        };

        transfer::public_transfer(nft, sender(ctx)); // 将创建的 NFT 转移给调用者
    }

    // 铸造 NFT 的函数
    public entry fun mint(name: String, image_url: String, ctx: &mut TxContext) {
        let id = object::new(ctx); // 创建新的唯一 ID
        let nft = MyNFT { id, name, image_url }; // 构造 NFT
        transfer::public_transfer(nft, sender(ctx)); // 将 NFT 转移给调用者
    }
}

2.3. 部署合约到 Sui 主网

  1. 如果不知道怎么切换到主网可以看 这篇教程的第三部分🚪,之后在合约项目的根目录下(如 my_nft),执行以下命令部署合约:

    sui client publish --skip-dependency-verification
  2. 部署之后会得到一个交易哈希,记录下来去到[suivision区块链浏览器🚪] image.png
  3. 在浏览器的合约详情页面中,找到 display_nft 模块,点击查看 init 函数铸造的默认 NFT:
    • NFT 名称为huahuahua1223 display nft
    • 图像链接为默认的 GitHub 头像

image.png

image.png


三、使用区块链浏览器调用函数

在完成合约部署后,借助区块链浏览器可以直观地调用合约中的函数并验证 NFT 的功能。这一部分将展示如何使用区块链浏览器完成 mint转移 NFT 的操作。

3.1. 调用 mint 函数

PS:在suivision浏览器🚪suiscan浏览器🚪中测试合约功能时,我发现 Suivision 浏览器在调用 mint 函数时可能会遇到问题,建议直接使用 Suiscan 浏览器完成操作

  1. 在部署合约时,我们记录了交易哈希(Transaction Hash)。打开浏览器,搜索该哈希值,定位到部署的合约详情页面。

image.png

  1. 在合约详情页面的 Changes 区域下,找到包含合约逻辑的 Package 包。

image.png

  1. 点击 Package 包下的Contracts合约,找到 mint 函数。根据合约逻辑,mint 函数需要两个参数:

    • name: NFT 的名称(字符串类型)
    • image_url: NFT 图像的 URL(字符串类型)

    输入参数值后,点击 Execute 按钮。

image.png

  1. 执行成功后,回到浏览器主页面,查看当前账户的 NFT 列表。你将看到一个新的 NFT 显示在账户中,名称和图片链接与刚刚输入的参数一致

image.png

3.2. 转移 NFT 给目标地址

  1. NFT 铸造完成后,我们可以通过区块链浏览器将 NFT 转移给指定的目标地址,进入账户 NFT 列表,选择刚刚铸造的 NFT,在 NFT 详情页中,找到转移(send)功能,输入目标地址后点击 Execute

image.png

  1. 执行完成后,返回区块链浏览器,搜索刚刚的交易记录,在浏览器中查看刚才转移的NFT所有者已经变成了0x7b...15f2

image.png 到这一步,恭喜你已经完成了task3🎉🎉🎉


总结

在本文中,我们深入探讨了如何在 Move 编程语言的环境中实现并部署一个简单的 NFT(非同质化代币) 合约。通过创建一个名为 my_nft 的项目,我们逐步完成了从项目创建、代码编写到合约部署和调用的完整流程。我们详细讲解了如何在 Sui 区块链上构建 NFT 合约。

通过本篇文章的学习,你应该能够理解如何利用 Move 语言在 Sui 链上构建简单的 NFT 应用,并掌握如何使用区块链浏览器与合约进行交互。希望这篇文章为你进一步深入探索区块链开发,特别是 Move 编程语言和 Sui 链的应用提供了帮助。如果你对 NFT 或 Move 编程语言感兴趣,欢迎继续关注后续的学习内容!如果你有任何疑问或建议,欢迎在评论区交流!🌹


更多精彩内容,欢迎关注系列文章目录! 我们在探索 Move 的道路上共同成长,不见不散! 🎉

  • 原创
  • 学分: 17
  • 分类: Sui
  • 标签:
点赞 0
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
huahua
huahua
0xbdd3...53C1
感谢您抽出时间阅读或观看这个简介,制作不易,感谢关注!如果您有任何问题或建议,请随时与我联系。谢谢!v:HHHHHH_1223