<<  >> (p.85)
    Author Topic: 🔹🅰RK🔹[ANN] ARK - Криптoвaлютнaя Экocиcтeмa🔹 ICO Зaвepшeнo  (Read 104856 times)
    This is a self-moderated topic. If you do not want to be moderated by the person who started this topic, create a new topic.
    FP91G
    Legendary
    *
    Offline

    Activity: 2534
    Merit: 1738


    🧙‍♂️ #kycfree


    View Profile
    July 03, 2020, 11:35:17 AM
    Last edit: July 03, 2020, 03:04:33 PM by FP91G
    Merited by xandry (8), Symmetrick (1)
     #1661

    Перевод. Оригинальная статья: Launching HTML5 Games In The ARK Desktop Wallet — Part Five
    https://blog.ark.io/launching-html5-games-in-the-ark-desktop-wallet-part-five-a2cf1d32be20

    Запуск HTML5 игр в ARK Desktop Wallet - часть пятая


    Теперь мы подошли к предпоследней части нашей серии, посвященной тому, как запускать HTML5-игры в ARK Desktop Wallet с помощью плагина ARK Core и Construct 3 . Если вы следовали за всеми предыдущими частями этой серии, вы успешно построили с нуля полностью рабочую блокчейн игру с помощью сообщений Smartbridge, сделав интеграцию лобби, для совершения ставок и пари на матч.

    Хотя наша игра является полностью функциональной, мы еще не реализовали никакой логики призов, кроме начального соответствия ставок. То есть, победители не получают приза, и в случае ничьей ставки не возвращаются. Тем не менее, это будет предметом сегодняшнего урока.

    Если вы впервые к нам присоединяетесь, обязательно ознакомьтесь с первой частью нашей серии руководств.

    Это руководство полностью основано на плагине ARK Core, поэтому мы не будем вносить какие-либо изменения в наш проект Construct 3 все это время. Чтобы начать, откройте файл manager.ts в любом текстовом редакторе!

    Реализация призовой логики

    Прежде чем мы начнем, мы должны импортировать транзакции из крипто библиотеки ARK. Для этого найдите:

    Code:
    import { Identities } from “@arkecosystem/crypto”;

    Замените его на:

    Code:
    import { Identities, Transactions } from “@arkecosystem/crypto”;// Now, we’ll examine the relevant part of our existing generateState function to see what happens when a game is won or tied:if (outcome !== “ongoing”) {
        break;
    }

    Помните, что в случае ничьей значение переменной результата будет “tie”, и если кто-то выиграл, значение переменной результата будет 1 или 2, в зависимости от того, был ли победителем игрок 1 или игрок 2. В противном случае значение будет “ongoing”.

    Из этого фрагмента кода мы видим на данный момент, что если значение исходной переменной не “ongoing”(т. е. игра выиграна или сыграна вничью), то наш цикл заканчивается, но больше ничего не происходит. Давайте продолжим и пересмотрим этот код сейчас для включения логики, чтобы платить нашим игрокам. Поскольку код выполняется только в том случае, если игра выиграна или сыграна вничью, мы должны это проверить Если это так, мы возвращаем ставку обоим игрокам. Если нет, это означает, что игрок выиграл игру, поэтому должен получить весь приз, который является суммой обеих ставок:

    Code:
    if (outcome !== "ongoing") {
        if (outcome === "tie") {
            this.pay(address, players, wager);
        } else {
            this.pay(address, players[outcome], wager * 2);
        }
        break;
    }

    Конечно, мы все еще должны написать нашу функцию оплаты. В случае ничьей объект игроков (который содержит адреса обоих игроков) отправляется в нашу функцию. Когда игра выиграна, просто адрес победителя отправляется в нашу функцию в виде строки. Это означает, что наша функция оплаты будет знать, какой сценарий происходит, проверяя, являются ли переданные ей данные объектом адресов (tie) или единственной адресной строкой (win).

    ARK Core 2.6 представил широкий спектр полезных функций, которыми мы можем воспользоваться здесь. Первый - это nonces. Проще говоря, каждая транзакция из отправляющего кошелька должна иметь уникальное значение nonce и строго на единицу больше значения nonce самой последней транзакции, отправленной из кошелька. Мы можем использовать это, чтобы проверить значение nonce нашего игрового кошелька - если значение равно нулю, это означает, что мы еще никому не заплатили, поэтому мы должны это сделать. Если значение nonce не равно 0, мы уже заплатили за эту игру. Это предотвращает случай, когда игрокам платят несколько раз (например, когда вы перезапускаете свой плагин и состояние игры восстанавливается).

    Вторая особенность - это мультиплатежи. Это означает, что в случае ничьей мы можем заплатить обоим игрокам за одну транзакцию. Это помогает уберечь от перегрузки сети, и поскольку существует только одна транзакция, это означает, что существует только один nonce.

    Сопоставив все вместе, наша логика для функции оплаты выглядит следующим образом:

    1.Если nonce кошелька не равен нулю, мы уже заплатили, поэтому мы должны выйти.
    2.Мы получаем пароль для кошелька игры и его открытый ключ.
    3.Если данные, переданные в функцию, представляют собой одну строку, мы генерируем стандартную транзакцию перевода на указанную сумму за вычетом комиссии за транзакцию и отправляем ее по адресу в строке.
    4.Если предоставленные данные являются объектом, содержащим несколько адресов, мы генерируем транзакцию с несколькими платежами для обоих игроков с указанной суммой за вычетом комиссии за транзакцию.
    5.Как только наша транзакция была сгенерирована, мы подписываем ее и транслируем в сеть.

    Мы можем сделать это следующим образом:

    Code:
    private pay(sender: string, recipient: string | object, amount: number) {
        const wallet = app.resolvePlugin("database").walletManager.findById(sender);        if (wallet.nonce.toString() !== "0") {
            return;
        }    const passphrase = this.addresses[sender];
        const publicKey = Identities.PublicKey.fromPassphrase(passphrase);
        const fee = "1000000";
        const payAmount = (amount — parseInt(fee)).toString();
        let transaction;        if (typeof recipient === "string") {
            transaction = Transactions.BuilderFactory.transfer().nonce("1").senderPublicKey(publicKey).recipientId(recipient).fee(fee).amount(payAmount).vendorField("You won the game, congratulations!");
        } else {
            transaction = Transactions.BuilderFactory.multiPayment().nonce("1").senderPublicKey(publicKey).fee(fee).vendorField("The game was tied. Here is your wager!");
            transaction.addPayment(recipient[1], payAmount);
            transaction.addPayment(recipient[2], payAmount);
        }        const signedTransaction = transaction.sign(passphrase).build();
        app.resolvePlugin("p2p").getMonitor().broadcastTransactions([signedTransaction]);
    }

    Следующие шаги

    Поздравляем, наша игра на блокчейне теперь может рассчитывать, присуждать, выплачивать призы или возвращать вступительные взносы в случае ничьей. Наша отдельная игра завершена! В заключительной части нашей серии руководств мы настроим нашу игру как плагин внутри ARK Desktop Wallet.

    Если вы застряли в какой-то момент, обязательно ознакомьтесь с нашими документами в центре обучения ARK. Кроме того, наша команда и разработчики активны в Slack , поэтому не стесняйтесь обращаться к нам!

    Проверьте предыдущие статьи из этой серии здесь:

         Часть первая: Как импортировать адрес кошелька ARK в ваше приложение
         Часть вторая: Создание бэкенда для вашего плагина
         Часть третья: Как заставить вашу игру работать с системой ставок
         Часть четвертая: Внедрение игровой логики в ваш плагин

Page 84
Viewing Page: 85