SHA256
- Раздел 6: правило признания — правило чтения (дефолт rota PDA, наблюдатель может считать по своему списку доверия); параллельные группы закрытий разрешены by design. - Новый раздел 10 «Форки пользовательских цепочек»: fork-choice дежурного (длиннейшая ветка + tie-break), зачекпоинченное побеждает, заморозка chain_frozen только при противоречии архивов двух групп, рестарт с login-002, байт-в-байт повтор для клиентов. - Шаг 9.9 проверки: конфликт -> принять версию чекпоинта (один пользователь больше не срывает закрытие дня). - TODO: хэш-выбор дежурного, вход по депозиту, механизм цепочки -002. - CHANGELOG блокчейна дополнен; формат блоков и AddBlock не менялись. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
98 lines
7.3 KiB
Markdown
98 lines
7.3 KiB
Markdown
# ИТХ — ежедневное закрытие блокчейна 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`.
|