04 12 25 Версия авторификации где сервер выдовал сессион Ид

This commit is contained in:
AidarKC
2025-12-05 17:35:58 +03:00
parent fc748a744c
commit c9bfa2d01a
23 changed files with 197 additions and 38 deletions
@@ -1,20 +1,20 @@
* ============================================================================
* BchBlockEntry — универсальная запись блокчейна SHiNE (.bch)
* ============================================================================
*
*.
* 🧩 Формат файла .bch:
* Каждый блок хранится последовательно, без промежутков.
* Один блок = «заголовок» (RAW) + подпись (64) + хэш (32).
*
*.
* FULL = RAW + signature(64) + hash(32)
*
*.
* ---------------------------------------------------------------------------
* 🔹 Структура RAW-части блока (без подписи и хэша)
* ---------------------------------------------------------------------------
* Размеры и порядок строго фиксированы (BigEndian).
*
*.
* Порядок байтов (сверху вниз, смещения от начала RAW):
*
*.
* ┌────────────────────────────┬────────┬───────────────────────────────┐
* │ Поле │ Размер │ Описание │
* ├────────────────────────────┼────────┼───────────────────────────────┤
@@ -30,22 +30,22 @@
* │ recordTypeVersion │ 2 байта│ версия структуры данного типа │
* │ body │ M байт │ бинарное тело записи │
* └────────────────────────────┴────────┴───────────────────────────────┘
*
*.
* ⇒ RAW_HEADER_SIZE = 4 + 4 + 8 + 2 + 2 = 20 байт.
* ⇒ recordSize = RAW_HEADER_SIZE + body.length
*
*.
* ---------------------------------------------------------------------------
* 🔹 Структура FULL-блока
* ---------------------------------------------------------------------------
*
*.
* ┌────────────────────────────┬─────────┬──────────────────────────────┐
* │ RAW │ M+20 │ тело блока без подписи │
* │ signature64 │ 64 │ подпись Ed25519(preimage) │
* │ hash32 │ 32 │ SHA-256(preimage) │
* └────────────────────────────┴─────────┴──────────────────────────────┘
*
*.
* ⇒ Общая длина FULL = recordSize + 96 байт.
*
*.
* ---------------------------------------------------------------------------
* 🔹 Канонический preimage для подписи/хэша
* ---------------------------------------------------------------------------
@@ -58,9 +58,9 @@
* можно номер блока?
* prevHash32(32B) +
* rawBytes (M+20B)
*
*.
* hash32 = SHA-256(preimage)
* signature64= Ed25519.sign(preimage, privateKey)
*
*.
* Проверка осуществляется через {@link utils.crypto.BchCryptoVerifier}.
@@ -20,7 +20,7 @@ import java.util.Arrays;
* AddBlockHandler — обработчик команды "добавить блок" (ADD_BLOCK)
* ---------------------------------------------------------------
* Принимает бинарное сообщение от клиента и добавляет новый блок в цепочку.
*
*.
* Формат входного сообщения (msg):
* [0..3] — 4 байта: код операции (WireCodes.ADD_BLOCK)
* [4..11] — 8 байт: blockchainId (уникальный идентификатор цепочки)
@@ -33,13 +33,13 @@ import java.util.Arrays;
* ├── M байт body (содержимое блока)
* ├── 64 байта signature (Ed25519)
* └── 32 байта hash (SHA-256)
*
*.
* ---------------------------------------------------------------
* Алгоритм работы:
*
*.
* 1️⃣ Распаковать BchBlockEntry из msg (т.е. выделить тело блока и подписи).
* 2️⃣ Найти описание цепочки (BchInfoEntry) по blockchainId.
*
*.
* ─ Если описания нет (цепочка ещё не существует):
* • принимаем только блок типа 0 (HeaderBody) и номера 0;
* • парсим его, создаём новый BchInfoEntry на основе данных заголовка;
@@ -48,16 +48,16 @@ import java.util.Arrays;
* • сохраняем блок и создаём новый blockchain-файл;
* • добавляем цепочку в менеджер BchInfoManager.
* (💡 временное решение: создание цепочки допустимо только через HeaderBody)
*
*.
* ─ Если цепочка уже существует:
* • проверяем, что номер блока равен (lastBlockNumber + 1);
* • проверяем подпись и хэш;
* • проверяем тело блока (check);
* • добавляем блок в файл цепочки;
* • обновляем состояние BchInfoEntry (номер, хэш, размер).
*
*.
* 3️⃣ Если все проверки пройдены — возвращаем статус OK.
*
*.
* Таким образом, единственное различие между первым блоком и последующими —
* момент инициализации описания цепочки (BchInfoEntry).
* Всё остальное (валидация, подпись, добавление, обновление) выполняется одинаково.
@@ -6,6 +6,7 @@ import org.eclipse.jetty.websocket.api.annotations.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import server.logic.InboundMessageProcessor;
import server.logic.ws_protocol.JSON.ActiveConnectionsRegistry;
import server.logic.ws_protocol.JSON.ConnectionContext;
import server.logic.ws_protocol.JSON.JsonInboundProcessor;
@@ -24,6 +25,8 @@ public class BlockchainWsEndpoint {
@OnWebSocketConnect
public void onConnect(Session session) {
this.session = session;
// Привязываем WebSocket-сессию к ConnectionContext
connectionContext.setWsSession(session);
log.info("WS connected: {}", session.getRemoteAddress());
}
@@ -77,6 +80,8 @@ public class BlockchainWsEndpoint {
@OnWebSocketClose
public void onClose(int statusCode, String reason) {
log.info("WS closed: {} {}", statusCode, reason);
// Удаляем это подключение из реестра активных соединений
ActiveConnectionsRegistry.getInstance().remove(connectionContext);
// На всякий случай очищаем контекст
connectionContext.reset();
}