Пост
Поделитесь своими знаниями.
Разработка контракта на игру в кости в Sui Move
В этом уроке я расскажу вам о процессе создания смарт-контрактаигры в кубикис помощью Sui Move.
Этот контракт позволяет игрокам делать ставки нана результат броска кубиков, а призовым фондом управляет администратор. В итоге вы получите полнофункциональный контракт и хорошо поймете несколько ключевых концепций Sui Move.
Введение
Контракт на игру в кости, который мы создадим, предусматривает следующие функции:
- Инициализация: создатель контракта настраивает игру.
- Управление администратором: администратор может вносить токены в призовой фонд и выводить их по мере необходимости.
- Взаимодействие с игроками: игроки участвуют, угадывая результат броска кубиков и делая ставки.
В этом уроке предполагается, что вы обладаете базовыми знаниями о Sui Move, и основное внимание уделяется внедрению новых концепций на практике. Прежде чем углубиться в код, давайте рассмотрим ключевые концепции, с которыми вы столкнетесь:
1.1 Добавление зависимостей:
Чтобы использовать токены из другого контракта (например, контракта на токены faucet), вам необходимо добавить их в свой проект в качестве зависимости. Это делается путем обновления Move.toml
файла контракта:
[dependencies]
coin_duck = { local = "../coin_duck"”}
Здесь coin_duck — это контракт на токен faucet, расположенный по указанному пути. В зависимом контракте также должно быть указано поле published-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 balance, amount, 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 (Balance
) для хранения призового фонда. - Администратор: ключевой объект, принадлежащий администратору для инициализации (инициализации) управления пулом.
Инициализация (инициализация):
- Создает игровой объект с пустым призовым фондом и публикует его в открытом доступе.
- Создает объект 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