Допис
Діліться своїми знаннями.
Розробка контракту на гру в кубиках у Sui Move
У цьому підручнику я проведу вас через процес створеннясмарт-контракту на гру в кубикиза допомогою Sui Move.
Цей контракт дозволяє гравцям робити ставки нарезультат кидання кубиків, а адміністратор керує призовим фондом. До кінця ви матимете повністю функціональний контракт і глибоке розуміння кількох ключових концепцій Sui Move.
Вступ
Контракт про гру в кубики, який ми створимо, передбачає такі функції:
- Ініціалізація: Творець контракту налаштовує гру.
- Управління адміністратором: Адміністратор може внести токени в призовий фонд і виводити їх за потреби.
- Взаємодія з гравцем: Гравці беруть участь, вгадуючи результат кидання кубиків та роблячи ставки.
Цей підручник передбачає, що ви маєте базове розуміння Sui Move та зосереджується на впровадженні нових концепцій через практичну реалізацію. Перш ніж зануритися в код, давайте вивчимо ключові поняття, з якими ви зіткнетеся:
1.1 Додавання залежностей:
Щоб використовувати токени з іншого контракту (наприклад, контракт на токени змішувача), вам потрібно додати його як залежність у вашому проекті. Це робиться шляхом оновлення Move.toml
файлу вашого договору:
[dependencies]
coin_duck = { local = "../coin_duck"”}
Тут coin_duck - це контракт маркера змішувача, розташований за вказаним шляхом. Залежний договір також повинен вказати своє поле publicished-at у власному Move.toml з ідентифікатором пакета, отриманим після публікації, наприклад: іржа
published-at = "packageId_from_publication"
1.2 Використання тверджень
Твердження гарантують дотримання певних умов під час виконання договору. Макро assert!
с перевіряє умову і, якщо вона не вдається, видає помилку і зупиняє виконання.
Це корисно для запобігання недійсним станам, таким як ставки більше, ніж баланс гравця.
1.3 Генерування випадкових чисел
Справедливість у грі в кубики покладається на генерування випадкових чисел. Sui Move надає random
модуль для цієї мети.
Ви створите RandomGenerator
об'єкт і використовуєте його для створення випадкового числа від 1 до 6, імітуючи кидок кубиків.
1.4 Робота з монетою та балансом
У Sui Moveтокеникеруються за допомогою модулів монет та балансу:
-
Монета: Обгортка навколо балансу, яка використовується для передачі токенів.
-
Баланс: представляє фактичну суму токена, дозволяючи такі операції, як розділення та об'єднання.
До ключових методів відносяться:
- coin: :value (in_coin): Повертає загальну вартість об'єкта Coin.
- coin: :take (&mut баланс, сума, ctx): витягує вказану суму з балансу для створення монети.
- in_coin.balance_mut () .split (сума): Розділяє вказану суму з балансу монети.
- balance.join (баланс): Об'єднує один баланс в інший.
Ці операції будуть використовуватися для управління призовим фондом гри та ставками гравців.
Контракт на гру в кубики
Ось повний код контракту на гру в кубики з подальшими детальними поясненнями:
/// Game: Dice rolling. Players bet and guess the number. If correct, they win an amount equal to their bet; if incorrect, the bet goes to the game pool.
module game_duck:game_duck;
use sui::balance::{Self, Balance};
use sui::coin::{Self, Coin};
use sui::random::{Random, new_generator, generate_u8_in_range};
use coin_duck::duckfaucet::DUCKFAUCET;
const ErrorUserInsufficient: u64 = 0x101;
const ErrorGameInsufficient: u64 = 0x102;
public struct Game has key {
id: UID,
pool_amount: Balance<DUCKFAUCET>,
}
public struct Admin has key {
id: UID,
}
fun init(ctx: &mut TxContext) {
let game = Game {
id: object::new(ctx),
pool_amount: balance::zero()
};
transfer::share_object(game);
let admin = Admin { id: object::new(ctx) };
transfer::transfer(admin, ctx.sender());
}
public entry fun addCoinToGamePool(game: &mut Game, in_coin: &mut Coin<DUCKFAUCET>, amount: u64, _: &mut TxContext) {
let value = coin::value(in_coin);
assert!(amount <= value, ErrorUserInsufficient);
let coin_balance = in_coin.balance_mut().split(amount);
game.pool_amount.join(coin_balance);
}
public entry fun removeCoinFromGamePool(_: &Admin, game: &mut Game, amount: u64, ctx: &mut TxContext) {
assert!(game.pool_amount.value() >= amount, ErrorGameInsufficient);
let coin = coin::take(&mut game.pool_amount, amount, ctx);
transfer::public_transfer(coin, ctx.sender());
}
entry fun play(game: &mut Game, random: &Random, guess_num: u8, in_coin: &mut Coin<DUCKFAUCET>, amount: u64, ctx: &mut TxContext) {
assert!(game.pool_amount.value() >= (amount * 3), ErrorGameInsufficient);
assert!(in_coin.balance().value() >= amount, ErrorUserInsufficient);
let mut g = new_generator(random, ctx);
let win_num = generate_u8_in_range(&mut g, 1, 6);
if (win_num == guess_num) {
let reward_coin = coin::take(&mut game.pool_amount, amount, ctx);
in_coin.join(reward_coin);
} else {
addCoinToGamePool(game, in_coin, amount, ctx);
}
}
Структура розбивки коду
- Гра: спільний об'єкт з унікальним ідентифікатором та pool_amount (баланс
) для зберігання призового фонду. - Admin: Ключовий об'єкт, що належить адміністратору для ініціалізації (init) управління пулом.
Ініціалізація (init):
- Створює ігровий об'єкт з порожнім призовим фондом і публічно ділиться ним.
- Створює об'єкт Admin і передає його творцю контракту.
Додавання до пулу (AddCoinToGamePool)
- Забирає вказану суму з in_coin адміністратора.
- Використовує assert! щоб монета мала достатню цінність.
- Розділяє суму з балансу in_coin і об'єднує її в pool_amount гри.
Результат:
- Виграш: Якщо здогадка збігається з кидком, винагорода, що дорівнює ставці, береться з пулу і об'єднується в in_coin гравця.
- Програти: Якщо невірна, ставка вираховується з in_coin і додається до пулу через AddCoinToGamePool.
- Sui
- Move
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Зароби свою частку з 1000 Sui
Заробляй бали репутації та отримуй винагороди за допомогу в розвитку спільноти Sui.

- MiniBob... SUI+31
1
- 0xduckmove... SUI+27
2
- HaGiang... SUI+26
3
- ... SUIharry phan+21
- ... SUIMarlKey+20
- ... SUI
- ... SUIVens.sui+15
- ... SUICarlkawIy+12
- ... SUI
- ... SUIkryptoschain+10