Sui Move Coin(ERC20) && NFT 简单实现
$\mathit {ERC}$ 全称是“以太坊征求意见协议”$\mathit {(EthereumRequest\ for\ Comment)}$的缩写,$\mathit {ERC}$-$\text {20}$ 就是一套关于基于以太坊网络的标准代币发行协议,正因为它的存在,开发者们得以高效、可靠、低成本地创造专属于自己项目的代币。
假如你在自家楼下开了一个小窗口,出售一些日常用品,即使这家店铺再小,借助这一套协议你也可以通过正当途径,办理极少量的手续创办一张独属于该店铺的消费储值卡,卡内存储的货币名,详情介绍,甚至是货币样式都可以自定义。由于使用的是同一套协议,这张卡内的货币还能够非常方便地与其他商铺的储值卡无缝兑换。多方共赢的前提之下,使得这一套标准化的发放协议和配套服务,更具生态价值。
借助sui::coin
这个包,我们就可以轻松地创建 $\mathit {Coin}$,想要对余额进行操作则需要sui::balance
,本篇先将目光放到前者,也就是如何创建身上。
create_currency
是创建 $\mathit {Coin}$ 的函数,它需要下列参数:
witness: T
一次性见证$\mathit {(One\ Time\ Witness)}$,不明确用法的可以查看前一篇文章。decimals: u8
代币的精度,比如 $\mathit {Sui}$ 的精度是 $\text 9$,$\text 1\ \mathit {Sui}\ =\ \text {1000000000}$,这也是为什么在交易的时候--gas-budget 100000000
后面的数可以填这么大的原因,同时这也是为了应对 $\mathit {Sui\ Move}$ 在浮点数处理上的略微不足(或许在今后更新的版本会更好地支持浮点数)。symbol: vector<u8>
代币符号。name: vector<u8>
代币名称。description: vector<u8>
代币描述。icon_url: Option<Url>
代币图标文件的网址。ctx: &mut TxContext
特殊的参数,不需要用户指定,其中包含交易的基本信息,如发送者的地址、签名者的地址、交易的纪元等等。该函数有两个返回值(TreasuryCap<T>, CoinMetadata<T>)
,前者的所有者可以控制该代币的铸造和销毁,通过与sui::coin::Coin
交互,并使用其作为授权参数传入;后者存储有该代币的基本数据,一般在初步定义好后不再更改,所以将其设置为不可变的共享对象。
根据以上信息,撰写一个简单的代币(仅支持铸造功能)的代码:
module coin_study::mycoin {
use sui::tx_context::{Self, TxContext};
use sui::coin::{Self, TreasuryCap};
use std::option;
use sui::url;
use sui::transfer;
struct MYCOIN has drop {}
fun init(otw: MYCOIN, ctx: &mut TxContext) {
let (treasury, metadata) = coin::create_currency(
otw,
9,
b"BLACK MYTH WUKONG",
b"WUKONG",
b"CONFRONT DESTINY AUGUST 20, 2024",
option::some(url::new_unsafe_from_bytes(b"https://github.com/zcy1024/SuiStudy/blob/main/coin_study/imgs/WUKONG.png?raw=true")),
ctx,
);
transfer::public_freeze_object(metadata);
transfer::public_transfer(treasury, tx_context::sender(ctx));
}
entry fun mint(treasury_cap: &mut TreasuryCap<MYCOIN>, amount: u64, recipient: address, ctx: &mut TxContext) {
let coin = coin::mint(treasury_cap, amount, ctx);
transfer::public_transfer(coin, recipient);
}
}
此段代码中,$\mathit {treasury}$ 的所有权移交给了发布者,所以只有他/她才能铸造货币,如果想要扩大这个权限,只需要更改成transfer::public_share_object(treasury)
即可。<br>此时,所有用户都可以通过sui client call --package <PACKAGE_ID> --module faucetcoin --function mint --args <TREASURYCAP> 6 <ADDRESS> --gas-budget 100000000
铸造 $\mathit {Coin}$ 并将其发送给指定的 $\mathit {ADDRESS}$。<br>注意: 尖括号内的部分请替换成相关的地址,可以事先设置环境变量再通过$
符号取值,数字 $\text 6$ 表示的数量,也就是此次交易将铸造 $\text 6$ 枚货币。<br>交易成功后,可以根据新创建的 $\mathit {ObjectID}$ 去浏览器查看详情,例如: $\mathit {example}$ 。
$\mathit {NFT}$ 全称为$\mathit {(Non}$-$\mathit {Fungible\ Token)}$,指非同质化通证,实质是区块链网络里具有唯一性特点的可信数字权益凭证,是一种可在区块链上记录和处理多维、复杂属性的数据对象,它可以是任何数字化的东西,例如:声音、图像、文字、游戏道具等等任何一个独一无二的事物。<br>因为对象$\mathit {(Object)}$ 是独一无二的且可被拥有的,所以创建一个 $\mathit {NFT}$ 只需要创建一个新的类型同时转移其所有权就可以。
一个所有人都可以创建 $\mathit {NFT}$ 的简单例子:
module nft_study::nft {
use sui::object::{Self, UID};
use sui::tx_context::TxContext;
use std::string::{Self, String};
use sui::url::{Self, Url};
use sui::transfer;
struct WuKongNFT has key, store {
id: UID,
name: String,
description: String,
url: Url,
}
entry fun mint(name: vector<u8>, description: vector<u8>, url: vector<u8>, recipient: address, ctx: &mut TxContext) {
let nft = WuKongNFT {
id: object::new(ctx),
name: string::utf8(name),
description: string::utf8(description),
url: url::new_unsafe_from_bytes(url),
};
transfer::transfer(nft, recipient);
}
}
根据发布后的信息以及传参设置环境变量:
export PACKAGE_ID=0xa09039f02bd5957d25d16c7f3ff11515b76b0407e9d994c5e65525c36bbc0b53
export NAME="BLACK MYTH WUKONG"
export DESCRIPTION="CONFRONT DESTINY AUGUST 20, 2024"
export URL="https://github.com/zcy1024/SuiStudy/blob/main/coin_study/imgs/WUKONG.png?raw=true"
export TO_ADDRESS=0x7b8e0864967427679b4e129f79dc332a885c6087ec9e187b53451a9006ee15f2
通过sui client call --package $PACKAGE_ID --module nft --function mint --args $NAME $DESCRIPTION $URL $TO_ADDRESS --gas-budget 100000000
进行交易。
之后,根据新建的 $\mathit {WuKongNFT\ ObjectID}$,可以查看该 对象 以及 交易详情 。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!