# ИТХ — ежедневное закрытие блокчейна SHiNE (кратко, для людей) Статус: дизайн согласован, код не написан. Подробная спецификация для реализации: [Спецификация_ИТХ_v1.md](./Спецификация_ИТХ_v1.md). ## Что это Раз в сутки один из серверов SHiNE («дежурный») делает **закрытие дня**: 1. Строит меркл-дерево по вершинам всех пользовательских цепочек — его корень называется **ИТХ** (итоговый хэш дня). 2. Собирает **бандл** — все новые блоки, появившиеся с прошлого закрытия, с хэшами и подписями пользователей. 3. Заливает всё это одним файлом (**чекпоинт**) в Arweave. Каждый чекпоинт ссылается на предыдущий — получается цепочка чекпоинтов. 4. Пишет в свой Solana PDA: «крайний чекпоинт — вот такой хэш, лежит по такому Arweave-адресу». 5. Публикует пост о закрытии в своём канале закрытий прямо в Сиянии. Остальные серверы проверяют чекпоинт, и если всё сходится: - обновляют слот в **своём** PDA на этот же чекпоинт («согласен»); - ставят **лайк** на пост дежурного в канале. Несогласие = просто ничего не делать (слот остаётся на прошлом чекпоинте). ## Зачем - **Неизменяемость истории.** Прошлые дни зафиксированы в Arweave и Solana — их нельзя переписать даже сговором всех живых серверов. - **Независимая проверяемость.** Любой желающий может скачать цепочку чекпоинтов из Arweave и проверить всю историю, не доверяя ни одному живому серверу. - **Резерв последней надежды.** Даже если все серверы погибнут, история до последнего чекпоинта не потеряна. В повседневной работе серверы синхронизируются друг с другом напрямую — Arweave почти не читается, это гарантия, а не рабочая лошадка. ## Кто дежурит График ведёт DAO в специальном PDA: упорядоченный список логинов серверов и дата начала эпохи. Дежурный дня = `dayIndex % количество_серверов`. Обновлять список может только DAO. ## Расписание суток (UTC) | Время | Что происходит | | --- | --- | | День D, 00:00–24:00 | Обычная работа, блоки копятся. | | D+1, 00:00–06:00 | Дежурный закрывает день D: Arweave → PDA → пост в канал. | | D+1, до 24:00 | Остальные проверяют и подтверждают (PDA + лайк). | Если дежурный не закрыл (или закрыл неверно) — день просто пропускается: никто ничего не подтверждает, а следующий дежурный включает в свой бандл блоки за все пропущенные дни и ссылается на последний признанный чекпоинт. ## Как понять, какой чекпоинт «настоящий» **Актуальный чекпоинт = последний, на который указывают слоты больше половины серверов из графика.** Кворума on-chain нет — каждый сервер публикует только своё мнение, а наблюдатель считает голоса сам. Сервер, который систематически ошибается, DAO просто исключает из списка. Правило работает относительно списка: по умолчанию считают по DAO-списку, но любой наблюдатель вправе считать голоса по **собственному списку доверенных серверов**. Коротко: запись — по общему списку, чтение — по любому. ## Форки и параллельные группы - Пользователь раздвоил свою цепочку до чекпоинта — дежурный возьмёт самую длинную ветку, проигравшая отбросится; пользователь не наказывается. - Ветка против уже зачекпоинченного — побеждает чекпоинт, ветка отбрасывается. - Умудрился дописать противоречащие ветки в архивы **двух разных групп закрытий** — цепочка замораживается навсегда (два неизменных архива слить нельзя), дальше пользователь начинает новую цепочку `login-002`. - Любая другая группа серверов может вести свою параллельную цепочку чекпоинтов над теми же данными — это разрешено by design: подделать блоки они не могут, а независимых «нотариусов» у истории становится больше. ## Восстановление сервера с нуля 1. Прочитать DAO PDA → список серверов графика. 2. Прочитать их PDA-слоты → последний признанный чекпоинт (>половины голосов). 3. Скачать из Arweave цепочку чекпоинтов от генезиса и раскатать бандлы. 4. «Хвост» после последнего чекпоинта добрать живой синхронизацией с серверами. ## Кто платит Каждый сервер платит сам: за свои Arweave-загрузки в свои дежурные дни и за свои Solana-транзакции. ## Связанные документы - [Спецификация_ИТХ_v1.md](./Спецификация_ИТХ_v1.md) — точный формат и алгоритмы (для реализации). - `docs/Blockchain/` — формат блоков и цепочек SHiNE. - `docs/Blockchain/sync-between-servers.md` — живая межсерверная синхронизация. - `docs/Solana_Architecture/README.md` — устройство Solana-части. - `shine-solana/shine/doc/formats/shine-user-pda-format-v.1.0.md` — формат `user_pda`.