Sui.

Пост

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

article banner.
0xduckmove.
Mar 07, 2025
Статья

Разработка контракта на игру в кости в 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
3
Поделиться
Комментарии
.

Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

268Посты383Ответы
Sui.X.Peera.

Заработай свою долю из 1000 Sui

Зарабатывай очки репутации и получай награды за помощь в развитии сообщества Sui.

Кампания вознагражденийМай
Мы используем файлы cookie, чтобы гарантировать вам лучший опыт на нашем сайте.
Подробнее