Как работает игра “камень-ножницы-бумага” на Aleo

Kaylej
3 min readMay 11, 2023

--

В этой статье узнаем, как технически устроена игра “камень-ножницы-бумага” на блокчейне Aleo.

Камень-ножницы-бумага — игра для двух человек. Игроки выбирают предмет (где 0 — камень, 1 — ножницы и 2 — бумага) и определяют победителя следующим образом: камень побеждает ножницы, ножницы побеждают бумагу, и бумага побеждает камень.

В реальной жизни игроки одновременно выбирают предмет и сразу определяют победителя, однако в web3 такое реализовать очень сложно. Обычно блокчейн — это что-то очень медленное и публичное, поэтому процесс создания такой игры может быть затруднительным. Для “камень-ножницы-бумага” уже есть решение на Solidity с использованием шифрования, однако даже при этом программа имеет некоторые ограничения.

Решение на Solidity

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

Суть решения заключается в следующем: создаётся смарт-контракт (т.е. третий адрес), куда участники отправляют зашифрованное число (например, 2 с ключом 12345) и ставку (например, 1 ETH). Далее участники должны будут предоставить ключ для дешифрации своего выбора и затем программа выберет победителя и отправит ему денежные средства. Однако возможен следующий сценарий: один из участников раскрывает свой выбор, а его соперник, увидев, что он проиграл, решает не отправлять ключ к своему ответу. Отсюда следует логичное решение проблемы — установить временной интервал, за который второй игрок должен будет предоставить ключ. Но что, если у одного из игроков отключат интернет или электроэнергию? Разве нельзя сделать работу функции атомарно?

К сожалению, нет. Приватность блокчейнах сводится лишь к тому, что только информация, хранящаяся off-chain, может быть должным образом защищена.

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

Решение на Leo (в блокчейне Aleo)

Ссылка на решение: здесь.

Принцип работы:

  1. Отправить вызов

Мы отправляем record с зашифрованными числом и ключом (складываются шифры ключа и выбора) тому, с кем хотим играть.

2. Далее второй игрок должен будет принять вызов, отправив свой выбор:

Здесь мы видим, что автор программы решил сделать следующее: не шифровать ответ второго участника, и далее

3. Вызывающий должен будет подтвердить свой ключ и программа выявит победителя:

Работать с временными отметками в блокчейне Aleo пока нельзя. Поэтому воссоздать trustless игру “камень-ножницы-бумага” здесь невозможно.

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

Зачем нужен ключ? Ответ для новичков

Шифрование работает только в одну сторону. Это значит, что число легко зашифровать и сложно расшифровать. Если мы используем самый популярный метод шифрования (sha-256), то здесь одно и то же сообщение не может иметь разные хэши (как и в любых других нормальных принципах шифрования). То есть, если я передам программе выбор “2”, то на выходе хэш будет всегда один и тот же (как на картинке). Можете проверить сами по ссылке: https://emn178.github.io/online-tools/sha256.html

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

--

--