diff --git a/DOC/Формат Блокцейнов.md b/DOC/Формат Блокцейнов.md new file mode 100644 index 0000000..518e3c3 --- /dev/null +++ b/DOC/Формат Блокцейнов.md @@ -0,0 +1,165 @@ +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 — параметры профиля. \ No newline at end of file