Пост
Поделитесь своими знаниями.

Иллюстрация стандартной библиотеки Sui Move — базовый пакет токенов (баланс, монета, оплата)
В этой статье анализируются три основных компонента токенов Sui Move: баланс (уровень хранения стоимости), монета (уровень операций с токенами) и оплата (уровень абстракции платежей). С помощью принципиальных диаграмм и примеров кода раскрываются принципы проектирования трехуровневой архитектуры.
| Модули | Уровни | Функция | Сценарий |
|: ---|: ---|: ---|: ---|
| sui::balance
| Уровень хранения ценностей (базовое хранилище) | Управление сопоставлением адресов и балансов токенов | Запрос баланса, подтверждение владения токеном |
| sui::coin
| Уровень управления токенами (базовая операция) | Сосредоточьтесь на управлении жизненным циклом самого токена, включая создание, уничтожение и управление метаданными и т. д. | Выпуск токенов на заказ и обслуживание метаданных токенов |
| sui::pay
| Уровень абстракции платежей (высокоуровневая инкапсуляция) | Предоставляет комплексные операции по оплате токенов, включая однократное или пакетное разделение токенов, слияние, передачу и т. д. | Пакетный перевод, логика разделенного аккаунта, раздача токенов |
Диаграмма методов
Метод относительно прост, в основном метод cointhe вызывается в режиме баланса. Метод coin будет вызван, поэтому в данной статье основное внимание будет уделено монете — проиллюстрированному основному методу.
Принципы регулирования валюты будут представлены в отдельной статье и будут проигнорированы в этой статье.
Примеры кода
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
Вы можете лучше писать, чтобы проанализировать библиотеку монет
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Заработай свою долю из 1000 Sui
Зарабатывай очки репутации и получай награды за помощь в развитии сообщества Sui.
- Почему BCS требует точного порядка полей для десериализации, когда структуры Move содержат именованные поля?53
- «Ошибки проверки нескольких источников» в публикациях модуля Sui Move — автоматическое устранение ошибок42
- Сбой транзакции Sui: объекты, зарезервированные для другой транзакции24
- Как ограничения возможностей взаимодействуют с динамическими полями в гетерогенных коллекциях?04