Статьи

Как обратиться к смарт-контракту из Unity. Децентрализованный геймдизайн и web3-инструменты для разработки игр

Обычно в играх блокчейн используется для проведения защищённых транзакций, таких как покупка уникальных NFT-предметов игроками. В этой статье мы рассмотрим новый подход: как использовать блокчейн в качестве платформы для децентрализованного голосования, предоставляя игрокам контроль над игровым балансом. Чем может быть полезно применение такого подхода с точки зрения разработчика:

  1. Новый игровой опыт. Возможность выбора вне стандартных аспектов игры, а именно в настройке игрового мира, делает опыт каждого игрока более уникальным и приспособленным под него.
  2. Офлайн мультиплеер. Участие в голосованиях, влияющих на игровой мир, способствует чувству причастности и единства с другими игроками, даже в офлайн-режиме. Примерно тот же эффект можно наблюдать в Death Stranding, где можно видеть и косвенно влиять на структуры, построенные другими. Это выгодно и для разработчиков, так как отпадает необходимость содержать сервер.
  3. Гибкий игровой баланс. Перед каждым геймдизайнером стоит задача — не сделать игру слишком лёгкой и скучной, и так же не сделать её угнетающе сложной. Поэтому при расчёте баланса для среднестатистического пользователя можно использовать обратную связь от самих пользователей. Так, например, студия CD Projekt RED собирается прекратить поддержку мобильной игры Gwent, зато дать игрокам возможность самим регулировать баланс.

Итак, представим ситуацию, где в игре присутствует враг со шкалой здоровья определенного значения (int). Игрок может ввести более подходящее значение, отправить его в блокчейн и получить обновлённое среднее значение из всех голосов. Ниже приведена пошаговая инструкция по реализации этой идеи: создание и тестирование смарт-контракта на платформе Remix, деплой смарт-контракта на тестовый блокчейн Ganache, написание логики взаимодействия с функциями и переменными из смарт-контракта с помощью среды разработки Unity.

Шаг 1. Создание смарт-контракта

