# Aptos Move NFT发行代码剖析

By [shaneson.eth](https://paragraph.com/@shaneson-eth) · 2022-11-13

---

背景
--

Move的NFT和Solidity 721/1155相比，相差非常远。所以我觉得挺有必要重新研究一下如何在Aptos发行NFT。我下面的文章的重点是：Aptos Move是面向资源的编程。所以NFT无疑也是一种资源存储在Aptos网络里。

[https://mirror.xyz/0xaaE7a1AD2764626d09a233a9bC06C38b413637cf/aaMa0nhHcv6JN-AuN64HpUll3tdWXCTbLj929EhqvDM](https://mirror.xyz/0xaaE7a1AD2764626d09a233a9bC06C38b413637cf/aaMa0nhHcv6JN-AuN64HpUll3tdWXCTbLj929EhqvDM)

核心
==

整个Aptos NFT的核心要掌握3个用户：

1.  creator（创建者）：设计/创建这些NFT的设计者
    
2.  rolayty（收税收的人）：用户mint的过程中，rolayty可以收取版税
    
3.  mint（mint NFT的用户）：mint NFT的用户
    

用户发行Aptos NFT的大概步骤是：

1.  creator提前注册好NFT的资源（或者说注册好这个NFT类型的版权）。（token::create\_collection)
    
2.  minter触发mint\_nft，记录/传入creator的签名，通过token::create\_tokendata方法进行发行NFT
    

所以，关键是要吃透两个方法：0x3::token::create\_collection，和0x3::token::create\_tokendata

0x3::token::create\_collection
------------------------------

create\_collection是发行NFT先决的一个函数：总共有6个参数：

1.  &singer：这里传入creator的&singer引用，推荐使用pda的引用，因为后续也要使用creator的引用。
    
2.  name: 这里定义NFT系列的名称。
    
3.  description: 这里定义NFT系列的描述
    
4.  uri: NFT系列的URI（这里不是展示具体的NFT，而是一个系列图）
    
5.  maximun: 这里定义NFT的最大供应量
    
6.  mutate\_setting：这里传入3个bool数组，对应的是定义配置是否可修改：分别是描述是否可修改、URI是否可修改、最大NFT供应量是否可修改
    

![](https://storage.googleapis.com/papyrus_images/091a9b9af898319c923d42c3146b52649bc1763f27e9f150511710e9848f564d.png)

我们接下来看一下create\_collection的内部实现，create\_collection主要是为creator创建了2个资源：

1.  用户全局唯一的Collectoins资源，这个资源管理着全部创建的NFT。
    
2.  对应单个系列的CollectionData资源，这个资源管理着单个系列的NFT资源。
    

调用完这个函数，就已经为creator和该系列创建了必要的资源空间了。

![](https://storage.googleapis.com/papyrus_images/38f74afdc9ecd5147f197cf19f1b1c4b125f60ced702b10f7aa5fbc001484465.png)

0x3::token::create\_tokendata
-----------------------------

调用完create\_collection之后，就可以调用create\_tokendata了。这里需要13个参数，我们可以把参数分为3类：

1.  base argument: 这里主要是一些基本的参数类型（account, collection, name, descriptoin, maximum和uri）。
    
2.  royalty argument: 这里可以定义版税，但是这里的版税和nft market的版税不一样，nft market会定义另外一套版税，或者会读这个版税参数。完全取决于nft market。
    
3.  property: 这里定义NFT的属性，对于GameFi来说挺有用，比如定义攻击力/防御力之类
    

![](https://storage.googleapis.com/papyrus_images/f489aad38ded44977fdbcc49bf97080e2d13b59b37bbb60aa949af05bcf5aa57.png)

第一步是通过creator, collection和name，这三个参数组装成token\_data\_id。所以，每一个nft的name都不可以相同，一般用加上id隔开。

![](https://storage.googleapis.com/papyrus_images/dfdd71209f5428fbc604567cd31386acd2e4b61d7858eaea24d53b20ca46f761.png)

第二步是读取collection\_data里的collection，往collection\_data表里新增token\_data。这里的token\_data定义就是新增的NFT描述，会通过资源的形式写入到collection\_data.token\_data里。最后完成NFT创建，然后返回TokenDataId

![](https://storage.googleapis.com/papyrus_images/197d3fb83bfa047018bb8ba828b76e5bd3976ccfb6704e3bcf2c5e521fc41050.png)

完整代码
----

最后展示一下完整的NFT发行代码：

1.  运行create\_collection，创建好NFT系列的资源之后，
    
2.  运行mint\_nft，mint出nft，最后通过token:mint\_token\_to方法，把token id转移给to地址，完成mint nft。
    

![](https://storage.googleapis.com/papyrus_images/219a5c0f0b0fc96c04029ae027abc70856e3f5f7cae3f05aa4667295ebf78e43.png)

![](https://storage.googleapis.com/papyrus_images/d2cf4feb42e22ae74d312801b474b88229c7024f6a4821af0ed384ac4d865199.png)

---

*Originally published on [shaneson.eth](https://paragraph.com/@shaneson-eth/aptos-move-nft)*
