Здравствуй,
какой алгоритм должен базируемый игорный сайт Bitcoin следовать, чтобы сохранить правильный баланс пользователя, не запуская некоторый странный cronjobs, что перебирать всю базу данных? может быть, я просто слишком глуп, чтобы ввести правильные условия поиска в Google, но этот вопрос продолжал мне теперь покупает в течение нескольких дней. пришел с двумя подходами, но чувствует, как я усложнять простой вопрос. Так как они это делают?
мои мысли:
Цель:
- на веб-сайте, пользователь может внести биткойны.
- через определенные виды деятельности на веб-сайте пользователь может выиграть или проиграть монеты.
- пользователь всегда отображается точный баланс монет, который является: общий баланс = общая сумма вкладов - всего водозабор + общий выигрыш - суммарные потери.
- пользователь может вывести монеты из его общего баланса.
- система может передавать монеты из учетных записей пользователей на другой кошелек, чтобы иметь их в безопасном (г) месте вне сервера.
предварительные условия:
- количество подтверждений не имеет значения для депозитов. как только сделка идет в переданных монетах доступны в качестве депозита. пользователь может только вывести свой баланс, когда все депозиты подтверждены.
- не апите третьей стороны не используются. только bitcoind и jsonRPCClient.
Подход 1 - абсолютное равновесие
1. создать 4 таблицы:
1.1 user_balance: одна строка для каждого пользователя, имеет текущий баланс
1,2 transactions_unprocessed: новые транзакции будут добавлены в эту таблицу
1.3 transactions_processed: проводит операции, которые были обработаны
1,4 transactions_history: старые обработанные транзакции перемещаются сюда
2. запустить bitcoind с walletnotify, который вызывает скрипт, который добавляет заявленную транзакцию таблицы transaction_unprocessed
3. запустить cronjob каждые 30 секунд:
3.1 принять все транзакции из таблицы transactions_unprocessed
3,2 удалить дубликаты transaction_ids из набора данных
3.3 принять все транзакции из таблицы transactions_processed, которые также в необработанном наборе данных
3.4 удалить Allready обработанных транзакций из набора данных
3,5 перебрать все оставшиеся необработанные сделки и обновлять user_balance соответственно
3,6 добавить в настоящее время обрабатываются транзакции в таблице transactions_processed
3.7 удалить все первоначально сообщалось операции (этап 3.1) из таблицы transaction_unprocessed
4. запустить cronjob один раз в день, который перемещает все транзакции, которые старше х дней со стола transactions_processed в таблице transactions_history
5. если пользователь выигрывает или проигрывает или изымает монеты, таблица user_balance обновляется соответствующим образом
6. Совокупный баланс = значение в таблице user_balance
Подход 2 - относительный баланс
1. создать таблицу additional_balance с одной строкой для каждого пользователя. Колонки: пользователь, баланс
2. Обновление additional_balance: потери вычитаются, выигрыши добавляются к балансовой стоимости
3. Совокупный баланс = монеты в кошельке, как сообщает bitcoind->getbalance + значение баланса в таблице additional_balance
4. если монеты перемещаются из пользователей приходится системой (например, для выполнения запросов вывода или хранить их в автономном режиме) -> добавить перенесенную стоимость монеты в additional_balance придерживаться общего баланса то же самое
5. если пользователь отзывает монету из своего баланса -> вычесть их из значения в таблице additional_balance (принимая монеты в реальном счете, чтобы выполнить передачу покрыта 4.)