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和tokenidstruct 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);//创建displaylet 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-depssui 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成功