SHiNE-server/DOC/Описание протокола.md
AidarKC 1ea5390771 08 01 25
Переименовал везде loginKey в solanaKey
2026-01-08 14:44:47 +03:00

286 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

JSON WebSocket протокол сервера: список существующих запросов (op)
Общий формат любого запроса (client → server):
op - имя операции (строка)
requestId - идентификатор запроса для связывания с ответом (строка)
payload - объект с параметрами конкретной операции (object)
Общий формат любого ответа (server → client):
op - имя операции (строка, совпадает с запросом)
requestId - идентификатор запроса (строка, совпадает с запросом)
status - статус результата (200 = успех, другое = ошибка)
payload - объект с полями ответа (object; при ошибке содержит code/message)
Группа: Авторизация и сессии
Эта группа управляет входом пользователя, созданием/обновлением сессий и безопасным завершением активных подключений.
----- AuthChallenge
Одноразовый шаг 1: по логину выдаёт nonce (authNonce), который затем подписывается на шаге 2.
Запрос:
op - "AuthChallenge"
requestId - id запроса
login - логин пользователя, для которого начинается авторизация
Ответ (успех):
op - "AuthChallenge"
requestId - id запроса
status - 200 если успех
authNonce - одноразовый nonce, Base64Url(32 bytes) без padding
Ответ (ошибка):
op - "AuthChallenge"
requestId - id запроса
status - код ошибки
code - строковый код ошибки
message - человекочитаемое описание ошибки
----- CreateAuthSession
Шаг 2: проверяет подпись владения ключом, создаёт новую active_session и возвращает sessionId/sessionPwd.
Запрос:
op - "CreateAuthSession"
requestId - id запроса
storagePwd - ключ/пароль хранилища клиента, base64(32 bytes)
timeMs - время на клиенте в мс (для защиты от повторов и проверки рассинхрона)
signatureB64 - подпись Ed25519 над строкой "AUTHORIFICATED:" + timeMs + authNonce (base64)
clientInfo - короткая строка о клиенте/устройстве (до 50 символов), опционально
Ответ (успех):
op - "CreateAuthSession"
requestId - id запроса
status - 200 если успех
sessionId - идентификатор сессии, Base64Url(32 bytes)
sessionPwd - секрет сессии, Base64Url(32 bytes)
Ответ (ошибка):
op - "CreateAuthSession"
requestId - id запроса
status - код ошибки
code - строковый код ошибки
message - человекочитаемое описание ошибки
----- RefreshSession
Повторный вход без подписи: проверяет sessionId+sessionPwd, обновляет метаданные сессии и возвращает storagePwd.
Запрос:
op - "RefreshSession"
requestId - id запроса
sessionId - идентификатор ранее выданной сессии (base64/url-safe строка)
sessionPwd - секрет ранее выданной сессии (base64/url-safe строка)
clientInfo - короткая строка о клиенте/устройстве (до 50 символов), опционально
Ответ (успех):
op - "RefreshSession"
requestId - id запроса
status - 200 если успех
storagePwd - пароль хранилища, сохранённый в сессии (base64(32 bytes))
Ответ (ошибка):
op - "RefreshSession"
requestId - id запроса
status - код ошибки
code - строковый код ошибки
message - человекочитаемое описание ошибки
----- ListSessions
Возвращает список всех активных сессий текущего пользователя (для управления устройствами/входами).
Запрос:
op - "ListSessions"
requestId - id запроса
timeMs - время на клиенте в мс (нужно только если статус AUTH_IN_PROGRESS)
signatureB64 - подпись Ed25519 над строкой "AUTHORIFICATED:" + timeMs + authNonce (нужно только если статус AUTH_IN_PROGRESS)
Ответ (успех):
op - "ListSessions"
requestId - id запроса
status - 200 если успех
sessions - массив активных сессий пользователя
Поля элемента sessions[i]:
sessionId - идентификатор сессии, Base64Url(32 bytes)
clientInfoFromClient - что прислал клиент в clientInfo
clientInfoFromRequest - что собрал сервер из окружения (UA/платформа и т.п.)
geo - строка "Country, City" или "unknown"
lastAuthirificatedAtMs - время последней успешной авторизации/refresh (мс)
Ответ (ошибка):
op - "ListSessions"
requestId - id запроса
status - код ошибки
code - строковый код ошибки
message - человекочитаемое описание ошибки
----- CloseActiveSession
Закрывает одну активную сессию пользователя (указанную или текущую), при необходимости подтверждая владение ключом подписью.
Запрос:
op - "CloseActiveSession"
requestId - id запроса
sessionId - идентификатор сессии для закрытия (если пусто, закрывается текущая)
timeMs - время на клиенте в мс (нужно только если статус AUTH_IN_PROGRESS)
signatureB64 - подпись Ed25519 над строкой "AUTHORIFICATED:" + timeMs + authNonce (нужно только если статус AUTH_IN_PROGRESS)
Ответ (успех):
op - "CloseActiveSession"
requestId - id запроса
status - 200 если успех
Ответ (ошибка):
op - "CloseActiveSession"
requestId - id запроса
status - код ошибки
code - строковый код ошибки
message - человекочитаемое описание ошибки
Группа: Блокчейн (загрузка блоков)
Эта группа отвечает за приём и валидацию блоков (цепочка, линии, подпись/хэш) и атомарную запись в БД+файл.
----- AddBlock
Добавляет следующий блок в конкретный blockchainName, строго проверяя номера, prev-хэши, линии, подпись и лимит размера.
Запрос:
op - "AddBlock"
requestId - id запроса
blockchainName - имя цепочки (по нему вычисляется login)
globalNumber - глобальный номер добавляемого блока (должен быть serverLastGlobalNumber+1)
prevGlobalHash - HEX(64) предыдущего глобального хэша (или "" только там, где это допускается правилами)
blockBytesB64 - полный блок (raw+signature+hash) в Base64
Ответ (успех):
op - "AddBlock"
requestId - id запроса
status - 200 если успех
reasonCode - null при успехе
serverLastGlobalNumber - последний глобальный номер, который сервер считает актуальным после обработки
serverLastGlobalHash - последний глобальный хэш (HEX(64)) после обработки
Ответ (ошибка):
op - "AddBlock"
requestId - id запроса
status - код ошибки (например 400/404/413/500)
reasonCode - строка причины (например bad_block_base64, bad_global_number, limit_exceeded и т.п.)
serverLastGlobalNumber - текущий серверный lastGlobalNumber
serverLastGlobalHash - текущий серверный lastGlobalHash (HEX(64), если известен)
Группа: Параметры пользователя (UserParams)
Эта группа хранит и отдаёт подписанные клиентом параметры (ключ-значение) для синхронизации и состояния.
----- UpsertUserParam
Добавляет или обновляет параметр пользователя, проверяя подпись Ed25519 и применяя запись только если time_ms новее.
Запрос:
op - "UpsertUserParam"
requestId - id запроса
login - логин пользователя
param - имя параметра
time_ms - метка времени значения в мс
value - значение параметра
device_key - публичный ключ устройства, base64(32 bytes)
signature - подпись Ed25519 от строки USER_PARAMETER_PREFIX + login + param + time_ms + value
Ответ (успех):
op - "UpsertUserParam"
requestId - id запроса
status - 200 если успех
Ответ (ошибка):
op - "UpsertUserParam"
requestId - id запроса
status - код ошибки
code - строковый код ошибки
message - человекочитаемое описание ошибки
----- GetUserParam
Возвращает один сохранённый параметр пользователя.
Запрос:
op - "GetUserParam"
requestId - id запроса
login - логин пользователя
param - имя параметра
Ответ (успех):
op - "GetUserParam"
requestId - id запроса
status - 200
login
param
time_ms
value
device_key
signature
Ответ (не найдено):
op - "GetUserParam"
requestId
status - 404
Ответ (ошибка):
op
requestId
status
code
message
----- ListUserParams
Возвращает все сохранённые параметры пользователя.
Запрос:
op - "ListUserParams"
requestId
login
Ответ (успех):
op
requestId
status - 200
login
params - массив параметров
Поля params[i]:
login
param
time_ms
value
device_key
signature
Ответ (ошибка):
op
requestId
status
code
message
Группа: Тестовые/временные операции
Эта группа предназначена для отладки и первичного наполнения БД.
----- AddUser
Тестовая регистрация локального пользователя.
Запрос:
op - "AddUser"
requestId
login
blockchainName
solanaKey
deviceKey
bchLimit
Ответ (успех):
op
requestId
status - 200
Ответ (ошибка):
op
requestId
status
code
message