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

5.9 KiB
Raw Blame History

нет это неправильно откатись к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 (см. ниже).

  1. Как считается хэш и что подписываем (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 публичным ключом пользователя.

  1. Типы 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.

  1. Общий формат 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 (строго по формату; “мусор” в конце запрещён).

  1. Формат каждого типа 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).

  1. Канонические линии (LineIndex)

0 HEADER — генезис/идентификация.

1 TEXT — сообщения.

2 REACTION — реакции.

3 CONNECTION — связи.

4 USER_PARAM — параметры профиля.