В настоящее время мы работаем над интеграцией службы синхронизации книги в нашем Cordapp: https://github.com/corda/corda-solutions/tree/master/bn-apps/ledger-sync
В ходе наших собственных испытаний мы обнаружили, что при определенных обстоятельствах бухгалтерская книга не успешно синхронизируется / восстанавливается после сбоя.
Наш тест выполняет следующее:
- Узел
A
и B
осуществляют транзакции друг с другом, создавая состояние S
.
- Узел
B
аварийно завершает работу и восстанавливается до состояния, в котором он не знает S
.
- Узел
A
создает новую транзакцию, которая потребляет состояние S
- Узел
B
использует службу синхронизации главной книги для восстановления всех состояний.
В фоновом режиме происходит следующее: Когда узел A
создает Tx, который потребляет состояние S
, узел B
также получит старый Tx, создавший состояние S
в качестве зависимости. С этого момента Tx записывается в базу данных узла B
и может быть получен путем вызова serviceHub.validatedTransactions.getTransaction(txId)
.
Однако запрос хранилища для состояний CONSUMED
или ALL
не вернет старое состояние S
. Запуск синхронизации по регистру сообщит, что узел не синхронизирован, сообщив, что транзакция, которая создала состояние S
, отсутствует.
Вызов ремонта не приведет к успешному восстановлению, а последовательные прогоны RequestLedgersSyncFlow
будут сообщать о пропущенных транзакциях.
Я не уверен, что этот вариант использования фактически поддерживается (создание Txs, когда регистр не синхронизирован), но я думаю, что если это не поддерживаемый вариант использования, трудно убедиться, что узлы не взаимодействуют с каждым другой, когда один из узлов не синхронизирован.
Надеюсь, проблема ясна, в противном случае я также могу подготовить и предоставить тест для нее.
Обновление:
По запросу я создал форк репозитория Corda Solutions и добавил тест, который демонстрирует ошибку: https://github.com/marioschlipf/corda-solutions/commit/fe1ab5917c971fcf9732bf8af7d0f2c1800b5e37