В течение прошлого семестра мы, студенческий проект Берлинского технического университета, занимались созданием шахматной игры для Ethereum, платформы распределенных вычислений на основе блокчейна.

Курировали проект кафедры Инженерия информационных систем ТУ и Dr. Christian Reitwiessner от фонда Ethereum.

Целью проекта было разработать реальное приложение с использованием доступных инструментов и оценить проблемы и преимущества этой новой платформы.

В этой первой статье мы объясним созданное нами приложение и подробно рассмотрим основные извлеченные уроки. Мы планируем выпустить еще две статьи о структурах данных Solidity и инструментах разработки Ethereum.

Онлайн-игры

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

Кроме того, предоставление этой услуги стоит денег, поэтому поставщик должен получать какой-то доход, будь то сборы или реклама.

Идея децентрализованной сети и, в частности, платформ, таких как Ethereum, заключается в устранении доверия, необходимости в постоянно работающих серверах и обслуживании сервиса, а также в центральной единой точке отказа. Все транзакции происходят в глобальной общедоступной базе данных, которая называется блокчейн. Эти операции называются on-chain. Сообщения отправляются через одноранговую сеть. В отличие от традиционных веб-приложений, не требуется развертывать и обслуживать центральные серверы. Нет партии, которая может закрыть службу, обмануть или убежать с любыми деньгами.

Сформировав команду студентов, у всех из которых был некоторый опыт веб-разработки, мы приступили к созданию удобной онлайн-игры в шахматы. Шахматы - это хорошо известная пошаговая игра для двух игроков с четко определенными правилами. Он также хорошо изучен в области компьютерных наук и, следовательно, является хорошим кандидатом для первого проекта.

На высоком уровне шахматы состоят из следующих объектов: два игрока, доска из 64 квадратов, по 16 фигур на игрока и серия фигур, перемещающихся с одной клетки на другую. Для всего этого нам потребуются структуры данных, а также логика для выполнения и проверки ходов и условий окончания игры. Чтобы действительно продемонстрировать полезность создания распределенного приложения Ethereum, мы также добавим методы для ставок и выигрыша денег.

Контракт

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

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

Мы абстрагировали весь код, который применяется к пошаговым играм в целом, в абстрактный базовый класс. Шахматы - это основной контракт, с которым взаимодействуют клиенты. Правила игры (проверка состояния и хода) находятся в подбиблиотеке ChessLogic. Некоторые вспомогательные функции, такие как проверка подписи (Auth) и вычисление оценки Elo, также передаются библиотекам на аутсорсинг.

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

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

Урок первый: дорогостоящие вычисления обычно не подходят для выполнения в сети.

Ответ на запрос

Возможное решение - переосмыслить проблему и заняться ее с другой стороны.

В чем проблема? Игрок A ставит игрока B на мат и хочет, чтобы контракт подтвердил и подтвердил это условие. Если это невозможно, можем ли мы убедиться в обратном?

Представьте, что игрок А просто заявляет, что условие было достигнуто, и тогда у игрока Б есть шанс опровергнуть это утверждение. Это легко - им просто нужно подать еще один действительный ход, и первоначальное утверждение оказывается ложным. Этот интерактивный способ проверки также связан с тем, как люди разыгрывают реальный (аналогичный) шах - я говорю «шах мат», и либо вы соглашаетесь с тем, что проиграли, либо показываете мне ход, который все еще можете сделать.

Это форма «Вызов – ответ». Это кажется простым, но вы должны рассмотреть все возможные состояния и найти способы их справедливого разрешения и без взаимоблокировок.

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

На этом этапе мы также добавили общее «условие тайм-аута», которое означает, что игрок может выиграть игру, если другой игрок прекратил играть. Думайте об этом как о времени поворота.

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

Второй урок: для эффективного распределенного децентрализованного обмена данными переосмыслите проблему и придумайте альтернативные решения.

Вне сети

Однако самая большая проблема при создании сетевых игр - это отсутствие реального времени. Транзакции Ethereum обрабатываются блоками, которые происходят примерно каждые 14 секунд. Это довольно быстро, но определенно недостаточно быстро для игры, которая должна работать в реальном времени.

Один из подходов к этому - переместить некоторую часть коммуникации из блокчейна (в дальнейшем именуемого off-chain). Мы по-прежнему хотим сохранить нашу бессерверную архитектуру, поэтому для этого мы можем использовать одноранговые веб-протоколы. В будущем для этого случая можно будет использовать собственный Whisper Ethereum. До этого мы реализовали фиктивный прокси-сервер, чтобы имитировать обмен данными через Whisper, чтобы протестировать такую ​​архитектуру.

Давайте еще раз подумаем о нашей проблеме. Какую часть игры можно выполнять вне сети, не теряя преимуществ в сети?

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

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

Другими словами, во время обычного игрового процесса каждый игрок отправляет свой следующий ход и итоговое состояние игры, а также криптографическую подпись. Если другой игрок не согласен, он может отправить эти данные в смарт-контракт для проверки. То же самое можно сделать в конце игры. Кроме того, клиенты будут подтверждать сообщения друг друга, чтобы быстрее обнаруживать проблемы.

Помимо настройки игры (инициализация и присоединение), клиенты отправляют сообщения в блокчейн только тогда, когда они хотят что-то потребовать (тайм-аут, выигрыш, розыгрыш) и отозвать свой приз.

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

Сначала это может показаться шагом назад - в конце концов, разве мы не пытались создавать «неудержимые приложения», сохраняя все данные и реализуя всю логику в блокчейне?

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

Заключение

По сути, децентрализованная сеть - это новый способ моделирования проблем. Для этого смарт-контракты предоставляют хорошую основу для мышления, но необходимо использовать дополнительные идеи.

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

В заключение, мы думаем, что реализовать децентрализованные игры с использованием Ethereum определенно возможно, но нужна умная модель, чтобы сделать их эффективными и удобными.

PS: Весь наш код имеет открытый исходный код и его можно найти здесь. Репозиторий все еще нуждается в некоторой очистке, но если хотите, можете прямо сейчас покопаться в контрактах.