# Периодическая межсерверная синхронизация блокчейнов - Краткое описание: - При старте сервер подтягивает `sync_servers` из server PDA и сохраняет адреса партнёров в локальную таблицу. - После успешного локального `AddBlock` работает фоновая one-shot отправка нового блока партнёрам. - Добавлен публичный `GetBlockchainBlock` для чтения одного блока. - Добавлен публичный `GetSyncUserProfile` для подготовки отсутствующей локальной цепочки без прямого Solana RPC. - Добавлен плановый sync блокчейнов при старте сервера и затем каждые `12` часов. - Синхронизация пока умеет только докачивать отсутствующий хвост цепочки. - Добавлена настройка `sync.importUserProfileFromPartner.enabled`, которая включает создание локального `solana_users + blockchain_state` по ответу сервера-партнёра вместо Solana PDA. - Случай рассинхрона цепочек пока не исправляется автоматически: он только логируется как не реализованный сценарий. - Что именно проверять: - После старта сервера в логах появляется запуск периодического sync. - Сервер может запросить у партнёра `ListBlockchainHeads`. - Сервер может запросить у партнёра `GetSyncUserProfile`, если включён `sync.importUserProfileFromPartner.enabled=true`. - Сервер может запросить у партнёра `GetBlockchainBlock` и локально применить блок через существующий `AddBlock`. - На чистом тестовом сервере после удаления БД и файлов блокчейнов сервер сам подтягивает блоки при старте. - При включённом режиме обхода Solana сервер восстанавливает локальные цепочки без запросов в Solana RPC. - После первичного старта новые блоки продолжают догоняться без ручного вмешательства. - При рассинхроне цепочек в логах появляется явное сообщение, что reconciliation пока не реализован. - Ожидаемый результат: - Чистый сервер после старта сам восстанавливает локальные цепочки от партнёра синхронизации. - В режиме обхода Solana чистый сервер не упирается в `Solana RPC 429` при создании локальных chain-state для уже существующих на партнёре пользователей. - Периодический sync не мешает обычной работе сервера и не ломает локальный `AddBlock`. - Нереализованный случай рассинхрона не приводит к падению сервера и явно отражается в логах. - Статус: - `pending`