# Проверка и эксплуатация Archive Publisher ## Перед ночным тестом - [ ] Новый `shine_users` уже развёрнут на том Solana-кластере, который использует сервер. - [ ] Серверный JAR собран из этого пакета. - [ ] БД забэкаплена. - [ ] `archive.publish.enabled=true`. - [ ] `archive.publish.time=00:00`. - [ ] `archive.publish.zoneId` соответствует желаемой локальной полуночи. - [ ] `server.SHiNE.login` соответствует root/client keys. - [ ] Arweave JWK читается пользователем процесса. - [ ] На Arweave wallet достаточно AR. - [ ] `data/archive` доступна на запись. - [ ] В логе есть `Archive publisher включён` и точное время следующего запуска. ## Во время job Нормальная последовательность логов/статусов: ```text SNAPSHOT_CREATED FILE_BUILT ARWEAVE_UPLOADED ARWEAVE_CONFIRMED SOLANA_SUBMITTED SOLANA_FINALIZED CURSORS_COMMITTED ``` После `FILE_BUILT` существует `.tmp.SHiNE-archive`. После полного Arweave upload имя уже содержит настоящий TX ID. ## После успешного первого job Проверить: ```bash find data/archive -maxdepth 1 -type f -name '*.SHiNE-archive' -ls ``` ```sql SELECT big_block_number, status, local_archive_path, arweave_confirmations FROM archive_publish_job ORDER BY id DESC LIMIT 1; ``` ```sql SELECT count(*) AS archived_blockchains FROM archive_chain_cursor; ``` ```sql SELECT login, archive_head_tx_id, archive_head_hash FROM solana_user_pda_current WHERE login=''; ``` ## Проверка второй публикации До следующей полуночи добавить несколько новых SHiNE records только в часть blockchain. После следующего job: - в новый big block должны попасть только изменившиеся blockchain; - одна blockchain в новом big block должна иметь один chunk независимо от числа новых records; - cursor blockchain, которая не изменилась, должен остаться на старом big block/chunk; - backlink изменившегося chunk должен указывать на предыдущий chunk этой же blockchain; - FULL reference table нового big block должна содержать все предыдущие finalized big blocks. ## Crash/restart сценарии ### Restart после FILE_BUILT Должен использоваться тот же frozen job и тот же локальный файл. ### Restart после ARWEAVE_UPLOADED Не должно быть повторной оплаты/upload. Если TX сохранён, но rename не успел произойти, recovery переименует `.tmp` в имя с TX ID. ### Restart после SOLANA_FINALIZED При совпадении PDA head с job сервер должен только commit cursors. ## Обычный сервер без публикации Проверить отдельно: ```properties archive.publish.enabled=false ``` Сервер должен запускаться без Arweave/root/client archive key files и не создавать `archive_publish_job`. ## Проверка trusted importer 1. На принимающем сервере указать только тестовый publisher: ```properties archive.import.allowedPublishers= ``` 2. Перезапустить сервер. 3. Дождаться Solana PDA sync и цикла importer-а. 4. Проверить, что у publisher в `solana_user_pda_current` после успешного цикла `archive_imported=true`, а `archive_last_imported_tx_id=archive_head_tx_id`. 5. Проверить `archive_blockchain_location`. 6. Для blockchain, которой локально не хватало блоков, убедиться, что `blockchain_state.last_block_number` вырос. 7. Для уже существующих блоков importer должен пропускать совпадающий hash, а не создавать дубликат. 8. Временно удалить publisher из whitelist и убедиться, что новые archive heads больше не скачиваются. ### Проверка Viewer Открыть `Настройки → Архив блокчейна`, получить ссылку и проверить: - `tx`, `offset`, `size`, `blockchain` присутствуют; - Viewer собирает несколько chunks по backlink; - неправильный `blockchain` в URL приводит к ошибке проверки; - `channel` открывает нужный канал; - `message` прокручивает к нужному block number.