SHiNE-server/DOC/Формат Блокцейнов.md

165 lines
5.9 KiB
Markdown
Raw 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.

нет это неправильно откатись к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 — параметры профиля.