Проблема заключается в том, как согласовать сделки, полученные bitcoind с государством в другой базе данных, даже без возможности пропустить сделку или два раза обработки одной транзакции. Это решение учитывает, что ранее обработанные транзакции могут быть удалены из блока цепи и повторно вставлены в другой блок позже, если bitcoind обнаруживает, что другая, более сильная цепь существует. Для поддержки этого обнаружения, bitcoind должен быть изменен, чтобы включать в себя блок хэш в выходной listtransactions. Позвольте мне объяснить процесс.
Во-первых, вы должны иметь какой-то, где вы храните обработанные транзакции. Таблица должна содержать Биткойн идентификатор транзакции и блок-идентификатор (хеш, а не номер последовательности) столбцы. Затем вы опрашивать bitcoind периодически так:
- Запрос последних N операций, где N является произвольным числом.
- Прогулка возвращаемого списка назад (последняя сделка первый) ищет сделки, которые вы считаете, подтвержденными (1 или 3 или 6 подтверждений, или любые ваши требования указывать). Для каждой операции:
- Посмотрите на идентификатор транзакции в таблице транзакций. Если он не существует, это новая сделка; обработать его и вставить идентификатор транзакции и блок-ID в таблицу. (Использование транзакций, конечно, заставить обработку атомарным.)
- Если идентификатор транзакции существует, сравнить блок хэш в таблице на блок-хэш в транзакции возвращается из bitcoind. Если они совпадают, то вы обработали все новые операции и теперь должны прекратить / возврат. Если они не совпадают, это сделки, которые были обработаны уже, но был перемещен в новый блок из-за сиротой оригинального блока, который вы видели транзакцию в. Обновите блок хэш-идентификатор в таблице и продолжить обработку, так как вполне возможно, что новая транзакция по-прежнему существует до этого один в блоке цепи.
- Если вы достигните начала списка транзакций, то вы не нашли какой-либо сделки, которые вы уже обработаны и что имеет правильный блок хэш. Увеличение N (что-то добавить к нему или умножить его на что-то) и начать весь процесс заново.
Я считаю, что это самый простой процесс, который будет правильно учесть любые изменения в блок цепи. Если вы можете увидеть проблему с этим алгоритмом, или таким образом, что он может быть упрощен (особенно если изменения bitcoind не нужно), пожалуйста, дайте мне знать.