5.9 KiB
нет это неправильно откатись к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 (см. ниже).
- Как считается хэш и что подписываем (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 публичным ключом пользователя.
- Типы 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.
- Общий формат 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 (строго по формату; “мусор” в конце запрещён).
- Формат каждого типа 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).
- Канонические линии (LineIndex)
0 HEADER — генезис/идентификация.
1 TEXT — сообщения.
2 REACTION — реакции.
3 CONNECTION — связи.
4 USER_PARAM — параметры профиля.