Как реализовать такую ​​игру, как SatoshiDice?

Все знают, что такое SatoshiDice. Их основная механика — азартные игры с использованием биткойн-транзакций, при этом выплата напрямую связана с транзакцией, которая подпитывала кровать, чтобы избежать атак двойного расхода. У меня вопрос, как реализовать такой механизм? Можно ли это сделать в стандартном клиенте или для выбора точных входных данных транзакции требуется дополнительное программное обеспечение?

Ответы (3)

Создать игру, подобную SatoshiDice, довольно просто. Ниже приведены основные этапы создания такой игры.

Для каждой входящей транзакции...

Получить сумму клиента и адрес платежа

  1. Звоните bitcoind getrawtransaction [The incoming transaction ID] 1. 1 в конце вернет данные в «подробном режиме», что по сути является необработанными данными в формате JSON.

  2. Из необработанных сведений о транзакции возьмите txidи voutиз vinобъекта. С этой транзакцией снова вызовите bitcoind getrawtransactionметод txid.

  3. Из этих необработанных сведений о транзакции найдите voutобъект, на который ссылается voutиндекс из шага № 2. Внутри этого voutобъекта должен быть список адресов получателей платежей. Возьмите и сохраните первый адрес.

Определите состояние выигрыша/проигрыша в раунде и верните результаты

  1. Хэш txid+ voutиндекс транзакции. Наполните свою хэш-функцию секретным ключом. В качестве примечания, вам нужно будет периодически предоставлять свой секретный ключ. Без обновления и предоставления ваших секретных ключей ваши игроки не смогут проверить вашу честность.

  2. Сравните последние четыре байта вашего хэша, чтобы определить условие выигрыша/проигрыша.

В случае проигрыша...

  1. Звоните bitcoind createrawtransaction. Вы должны передать исходный txidи voutплатеж ваших клиентов. Вместе с адресом клиента включите небольшое дробное значение для отправки клиенту. Это сообщает им, что они проиграли раунд. Кроме того, укажите второй платежный адрес, на который будет поступать оставшаяся часть биткойнов от клиентов, инициирующих платеж. Это должен быть адрес в вашем кошельке.

  2. Звонок bitcoind signrawtransactionдля подписания сделки. Если он возвращает значение complete=true, ваша транзакция действительна.

  3. Вызовите bitcoind sendrawtransactionи включите созданную выше необработанную транзакцию.

В случае выигрыша

  1. Рассчитайте сумму выигрыша клиентов.

  2. Звоните bitcoind listunspent. Это вернет список введенных транзакций, которые не были потрачены вашим кошельком.

  3. Создайте список транзакций для обработки в качестве платежей. Во-первых, укажите происхождение клиента txidи voutиндекс его платежа. Затем добавьте в список любое количество неизрасходованных транзакций (из шага 1), которые необходимы для выплаты выигрыша вашему клиенту.

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

  4. Вызовите bitcoind createrawtransaction, передав все транзакции, накопленные на шаге №3.

  5. Звонок bitcoind signrawtransactionдля подписания сделки.

  6. Вызовите bitcoind sendrawtransactionи включите созданную выше необработанную транзакцию.


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

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

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

Я думаю, чтобы получить «Для каждой входящей транзакции ...», вы бы просто вызвали listtransactions?
Да или listsinceblock.

Реальные кости Satoshi используют библиотеку bitcoinj .

Вы можете легко написать часть программного обеспечения, которое работает на той же машине, что и биткойн-демон, и позволить ему использовать JSON-RPC API локального биткойн-демона.

Существуют примеры реализации JSON-RPC для всех популярных языков программирования, таких как Python и Java.

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

Что ж, после попытки реализовать это через API Биткойн, я столкнулся с проблемой, что начиная с 0.8 и новой системы баз данных, биткойн не имеет всей информации о старых транзакциях, поэтому выяснить отправителя данной транзакции может быть проблематично.
Как определяется «старая» транзакция? SatoshiDice действует быстро, верно? Я предполагаю, что детали транзакции должны храниться как минимум в нескольких блоках, не так ли?
Что ж, чтобы определить адрес выдачи с помощью API, вам нужно посмотреть транзакцию, предшествовавшую той, что была азартной, которая может быть сколь угодно старой.
Вы можете отслеживать предыдущие транзакции в базе данных, а затем запрашивать их, если они старше в блокчейне.