1.什么是nft?
NFT:Non-fungible-token
非同质化货币
2.新建suimove项目
使用sui move new 项目名
命令新建sui move项目
sui move new nft_qyx
项目结构如下:
3.写nft合约
module qyx123::nft{
use sui::object::{Self, UID};
use sui::transfer;
use sui::tx_context::{Self, TxContext};
use sui::display;
use sui::package;
use std::string::utf8;
struct NFT has drop {}
//我的nft结构体,属性id和tokenid
struct MyNFT has key,store{
id: UID,
tokenId: u64
}
struct State has key {
id: UID,
count: u64
}
fun init(witness: NFT, ctx:&mut TxContext){
//键值对,键名和值一一对应
//键名
let keys = vector[
utf8(b"name"),
utf8(b"collection"),
utf8(b"image_url"),
utf8(b"description")
];
//value值
let values = vector[
utf8(b"MyNFT #{tokenId}"),
utf8(b"MyNFT Collection"),
utf8(b"自己的头像地址"),
utf8(b"This is My NFT")
];
//使用 packge和display发布地址
//创建发布者
let publisher = package::claim(witness,ctx);
//创建display
let display = display::new_with_fields<MyNFT>(&publisher, keys, values, ctx);
display::update_version(&mut display);
transfer::public_transfer(publisher, tx_context::sender(ctx));
transfer::public_transfer(display, tx_context::sender(ctx));
//计数器
transfer::share_object(State{
id: object::new(ctx),
count: 0
});
}
entry public fun mint( state:&mut State, ctx: &mut TxContext){
let sender = tx_context::sender(ctx);
//计数器
state.count = state.count + 1;
let nft = MyNFT {
id: object::new(ctx),
tokenId: state.count,
};
transfer::public_transfer(nft, sender);
}
}
4.引入图片
找到一张图片,转为base64,代码放到上面的value中的图像地址中
//value值
let values = vector[
utf8(b"MyNFT #{tokenId}"),
utf8(b"MyNFT Collection"),
utf8(b"自己的头像地址"),//此处
utf8(b"This is My NFT")
];
5.发布到开发网testnet
5.1列出当前所有网络别名和当前网络:
sui client envs
此处显示我目前为devnet
5.2切换网络命令可以切换到对应网络
切换网络:
sui client switch --env [network alias]
5.3编译代码
跳过拉取最新git依赖
sui move build --skip-fetch-latest-git-deps
编辑不通过记得在mint函数前加上
#[lint_allow(self_transfer)]
编译通过
5.4发布到testnet
sui move test --skip-fetch-latest-git-deps
sui client publish --skip-fetch-latest-git-deps --skip-dependency-verification --gas-budget 500000000
不成功在init函数前加上
#[allow(unused_function)]
发布成功
通过sui浏览器查询packageID
https://suiexplorer.com/
6.mint
复制计数器id到mint处执行
支付后mint成功