Files
SHiNE-server/docs/Blockchain/02_Blockchain_Kinds_and_Lines.md
T
AidarKC de8700f8e0 back32hash 5591: готово к тестам
Вроде как всё готово к тестам.
2026-10-02 01:32:37 +03:00

4.6 KiB
Raw Blame History

Виды блокчейнов и логических линий

1. Именованный блокчейн

Базовый идентификатор физической цепочки пользователя:

  • blockchainName = <login>-<NNN>;
  • NNN — номер fork 001..999;
  • пример: alice-001.

2. Логические линии внутри пользовательской цепочки

Глобально все блоки пользователя идут одной последовательностью blockNumber и prevHash32; каждый Frame также содержит резервный back32Hash32 на блок N-32 (нули для N<32). Дополнительно некоторые типы образуют собственные проверяемые линии. Отдельного back32 внутри линий нет.

Актуальные линии:

  • TECH — системная история: TECH_CREATE_CHANNEL, TECH_FORK; root — HEADER;
  • TEXT — отдельная линия каждого канала; root — HEADER для канала 0 или TECH_CREATE_CHANNEL для пользовательского канала;
  • CONNECTION — единая история изменений связей пользователя; root — HEADER;
  • USER_PROFILE — единая история изменений профиля пользователя; root — HEADER.

STATUS_ACTION в line-модель сейчас не входит.

3. Два формата line-prefix

3.1. Линии с явным lineCode

TECH и TEXT хранят:

[4]  lineCode
[4]  prevLineNumber
[32] prevLineHash32
[4]  thisLineNumber
  • для TECH lineCode=0;
  • для канала lineCode = global blockNumber его root-блока (HEADER #0 либо TECH_CREATE_CHANNEL).

3.2. Фиксированные линии

CONNECTION и USER_PROFILE имеют по одной линии на пользователя, поэтому lineCode в body не хранится. Их префикс:

[4]  prevLineNumber
[32] prevLineHash32
[4]  thisLineNumber

Логический lineCode этих линий всегда 0.

4. Что означают номера

prevLineNumber — глобальный blockNumber предыдущего блока этой линии.

thisLineNumber — локальный порядковый номер внутри линии:

  • первый TEXT-блок канала: 0, далее 1,2,3...;
  • первый TECH после HEADER: 1, далее 2,3,4...;
  • первый CONNECTION: 1, далее 2,3,4...;
  • первый USER_PROFILE: 1, далее 2,3,4....

То есть prevLineNumber и thisLineNumber — принципиально разные числа.

5. Строгая серверная валидация

Для каждого line-блока сервер определяет текущий фактический хвост той же линии и требует:

  1. prevLineNumber равен глобальному номеру текущего хвоста (либо root для первого блока);
  2. prevLineHash32 равен hash этого хвоста/root;
  3. thisLineNumber равен предыдущему sequence +1 (для первого TEXT — 0, для остальных линий — 1);
  4. root существует и имеет правильный тип.

Ссылка просто на любой существующий блок больше не считается допустимой. Это запрещает случайные или намеренные боковые ветки линии.

Для канала в одну линию входят все line-based события этого канала, включая обычные посты, EDIT_POST, REPOST, CHANNEL_META и контентные типы канала. Поэтому редактирование не создаёт отдельную боковую ветку.

6. Индексные ANS-104 теги

Фиксированные системные потоки дополнительно индексируются подписанным тегом:

t=prof  # USER_PROFILE
t=conn  # CONNECTION
t=tech  # TECH, включая HEADER / CREATE_CHANNEL / FORK

Тег является индексом для выборочной загрузки; криптографическая непрерывность обеспечивается line-полями внутри подписанного Frame/DataItem.