05 01 25
Добавил текст описание форматов блокчейна
This commit is contained in:
parent
8fd7f4676b
commit
8bcaa192c5
165
DOC/Формат Блокцейнов.md
Normal file
165
DOC/Формат Блокцейнов.md
Normal file
@ -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 — параметры профиля.
|
||||||
Loading…
Reference in New Issue
Block a user