在上一篇文章《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 合约 的开发之旅吧!
Sui 是一个高性能的区块链平台,旨在为去中心化应用提供快速、安全且可扩展的基础设施。它由 Aptos Labs 团队开发,基于新型的共识协议——Narwhal & Tusk。Sui 的设计目标是解决区块链性能瓶颈,提供极高的交易吞吐量和低延迟,适应复杂应用场景的需求。
Sui 链的主要特点:
高吞吐量与低延迟: Sui 的共识机制允许并行处理大量交易,而无需等待整个网络的全局共识。这种并行化的设计能够实现每秒处理成千上万的交易,极大提高了区块链的吞吐量,并减少交易确认的延迟。
面向对象的资源管理: Sui 将区块链中的资源视为对象进行管理。这些资源(例如代币、NFT)有独立的标识符,能够被直接跟踪和操作。通过这种方式,Sui 可以在多个节点之间高效并行地处理资源,而不需要处理全局状态,进一步提升性能。
灵活的交易模型: Sui 提供了灵活且高效的交易模型,支持在多个资源对象之间并行执行交易。这意味着不同用户的交易可以独立且高效地进行,避免了传统区块链的性能瓶颈。
高效的账户和权限管理: Sui 提供了多样化的账户管理机制,可以应对去中心化应用中复杂的权限需求。无论是个人账户、智能合约账户,还是多签账户,都能灵活配置和管理。
Move 是专为区块链开发设计的编程语言,最初由 MetaLibra(后来的 Diem)团队开发,后被 Sui 区块链采用。Move 的设计重点是资源的管理、所有权的控制以及类型安全,它特别适用于处理去中心化应用中的资产和数字资源。
Move 语言的主要特点:
资源类型系统: Move 语言将所有的资源(如代币、NFT、智能合约中的数据等)视为“资源类型”。这些资源在系统中不能被复制或销毁,只能转移或借用。这确保了每个资源的唯一性和安全性,从根本上避免了传统智能合约中的资源丢失和重复转移问题。
所有权与借用机制: Move 通过严格的所有权和借用机制管理资源。每个资源都有一个唯一的所有者,资源的借用必须显式声明,这种机制避免了“共享资源”时的安全隐患。资源的借用可以确保开发者在不修改资源所有权的前提下共享和操作资源。
模块化编程: Move 支持模块化的编程结构,每个模块可以包含不同的资源类型和函数。模块化设计使得代码更加清晰、可复用,并有助于提高开发效率和降低代码出错的概率。
类型安全与可验证性: 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 共学活动由 HOH 社区、HackQuest、OpenBuild、KeyMap 联合发起。该活动旨在为新手小白提供一个良好的学习平台,带领大家一步步熟悉 Move 语言,并了解如何将其应用到 Web3 开发中。
通过与 Move 领域的专业导师们合作,参与者可以快速掌握 Move 语言的基础知识,逐步向更复杂的应用开发进阶。无论是区块链初学者,还是有一定开发经验的工程师,都能从中获益。
资源链接:
运行以下命令创建名为 my_nft
的 Move 项目:
sui move new my_nft
cd .\my_nft\
确保初始的 Move 项目可以正确编译:sui move build
在这部分,我们将详细解析基于 Sui 区块链和 Move 编程语言 编写的 NFT 合约代码,并参考 Sui 的 NFT 显示标准🚪 实现一个具有显示功能的 NFT 合约
根据上述合约代码,我们将实现一个基于 Sui 链的 NFT 合约,分为以下部分:
MyNFT
结构体:表示一个 NFT 对象,包含以下字段:
id
: 唯一标识符,由 Sui 链生成的 UID
。name
: NFT 的名称。image_url
: NFT 的图像链接。DISPLAY_NFT
结构体:占位符资源,用于初始化 display
模块。
init
函数:
display
显示信息,定义了 NFT 的元数据结构。mint
函数:
name
和 image_url
铸造新的 NFT。将以下代码保存到 my_nft
项目的 sources
目录中作为 display_nft.move
文件:
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 转移给调用者
}
}
如果不知道怎么切换到主网可以看 这篇教程的第三部分🚪,之后在合约项目的根目录下(如 my_nft
),执行以下命令部署合约:
sui client publish --skip-dependency-verification
display_nft
模块,点击查看 init
函数铸造的默认 NFT:
huahuahua1223 display nft
在完成合约部署后,借助区块链浏览器可以直观地调用合约中的函数并验证 NFT 的功能。这一部分将展示如何使用区块链浏览器完成 mint 和 转移 NFT 的操作。
PS:在suivision浏览器🚪和suiscan浏览器🚪中测试合约功能时,我发现 Suivision 浏览器在调用
mint
函数时可能会遇到问题,建议直接使用 Suiscan 浏览器完成操作
Package
包。点击 Package
包下的Contracts
合约,找到 mint
函数。根据合约逻辑,mint
函数需要两个参数:
输入参数值后,点击 Execute
按钮。
send
)功能,输入目标地址后点击 Execute
0x7b...15f2
到这一步,恭喜你已经完成了task3🎉🎉🎉
在本文中,我们深入探讨了如何在 Move 编程语言的环境中实现并部署一个简单的 NFT(非同质化代币) 合约。通过创建一个名为 my_nft
的项目,我们逐步完成了从项目创建、代码编写到合约部署和调用的完整流程。我们详细讲解了如何在 Sui 区块链上构建 NFT 合约。
通过本篇文章的学习,你应该能够理解如何利用 Move 语言在 Sui 链上构建简单的 NFT 应用,并掌握如何使用区块链浏览器与合约进行交互。希望这篇文章为你进一步深入探索区块链开发,特别是 Move 编程语言和 Sui 链的应用提供了帮助。如果你对 NFT 或 Move 编程语言感兴趣,欢迎继续关注后续的学习内容!如果你有任何疑问或建议,欢迎在评论区交流!🌹
更多精彩内容,欢迎关注系列文章目录! 我们在探索 Move 的道路上共同成长,不见不散! 🎉
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!