7.0 KiB
Синхронизация блоков и DM между серверами SHiNE
Документ описывает архитектуру и протокол синхронизации данных между партнёрскими серверами SHiNE.
1. Зачем нужна синхронизация
Пользователи SHiNE могут быть «приписаны» к разным серверам. Когда пользователь A (на сервере X) пишет пользователю B (на сервере Y):
- Сервер X принимает сообщение;
- Сервер X должен переслать DM-блок серверу Y;
- Сервер Y сохраняет блок и доставляет в активные сессии пользователя B.
Аналогично, блоки пользовательского блокчейна (записи AddBlock) должны синхронизироваться,
чтобы любой партнёрский сервер мог отдать полную историю пользователя.
2. Список серверов синхронизации (sync_servers)
Каждый сервер регистрирует в своей Solana PDA список sync_servers —
логины SHiNE-аккаунтов партнёрских серверов, с которыми он синхронизируется.
- Список хранится в блоке
ServerProfileBlockвнутриuser_pdaсервера. - Адрес каждого партнёрского сервера читается из его PDA на Solana.
- Синхронизация двусторонняя: оба сервера должны иметь друг друга в
sync_servers.
3. Что синхронизируется
3.1 Личные сообщения (DM)
- Все DM-блоки форматов типов
1/2(текст) и3/4(read-receipt). - Сервер-отправитель: при получении пары блоков от клиента перенаправляет их серверу получателя.
- Сервер-получатель: сохраняет блоки в
signed_messages_v2, доставляет в активные сессии. - Дедупликация по уникальному
message_key = from|to|timeMs|nonce|type.
3.2 Блоки пользовательского блокчейна
- Все блоки
AddBlockпользователей, зарегистрированных на сервере или синхронизирующихся через него. - Синхронизируются в обе стороны между всеми партнёрами из
sync_servers. - Порядок блоков сохраняется (по глобальному номеру блока и хэшу).
- Дедупликация по глобальному номеру блока и хэшу.
4. Протокол синхронизации (целевой, не реализован)
4.1 Межсерверное соединение
- Серверы устанавливают постоянное WebSocket-соединение друг с другом.
- Адрес партнёра определяется по
server_addressиз его Solana PDA. - Аутентификация: подпись Ed25519 корневым ключом сервера (
root_keyиз PDA). - При разрыве — переподключение с экспоненциальным backoff.
4.2 Доставка новых данных (push)
- При получении нового блока или DM сервер немедленно пушит его всем подключённым партнёрам.
- Партнёр подтверждает приём (ACK). Без ACK — повтор с backoff.
4.3 Начальная синхронизация (backfill)
- При первом подключении к партнёру серверы обмениваются «курсорами» состояния: последний глобальный номер блока, последний известный DM-ключ.
- Сервер с более полной историей досылает недостающее партнёру.
4.4 Разрешение конфликтов
- Блоки пользовательского блокчейна: порядок определяется глобальным номером блока.
Конфликтующие ветки (fork) разрешаются по правилам
AddBlock(см.Dev_Docs/Blockchain/README.md). - DM: конфликтов нет,
message_keyуникален.
5. Маршрутизация DM между серверами
При отправке DM от пользователя A к пользователю B:
- Клиент A отправляет пару блоков на свой сервер X.
- Сервер X определяет, на каком сервере зарегистрирован пользователь B.
- Сначала проверяет локально (если B зарегистрирован на X).
- Иначе читает PDA пользователя B из Solana и смотрит
access_servers. - Выбирает первый доступный сервер из
access_serversи перенаправляет туда DM.
- Сервер Y (из
access_serversB) сохраняет и доставляет блоки.
Кэш адресов серверов: обновляется раз в сессию (при ошибке соединения).
6. Безопасность
- Все блоки подписаны ключами пользователя на клиенте — сервер не может подделать содержимое.
- Серверы не расшифровывают DM-контент (шифрование — задача следующего этапа).
- При синхронизации каждый блок проходит валидацию подписи на принимающем сервере.
7. Статус реализации
| Компонент | Статус |
|---|---|
| Регистрация серверной PDA в Solana | ✅ Реализовано |
Чтение sync_servers из PDA |
Нужна реализация |
| Межсерверный WebSocket-канал | Нужна реализация |
| Push новых DM партнёрам | Нужна реализация |
| Push блоков блокчейна партнёрам | Нужна реализация |
| Backfill при первом подключении | Нужна реализация |
| Маршрутизация DM через access_servers | Нужна реализация (заглушка) |
Текущая версия сервера работает без межсерверной синхронизации. Синхронизация — задача следующего этапа разработки.