Skip to content

Commit

Permalink
1. 完善优化之前内容过少两篇文章,请review
Browse files Browse the repository at this point in the history
2. 进行分享并参与共学营讨论
3. 完成第三周学习
  • Loading branch information
gracecampo committed Nov 23, 2024
1 parent a1761c1 commit 7512074
Show file tree
Hide file tree
Showing 7 changed files with 222 additions and 47 deletions.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 5 additions & 4 deletions mover/gracecampo/co-learn-2411/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,14 @@

- [] 第一周:![学习记录截图](images/课程学习/第一周学习截图.png)
- [] 第二周:![学习记录截图](images/课程学习/第二周学习截图.jpg)
- [] 第三周:![学习记录截图](./images/你的图片地址)
- [] 第三周:![学习记录截图](images/课程学习/第三周学习截图.png)
- [] 第四周:![学习记录截图](./images/你的图片地址)

## 参加直播答疑

- [] 第一周:![学习记录截图](images/直播答疑/第一周直播答疑.jpg):参与直播并积极互动
- [] 第二周:![学习记录截图](images/直播答疑/第二周直播答疑.png):参与直播并积极互动
- [] 第一周:![学习记录截图](images/直播答疑/共学营开营仪式.jpg):参与共学营开营仪式
- [] 第一周:![学习记录截图](images/直播答疑/第一周直播答疑.jpg):参与第一周直播答疑
- [] 第二周:![学习记录截图](images/直播答疑/第二周直播答疑.png):参与第二周直播答疑
- [] 第二周:![学习记录截图](images/直播答疑/共学营分享会.png) :分享并参与共学营讨论
- [] 第三周:![学习记录截图](./images/你的图片地址)
- [] 第四周:![学习记录截图](./images/你的图片地址)

