Publication
Partagez vos connaissances.

Illustration de la bibliothèque standard Sui Move - Package de jetons de base (solde, pièces, paiement)
Cet article analyse les trois composants principaux des jetons Sui Move : le solde (couche de stockage des valeurs), les pièces (couche de fonctionnement des jetons) et le paiement (couche d'abstraction des paiements). À l'aide de diagrammes de principe et d'exemples de code, les principes de conception de l'architecture à trois couches sont révélés.
| Modules | Niveaux | Fonction | Scénario |
| : ---| : ---| : ---| : ---|
| sui::balance
| Couche de stockage des valeurs (stockage sous-jacent) | Gérer la relation de mappage entre les adresses et les soldes de jetons | Requête d'équilibre, vérification de la propriété des jetons |
| sui::coin
| Couche de fonctionnement des jetons (fonctionnement de base) | Concentrez-vous sur la gestion du cycle de vie du jeton lui-même, y compris : la création, la destruction et la gestion des métadonnées, etc. | Émission de jetons personnalisés et maintenance des métadonnées des jetons |
| sui::pay
| Couche d'abstraction des paiements (encapsulation de haut niveau) | Fournit des opérations composées pour le paiement par jetons, notamment : fractionnement, fusion, transfert de jetons uniques ou par lots, etc. | Transfert par lots, logique de compte partagé, airdrop |
Schéma de méthode
La méthode est relativement simple, appelant principalement cointhe method in balance. La méthode coin sera appelée, c'est pourquoi cet article se concentre sur la méthode principale illustrée.
Les principes de la monnaie réglementaire seront présentés dans un article séparé et seront ignorés dans cet article.
Exemples de code
module cookbook::aig_token {
use std::string::{Self, String};
use std::ascii;
use sui::coin::{Self, TreasuryCap};
use sui::balance::{Self, Balance};
use sui::url::{Self, Url};
use sui::event;
public struct EventMint has copy, drop {
sender: address,
amount: u64,
coin_left: u64
}
public struct EventAirdrop has copy, drop {
method: String,
sender: address,
amount: u64
}
public struct EventCoinMeta has copy, drop {
decimals: u8,
symbol: ascii::String,
name: String,
description: String,
icon_url: Option<Url>,
}
public struct EventTotalSupply has copy, drop {
total_supply: u64
}
public struct Vault has key {
id: UID,
balance: Balance<AIG_TOKEN>,
}
public struct AIG_TOKEN has drop {}
fun init(
witness: AIG_TOKEN,
ctx: &mut TxContext
) {
let decimals = 3;
let symbol = b"AIG";
let name = b"AIG Token";
let description = b"AIG Token is a token that is used to incentivize the community to achieve the goals of the AI Goal.";
let url = url::new_unsafe_from_bytes(b"https://ai-goal.vercel.app/");
let (treasury_cap, metadata) = coin::create_currency<AIG_TOKEN>(
witness,
decimals,
symbol,
name,
description,
option::some(url),
ctx
);
event::emit(
EventCoinMeta {
decimals: coin::get_decimals(&metadata),
symbol: coin::get_symbol(&metadata),
name: coin::get_name(&metadata),
description: coin::get_description(&metadata),
icon_url: option::some(url),
}
);
transfer::public_freeze_object(metadata);
transfer::public_transfer(treasury_cap, ctx.sender());
transfer::share_object(
Vault {
id: object::new(ctx),
balance: balance::zero(),
}
);
}
public(package) fun airdrop(
vault: &mut Vault,
amount: u64,
method: vector<u8>,
ctx: &mut TxContext
) {
let sender = ctx.sender();
let mut balance_drop = balance::split(&mut vault.balance, amount);
let coin_drop = coin::take(&mut balance_drop, amount, ctx);
transfer::public_transfer(coin_drop, sender);
balance::destroy_zero(balance_drop);
event::emit(
EventAirdrop {
method: string::utf8(method),
sender,
amount,
}
);
}
public fun mint_balance(
treasury_cap: &mut TreasuryCap<AIG_TOKEN>,
vault: &mut Vault,
amount: u64,
ctx: &mut TxContext
) {
let balance_minted = coin::mint_balance(treasury_cap, amount);
balance::join(&mut vault.balance, balance_minted);
event::emit(
EventMint {
sender: ctx.sender(),
amount: amount,
coin_left: balance::value(&vault.balance)
}
);
}
#[allow(lint(self_transfer))]
public fun mint_coin(
treasury_cap: &mut TreasuryCap<AIG_TOKEN>,
amount: u64,
ctx: &mut TxContext
) {
let coin_minted = coin::mint(treasury_cap, amount, ctx);
transfer::public_transfer(coin_minted, ctx.sender());
coin::mint_and_transfer(
treasury_cap,
amount,
ctx.sender(),
ctx
);
event::emit(
EventTotalSupply {
total_supply: coin::total_supply(treasury_cap)
}
)
}
}
- Sui
Vous pouvez mieux écrire pour analyser la bibliothèque de pièces
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Gagne ta part de 1000 Sui
Gagne des points de réputation et obtiens des récompenses pour avoir aidé la communauté Sui à se développer.
- Pourquoi BCS exige-t-il un ordre de champs exact pour la désérialisation alors que les structures Move ont des champs nommés ?53
- « Erreurs de vérification de sources multiples » dans les publications du module Sui Move - Résolution automatique des erreurs42
- Échec de la transaction Sui : objets réservés pour une autre transaction24
- Comment les contraintes de capacité interagissent-elles avec les champs dynamiques dans des collections hétérogènes ?04