Все знают, что такое SatoshiDice. Их основная механика — азартные игры с использованием биткойн-транзакций, при этом выплата напрямую связана с транзакцией, которая подпитывала кровать, чтобы избежать атак двойного расхода. У меня вопрос, как реализовать такой механизм? Можно ли это сделать в стандартном клиенте или для выбора точных входных данных транзакции требуется дополнительное программное обеспечение?
Создать игру, подобную SatoshiDice, довольно просто. Ниже приведены основные этапы создания такой игры.
Для каждой входящей транзакции...
Получить сумму клиента и адрес платежа
Звоните bitcoind getrawtransaction [The incoming transaction ID] 1
. 1 в конце вернет данные в «подробном режиме», что по сути является необработанными данными в формате JSON.
Из необработанных сведений о транзакции возьмите txid
и vout
из vin
объекта. С этой транзакцией снова вызовите bitcoind getrawtransaction
метод txid
.
Из этих необработанных сведений о транзакции найдите vout
объект, на который ссылается vout
индекс из шага № 2. Внутри этого vout
объекта должен быть список адресов получателей платежей. Возьмите и сохраните первый адрес.
Определите состояние выигрыша/проигрыша в раунде и верните результаты
Хэш txid
+ vout
индекс транзакции. Наполните свою хэш-функцию секретным ключом. В качестве примечания, вам нужно будет периодически предоставлять свой секретный ключ. Без обновления и предоставления ваших секретных ключей ваши игроки не смогут проверить вашу честность.
Сравните последние четыре байта вашего хэша, чтобы определить условие выигрыша/проигрыша.
В случае проигрыша...
Звоните bitcoind createrawtransaction
. Вы должны передать исходный txid
и vout
платеж ваших клиентов. Вместе с адресом клиента включите небольшое дробное значение для отправки клиенту. Это сообщает им, что они проиграли раунд. Кроме того, укажите второй платежный адрес, на который будет поступать оставшаяся часть биткойнов от клиентов, инициирующих платеж. Это должен быть адрес в вашем кошельке.
Звонок bitcoind signrawtransaction
для подписания сделки. Если он возвращает значение complete=true
, ваша транзакция действительна.
Вызовите bitcoind sendrawtransaction
и включите созданную выше необработанную транзакцию.
В случае выигрыша
Рассчитайте сумму выигрыша клиентов.
Звоните bitcoind listunspent
. Это вернет список введенных транзакций, которые не были потрачены вашим кошельком.
Создайте список транзакций для обработки в качестве платежей. Во-первых, укажите происхождение клиента txid
и vout
индекс его платежа. Затем добавьте в список любое количество неизрасходованных транзакций (из шага 1), которые необходимы для выплаты выигрыша вашему клиенту.
Не забудьте указать дополнительный платежный адрес, на который будет поступать оставшаяся часть биткойнов от последней неизрасходованной транзакции, которая может содержать превышение над выигрышем игрока.
Вызовите bitcoind createrawtransaction
, передав все транзакции, накопленные на шаге №3.
Звонок bitcoind signrawtransaction
для подписания сделки.
Вызовите bitcoind sendrawtransaction
и включите созданную выше необработанную транзакцию.
Вот и все! Это очень упрощенный процессор SatoshiDice. Вы можете добавить дополнительную проверку, кэшировать свои транзакции, отслеживать потерянные блоки и просто интегрировать некоторые другие административные процедуры.
Стоит отметить, что вы всегда включаете часть первоначального платежа клиента во все свои операции возврата. Это связано с тем, что если их платеж потерян или помечен как недействительный, вы хотите быть уверены, что ваша транзакция также будет удалена из цепочки блоков.
Используя этот метод, вы можете ответить почти мгновенно, и нет необходимости в подтверждениях. Если их транзакция искажена и отклонена сетью, ваша транзакция также будет отклонена сетью, поскольку она является дочерней по отношению к их исходной транзакции.
Реальные кости Satoshi используют библиотеку bitcoinj .
Вы можете легко написать часть программного обеспечения, которое работает на той же машине, что и биткойн-демон, и позволить ему использовать JSON-RPC API локального биткойн-демона.
Существуют примеры реализации JSON-RPC для всех популярных языков программирования, таких как Python и Java.
Эта часть программного обеспечения будет опрашивать новые транзакции, проверять их и применять ваши правила игры, а также снова совершать новые транзакции. Обратите внимание, что сервер с таким программным обеспечением должен иметь только порт биткойнов, открытый для Интернета, в то время как порт RPC может быть ограничен локальными подключениями для безопасности.
Кристианп
РЛХ
listsinceblock
.