Expand Down
123 changes: 103 additions & 20 deletions mover/gracecampo/notes/任务教程/task3教程.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,39 @@
# MOVE共学营TASK3教程
💧  [HOH水分子公众号](https://mp.weixin.qq.com/s/d0brr-ao6cZ5t8Z5OO1Mog)

🌊  [HOH水分子X账号](https://x.com/0xHOH)
🧑‍💻作者:gracecampo

📹  [课程B站账号](https://space.bilibili.com/3493269495352098)
## MOVE共学营中的TASK3教程

💻  Github仓库 https://github.com/move-cn/letsmove
### 完成NFT的上链部署

🧑‍💻作者:gracecampo
- 上链网络: 主网(mainnet)

## 需求

- 完成 NFT相关知识的学习
- 完成可以mint NFT的合约上链
- 给自己地址mint一个NFT
- NFT必须是自己 github 的头像作为图片
- mint 一个 nft 发送到地址: `0x7b8e0864967427679b4e129f79dc332a885c6087ec9e187b53451a9006ee15f2`
- 提交mint到自己地址的浏览器查看(Scan)截图

## MOVE共学营中的TASK3教程
### 1. 代码部分
**在开发之前,我们应了解NFT作为链上资产,它究竟是什么?他的独特性在哪里?NFT在Sui上有什么优势?**

> NFT释义:
NFT 是“非同质化代币”(Non-Fungible Token)的缩写。它是一种数字资产,每个 NFT 都是独一无二的,无法互换。
NFT 通常用于表示艺术品、音乐、视频、游戏物品等数字内容的所有权或认证。
在 Sui 区块链上,NFT 是对象,每个对象都有唯一的 ID,这使得它们天然地具有非同质化的特性。
Sui 的 NFT 可以直接在链上存储和管理,提供了比传统区块链更高的灵活性和可编程性。

#### 接下来我们步入开发环节:
首先作为一个NFT资产,我们定义NFT时,需要赋予这个结构体key和store,key能力使得这个结构体可以在链上作为唯一对象索引,

store使得这个对象可以进行全局传输和传递。

接下来,我们创建一个GRACECAMPO_NFT的结构体体,它拥有key和store能力,并且拥有4个属性,分别是: id 作为链上索引地址,name作为NFT结构体名称,

description作为一个NFT描述,url是NFT对象的外部图像链接地址。
> 定义NFT结构体
```sui move
public struct GRACECAMPO_NFT has store, key {
Expand All @@ -20,14 +43,30 @@
url: Url,
}
```
>定义监听事件

监听事件:通过监听事件,我们可以对链上事件进行分析,例如跟踪 NFT 的铸造次数或智能合约生成的交易金额。这对于分析和统计非常有用。

例如向下的例子,当我们在铸造函数中添加这个事件的时候,我们在应用程序中就可以订阅这个事件,方便我们对铸造人数进行分析,也可用于在铸造完成后,对用户

进行通知。当然这个任务我们将不会对这个事件进行采集和统计,只是作为一个代码规范进行引入。

>定义铸造监听事件
```sui move
public struct GRACECAMPO_NFT_Minted has copy, drop {
object_id: ID,
creator: address,
name: string::String,
}
```
接下来,我们将声明一个铸造函数,可以看到mint_to_sender函数中,我们传入了用户初始化NFT对象的信息,比如name、description、url以及上下文ctx信息,这个函数作为公开函数,可以使任何人调用,当我们调用这个函数时,我们将从上线问中获取调用者信息,将传入的参数信息用于进行NFT对象的初始化,同时我们在代码中注册上面的监听事件。
当用户调用mint_to_sender,将为用户铸造一个GRACECAMPO_NFT的NFT,以及发送铸造事件,当订阅这个事件的应用,接收到事件,将通知用户(这一步我们将不做实践,感兴趣的朋友可以手动实践下)

transfer::public_transfer 是 Sui 网络中的一个函数,用于将对象的所有权从一个地址转移到另一个地址。这个函数允许对象在其定义模块之外进行转移, 但前提是对象具有 store 和 key 能力。

```sui move
public fun public_transfer<T: store, key>(obj: T, recipient: address)
```

>定义铸造函数
```sui move
public entry fun mint_to_sender(
Expand All @@ -53,32 +92,63 @@ public entry fun mint_to_sender(
transfer::public_transfer(nft, sender);
}
```
>定义转移函数,
接下来,我们声明一个转移函数,用于用户对NFT的转移,此函数,我们可以看到,需要传入的参数依次为:nft(用户拥有的nft对象),address(接收人地址),此函数未用到上下文对象,此处我们以 _ 形式进行忽略。我们在此函数中调用transfer::public_transfer进行对象转移。

>定义转移函数
```sui move
public entry fun transfer(
nft: GRACECAMPO_NFT, recipient: address, _: &mut TxContext
) {
transfer::public_transfer(nft, recipient)
}
public entry fun update_description(
nft: &mut GRACECAMPO_NFT,
new_description: vector<u8>,
_: &mut TxContext
) {
nft.description = string::utf8(new_description)
}
```
### 2. 铸造NFT
>调用铸造函数

接下来我们在命令行执行部署以及函数调用(当然,上面的函数,我们都声明entry,也可以进行浏览器调用)

### 模块发布及函数调用

#### 1. 模块部署

发布前,可以先在测试网进行调试,无问题后,将环境切换到主网环境(这一点需要注意,测试完成后,因任务要求,必须在主网部署)

```sui move
sui client publish
```

发布之后,控制台将显示我们部署模块的PACKAGEID,记录下来。

之后我们将频繁使用到(下文中的PACKAGEID,在运行时,请替换为发布后记录的PACKAGEID)

#### 2. 铸造NFT

调用铸造函数: 此命令,需要替换PACKAGEID,GRACECAMPO_NFT替换为你定义的NFT对象名,mint_to_sender替换为你的铸造函数名

args 后跟你铸造的NFT名称 NFT描述 NFT图片地址,任务要求NFT图片地址必须是自己 github 的头像作为图片,故你需要替换为你的github 的头像URL

```shell
sui client call --package PACKAGEID --module GRACECAMPO_NFT --function mint_to_sender args NFT名称 NFT描述 NFT图片地址
```

调用成功后,需要记录NFT的OBJECTID,方便区块浏览器查看

### 3. 转移NFT
调用转移函数:

此命令,需要替换 PACKAGEID 为发布记录的 PACKAGEID

GRACECAMPO_NFT 替换为你定义的NFT对象名

transfer 替换为你的转移函数名

args 后跟上面铸造函数调用后生成的OBJECTID

recipient-address 替换为0x7b8e0864967427679b4e129f79dc332a885c6087ec9e187b53451a9006ee15f2

>转移NFT
```shell
sui client call --package PACKAGEID --module GRACECAMPO_NFT --function transfer args NFT-OBJECTID recipient-address
```

调用成功后,需要记录交易hash,方便区块浏览器查看

合约中的铸造和转移函数声明为entry,如果不熟悉命令行调用也可支持在区块浏览器调用
Expand All @@ -87,11 +157,24 @@ sui client call --package PACKAGEID --module GRACECAMPO_NFT --function transfer
查看NFT信息:(注意合约发布环境)
>测试网
>> https://suiscan.xyz/testnet/object/NFT-OBJECTID
>
>
>> https://suiscan.xyz/testnet/tx/transfer-hash
>
>
>主网
>> https://suiscan.xyz/mainnet/object/NFT-OBJECTID
>
>
>> https://suiscan.xyz/mainnet/tx/transfer-hash


任务教程结束,如果有疑问,可以评论留言。

如有问题,欢迎指正,一起进步,谢谢。:smile:  :smile: :smile:

💧  [HOH水分子公众号](https://mp.weixin.qq.com/s/d0brr-ao6cZ5t8Z5OO1Mog)

🌊  [HOH水分子X账号](https://x.com/0xHOH)

📹  [课程B站账号](https://space.bilibili.com/3493269495352098)

💻  Github仓库 https://github.com/move-cn/letsmove
1 change: 1 addition & 0 deletions mover/gracecampo/notes/工具使用/sui-cli使用指南.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ sui client faucet --address ADDRESS --指定地址通过水龙头获取测试
sui client faucet --url CUSTOM_FAUCET_URL ----指定水龙头URL地址获取测试代币
sui client gas ----获取当前地址测试代币余额
sui client gas ADDRESS ----获取指定地址测试代币余额
sui client objects ----获取地址的拥有对象
```
> sui client faucet
```text
Expand Down
Loading

0 comments on commit 7512074

Please sign in to comment.