1) Общий формат записи блока (BchBlockEntry) Блок хранится как FULL = RAW + TAIL, где RAW участвует в хэшировании/подписи, а TAIL хранит подпись и итоговый хэш. RAW (BigEndian) recordSize [4] int32 — размер RAW в байтах (включая поля RAW-заголовка и bodyBytes), без signature64 и hash32. recordNumber [4] int32 — глобальный порядковый номер блока (сквозной по всему блокчейну). timestamp [8] int64 — Unix seconds (время создания блока). lineIndex [2] int16 — номер линии (канонические линии см. LineIndex). lineNumber [4] int32 — порядковый номер внутри выбранной линии. bodyBytes [N] bytes — тело блока, начинается с [type][version] (и дальше подформат конкретного body). TAIL (не входит в recordSize) signature64 [64] bytes — подпись Ed25519 над hash32. hash32 [32] bytes — SHA-256 от preimage (см. ниже). 2) Как считается хэш и что подписываем (BchCryptoVerifier) preimage = "SHiNE" (ASCII) loginLen[1] + loginBytes[loginLen] (UTF-8, 1..255) prevGlobalHash32[32] prevLineHash32[32] rawBytes[recordSize] hash32 = SHA-256(preimage) Далее верификация: hash32 должен совпасть с hash32, записанным в блоке. signature64 проверяется как Ed25519 подпись над hash32 публичным ключом пользователя. 3) Типы body и разновидности (по 1 предложению на тип) HeaderBody (type=0) — генезис/идентификация блокчейна: фиксирует владельца (login) и тег формата. TextBody (type=1) — текстовое сообщение: либо новое, либо ответ (reply), либо репост (repost) со ссылкой на целевой блок. ReactionBody (type=2) — реакция на конкретный блок (в MVP — лайк) по ссылке на блок. ConnectionBody (type=3) — событие связи с другим пользователем (friend/contact/follow) или отмена этой связи. UserParamBody (type=4) — изменение/заявление одного параметра профиля в формате key/value. 4) Общий формат bodyBytes (для всех body) type [2] int16 — код типа тела (0..4). version [2] int16 — версия формата конкретного типа (сейчас везде 1). subType [2] uint16 — подтип внутри типа (для Header всегда 0; для Text — NEW/REPLY/REPOST; для Reaction — LIKE; для Connection — set/unset + вид; для UserParam — TEXT_TEXT). payload [N] bytes — поля конкретного body (строго по формату; “мусор” в конце запрещён). 5) Формат каждого типа body (по 1 строке на поле) 5.1 HeaderBody (type=0, ver=1, lineIndex=0) type [2] — 0. version [2] — 1. subType [2] — 0 (compat). tag [5] — ASCII "SHiNE". loginLen [1] — длина login в UTF-8 (1..255). login [N] — login UTF-8 (^[A-Za-z0-9_]+$). 5.2 TextBody (type=1, ver=1, lineIndex=1) type [2] — 1. version [2] — 1. subType [2] — 1=NEW, 2=REPLY, 3=REPOST. textLenBytes [2] — длина текста в байтах UTF-8 (1..65535). text [N] — текст UTF-8 (валидный, не blank). toBlockchainNameLen [1] — (только для REPLY/REPOST) длина имени блокчейна цели (1..255). toBlockchainName [N] — (только для REPLY/REPOST) UTF-8 имя блокчейна цели. toBlockGlobalNumber [4] — (только для REPLY/REPOST) globalNumber целевого блока. toBlockHash32 [32] — (только для REPLY/REPOST) raw-хэш целевого блока. 5.3 ReactionBody (type=2, ver=1, lineIndex=2) type [2] — 2. version [2] — 1. subType [2] — 1=LIKE (зарезервировано под будущие реакции). toBlockchainNameLen [1] — длина имени блокчейна цели (1..255). toBlockchainName [N] — UTF-8 имя блокчейна цели. toBlockGlobalNumber [4] — globalNumber целевого блока. toBlockHash32 [32] — raw-хэш целевого блока. 5.4 ConnectionBody (type=3, ver=1, lineIndex=3) type [2] — 3. version [2] — 1. subType [2] — 10/20/30 (FRIEND/CONTACT/FOLLOW) или 11/21/31 (UNFRIEND/UNCONTACT/UNFOLLOW). toLoginLen [1] — длина login цели (1..255). toLogin [N] — UTF-8 login цели (^[A-Za-z0-9_]+$). toBlockchainNameLen [1] — длина имени блокчейна цели (1..255). toBlockchainName [N] — UTF-8 имя блокчейна цели (снимок/якорь). toBlockGlobalNumber [4] — lastKnown globalNumber у цели (снимок/якорь). toBlockHash32 [32] — lastKnown hash у цели (снимок/якорь). 5.5 UserParamBody (type=4, ver=1, lineIndex=4) type [2] — 4. version [2] — 1. subType [2] — 1=TEXT_TEXT. keyLenBytes [2] — длина ключа в байтах UTF-8 (1..65535). keyUtf8 [N] — ключ параметра UTF-8 (валидный, не blank). valueLenBytes [2] — длина значения в байтах UTF-8 (1..65535). valueUtf8 [M] — значение UTF-8 (валидное, не blank). 6) Канонические линии (LineIndex) 0 HEADER — генезис/идентификация. 1 TEXT — сообщения. 2 REACTION — реакции. 3 CONNECTION — связи. 4 USER_PARAM — параметры профиля.