Sui Move Coin(ERC20) && NFT 简单实现

一:Coin(ERC20)

1.1 介绍

E R C \mathit {ERC} ERC 全称是“以太坊征求意见协议” ( E t h e r e u m R e q u e s t   f o r   C o m m e n t ) \mathit {(EthereumRequest\ for\ Comment)} (EthereumRequest for Comment)的缩写, E R C \mathit {ERC} ERC- 20 \text {20} 20​​ 就是一套关于基于以太坊网络的标准代币发行协议,正因为它的存在,开发者们得以高效、可靠、低成本地创造专属于自己项目的代币。

假如你在自家楼下开了一个小窗口,出售一些日常用品,即使这家店铺再小,借助这一套协议你也可以通过正当途径,办理极少量的手续创办一张独属于该店铺的消费储值卡,卡内存储的货币名,详情介绍,甚至是货币样式都可以自定义。由于使用的是同一套协议,这张卡内的货币还能够非常方便地与其他商铺的储值卡无缝兑换。多方共赢的前提之下,使得这一套标准化的发放协议和配套服务,更具生态价值。

1.2 简单实现

借助sui::coin这个包,我们就可以轻松地创建 C o i n \mathit {Coin} Coin,想要对余额进行操作则需要sui::balance,本篇先将目光放到前者,也就是如何创建身上。

create_currency是创建 C o i n \mathit {Coin} Coin 的函数,它需要下列参数:

  • witness: T一次性见证 ( O n e   T i m e   W i t n e s s ) \mathit {(One\ Time\ Witness)} (One Time Witness),不明确用法的可以查看前一篇文章。
  • decimals: u8代币的精度,比如 S u i \mathit {Sui} Sui 的精度是 9 \text 9 9 1  S u i   =  1000000000 \text 1\ \mathit {Sui}\ =\ \text {1000000000} 1 Sui = 1000000000,这也是为什么在交易的时候--gas-budget 100000000后面的数可以填这么大的原因,同时这也是为了应对 S u i   M o v e \mathit {Sui\ Move} 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);
    }
}

此段代码中, t r e a s u r y \mathit {treasury} treasury 的所有权移交给了发布者,所以只有他/她才能铸造货币,如果想要扩大这个权限,只需要更改成transfer::public_share_object(treasury)即可。
此时,所有用户都可以通过sui client call --package <PACKAGE_ID> --module faucetcoin --function mint --args <TREASURYCAP> 6 <ADDRESS> --gas-budget 100000000铸造 C o i n \mathit {Coin} Coin 并将其发送给指定的 A D D R E S S \mathit {ADDRESS} ADDRESS
注意: 尖括号内的部分请替换成相关的地址,可以事先设置环境变量再通过$符号取值,数字 6 \text 6 6 表示的数量,也就是此次交易将铸造 6 \text 6 6 枚货币。
交易成功后,可以根据新创建的 O b j e c t I D \mathit {ObjectID} ObjectID 去浏览器查看详情,例如: e x a m p l e \mathit {example} example

二:NFT

2.1 介绍

N F T \mathit {NFT} NFT 全称为 ( N o n \mathit {(Non} (Non- F u n g i b l e   T o k e n ) \mathit {Fungible\ Token)} Fungible Token),指非同质化通证,实质是区块链网络里具有唯一性特点的可信数字权益凭证,是一种可在区块链上记录和处理多维、复杂属性的数据对象,它可以是任何数字化的东西,例如:声音、图像、文字、游戏道具等等任何一个独一无二的事物。
因为对象 ( O b j e c t ) \mathit {(Object)} (Object) 是独一无二的且可被拥有的,所以创建一个 N F T \mathit {NFT} NFT 只需要创建一个新的类型同时转移其所有权就可以。

2.2 简单实现

一个所有人都可以创建 N F T \mathit {NFT} 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进行交易。

之后,根据新建的 W u K o n g N F T   O b j e c t I D \mathit {WuKongNFT\ ObjectID} WuKongNFT ObjectID​,可以查看该 对象 以及 交易详情

三:加入组织,共同进步!

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现自动检测“coin.png”中硬币的个数,可以按照以下步骤进行: 1. 读取图像文件 使用Matlab的imread函数读取“coin.png”图像文件,将其保存为一个矩阵。 ``` img = imread('coin.png'); ``` 2. 转换为灰度图像 将读入的图像转换为灰度图像。 ``` gray = rgb2gray(img); ``` 3. 二值化处理 对灰度图像进行二值化处理,将图像转换为黑白两色的图像。 ``` threshold = graythresh(gray); bw = imbinarize(gray,threshold); ``` 4. 对图像进行形态学处理 对二值化后的图像进行形态学处理,去除不必要的噪声点和连接不相邻的硬币。 ``` se = strel('disk',5); bw = imclose(bw,se); bw = imfill(bw,'holes'); bw = bwareafilt(bw,[100,inf]); ``` 5. 检测硬币个数 通过bwlabel函数得到二值化后的图像中连通区域的个数,即硬币的个数。 ``` [labels,numLabels] = bwlabel(bw); numCoins = numLabels; ``` 6. 在原图像中显示硬币个数 在原图像中显示检测到的硬币个数。 ``` figure; imshow(img); title(['Number of coins: ', num2str(numCoins)]); ``` 完整代码如下: ``` img = imread('coin.png'); gray = rgb2gray(img); threshold = graythresh(gray); bw = imbinarize(gray,threshold); se = strel('disk',5); bw = imclose(bw,se); bw = imfill(bw,'holes'); bw = bwareafilt(bw,[100,inf]); [labels,numLabels] = bwlabel(bw); numCoins = numLabels; figure; imshow(img); title(['Number of coins: ', num2str(numCoins)]); ``` 运行以上代码,就可以实现自动检测“coin.png”中硬币的个数,并在原图像中显示检测到的硬币个数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值