掘金 后端 ( ) • 2024-03-30 10:51

一:Coin(ERC20)

1.1 介绍

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

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

1.2 简单实现

借助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)即可。
此时,所有用户都可以通过sui client call --package <PACKAGE_ID> --module faucetcoin --function mint --args <TREASURYCAP> 6 <ADDRESS> --gas-budget 100000000铸造 $\mathit {Coin}$ 并将其发送给指定的 $\mathit {ADDRESS}$。
注意: 尖括号内的部分请替换成相关的地址,可以事先设置环境变量再通过$符号取值,数字 $\text 6$ 表示的数量,也就是此次交易将铸造 $\text 6$ 枚货币。
交易成功后,可以根据新创建的 $\mathit {ObjectID}$ 去浏览器查看详情,例如: $\mathit {example}$

二:NFT

2.1 介绍

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

2.2 简单实现

一个所有人都可以创建 $\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}$​,可以查看该 对象 以及 交易详情

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