Откройте Remix — среду для написания, тестирования и развертывания смарт-контрактов на Ethereum (https://remix.ethereum.org/). Слева сверху выберите вкладку File explorer, нажмите на иконку Create new file и создайте новый файл смарт-контракта с расширением .sol. Вставьте в файл следующий код или напишите свой на языке Solidity (наш пример — https://github.com/octantast/Unity_web3_contract_test/blob/main/SimpleVoting.sol). В Remix перейдите на вкладку Deploy & run transactions, в строчке Environment поставьте JavaScript VM (на момент написания статьи — Remix VM (Shangai)). Перейдите на вкладку Solidity compiler и нажмите Compile SimpleVoting.sol. Этот смарт-контракт будет находиться в открытом доступе после первой транзакции по нему, и лучше протестировать контракт сразу, чтобы потом не возникало сложностей с редактированием.

Вернитесь на вкладку Deploy & run transactions. Здесь можно увидеть аккаунты для тестирования, лимит газа для транзакции и перечень ваших контрактов. Проследите, чтобы был выбран нужный, нажмите Deploy. Ниже в Deployed contracts должна появиться панель с методами контракта. Используйте адреса из списка и любые значения для инпута, чтобы убедиться, что контракт работает правильно. Для подтверждения ввода значений нажимайте на название функции, в нашем примере – voteForHealth, для проверки вычислений нажимайте на переменные (-call). Чтобы скачать .sol скрипт, перейдите на вкладку File explorer > Workspace» > Download и распакуйте архив.

C:\Users\Octanta\Desktop\git\2_Remix.jpg

Шаг 2. Деплой смарт-контракта на тестовый блокчейн Ganache

Для вызова смарт-контракта нужно знать его Ethereum-адрес и ABI (Application Binary Interface). ABI контракта можно скопировать из Remix, в разделе Solidity compiler, обратите внимание, что в C# строки JSON должны быть заключены в двойные кавычки («»). Далее, чтобы создать адрес контракта, его необходимо инициализировать, проведя первую транзакцию. После этого адрес появится в блокчейне. Чтобы контракт появился на Ethereum, вам нужно будет оплатить газ реальными эфирами. Для тестирования можно начать с Ganache или другой тестовой бесплатной среды, в которой предоставленные эфиры не имеют реальной стоимости.

Установите Ganache (https://trufflesuite.com/ganache/), запустите его и создайте новый проект. Откроется локальный блокчейн с тестовыми аккаунтами и балансами. Чтобы развернуть на нём свой контракт, используйте Truffle. Установите Truffle, введя в командной строке / терминале следующую команду:

npm install -g truffle

Если необходимо, установите Node.js (https://nodejs.org/), чтобы использовать команду npm, и откройте командную строку с правами администратора. Проверьте установку Truffle, выполнив команду:

truffle version

Создайте новую директорию для вашего проекта и перейдите в неё в командной строке/терминале. Инициализируйте проект Truffle:

truffle init

Эта команда создаст структуру проекта Truffle с директориями contracts, migrations, test и файлом конфигурации truffle-config.js. Скопируйте свой файл смарт-контракта .sol в папку contracts. Затем откройте файл truffle-config.js (наш пример — https://github.com/octantast/Unity_web3_contract_test/blob/main/truffle-config.js) и раскомментируйте строки, отредактировав их значения под свой компьютер:

networks: {
 development: {
 host: "127.0.0.1",
 port: 7545,
 network_id: "*",
 },
 },

Номер порта (обычно по умолчанию 7545) и хоста можно сверить в Ganache на вкладке Server в настройках. Также раскомментируйте следующие строки:

compilers: {
 solc: {
 version: "0.8.13", 
 }
},

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

Используя терминал в корневой папке проекта, скомпилируйте смарт-контракт:

truffle compile

Создайте файл 2_deploy_contracts.js в папке migrations и вставьте туда скрипт для деплоя, заменив название файла смарт-контракта и цены на свои (наш пример — https://github.com/octantast/Unity_web3_contract_test/blob/main/2_deploy_contracts.js).

Теперь можно развернуть контракт на локальном блокчейне Ganache с помощью команды:

truffle migrate –reset

Откройте настройки Ganache > Workspace > AddProject. Выберите файл truffle-config.js в корневой папке проекта, нажмите Restart и Cancel. В разделе Contracts вы должны увидеть свой развернутый контракт и его адрес.

C:\Users\Octanta\Desktop\git\4_Ganache.jpg

Если контракт не отображается, перезайдите в Ganache и повторно выполните команды:

truffle compile
truffle migrate --reset

Если возникает ошибка, при миграции контракта указывайте флаг —verbose-rpc, чтобы получать более подробные сведения.

Шаг 3. Вызов смарт-контракта из Unity

Чтобы взаимодействовать с блокчейном в Unity, вам понадобится библиотека Nethereum. Добавьте ее в свой Unity проект с помощью Window > Package Manager > Add Package from git URL (https://github.com/Nethereum/Nethereum.Unity). Создайте скрипт .cs, повесьте его на объект на сцене и пропишите в нём логику вызова контракта. Замените адрес контракта на свой, вставьте ABI контракта в формате string и rpcUrl (наш пример — https://github.com/octantast/Unity_web3_contract_test/blob/main/SmartContractReader.cs).

В данном примере используются 3 публичные переменные:

  • string senderAddress – адрес кошелька игрока, с которого он будет обращаться к контракту; при тестировании используйте один из предложенных адресов Ganache;
  • int health – значение здоровья врага, которое вводит игрок;
  • int healthAverage – усреднённое значение здоровья врага, которое читается из смарт-контракта.

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

C:\Users\Octanta\Desktop\git\4_UnityScene.jpg

Создайте кнопку, и настройте на OnClick() вызов функции VoteForHealth() из игрового скрипта. Запустите сцену. На старте должен произойти вызов корутины PreReadFromContract(), которая считывает текущее среднее значение proposedHealth из смарт-контракта и выводит его в поле healthAverage.

Теперь введите своё значение в поле health в инспекторе и нажмите на созданную кнопку. После этого в Ganache должна отобразиться проведённая транзакция, значения в смарт-контракте изменятся, и в поле healthAverage выведется новое среднее значение. Используйте адрес другого тестового кошелька и другое значение, чтобы убедиться, что смарт-контракт работает правильно. На скриншоте ниже пример консоли после двух транзакций с вводом значений 40 и 60.

C:\Users\Octanta\Desktop\git\6.jpg

Имейте в виду, что в данном смарт-контракте значения хранятся в шестнадцатеричной системе, поэтому значение суммы голосов sum 100 отображается как 64​, а среднее proposedHealth 50 как 32​.

C:\Users\Octanta\Desktop\git\7_ContractExample.jpg

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

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

Итого, в данной статье мы рассмотрели ключевые этапы интеграции блокчейна и Unity для создания и тестирования децентрализованных игровых сценариев: от создания смарт-контракта на Ganache до взаимодействия с ним в среде разработки через Nethereum. Этот подход к созданию web3 игр на Unity, а именно участие игроков в принятии решений, влияющих на баланс игрового мира, открывает новые возможности для геймдизайна. Но так же и сопряжен с новыми рисками, например, злоупотреблением игроками своими полномочиями. Однако, это можно предусмотреть, нужно тщательно обдумывать логику контракта и не терять веры в благоразумие людей.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *