Files
SHiNE-server/docs/Blockchain/02_Blockchain_Kinds_and_Lines.md
T

89 lines
4.4 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. Именованный блокчейн
Базовый идентификатор физической цепочки пользователя:
- `blockchainName = <login>-<NNN>`;
- `NNN` — номер fork `001..999`;
- пример: `alice-001`.
## 2. Логические линии внутри пользовательской цепочки
Глобально все блоки пользователя идут одной последовательностью `blockNumber` и `prevHash32`. Дополнительно некоторые типы образуют собственные проверяемые линии.
Актуальные линии:
- `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` хранят:
```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 не хранится. Их префикс:
```text
[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 теги
Фиксированные системные потоки дополнительно индексируются подписанным тегом:
```text
t=prof # USER_PROFILE
t=conn # CONNECTION
t=tech # TECH, включая HEADER / CREATE_CHANNEL / FORK
```
Тег является индексом для выборочной загрузки; криптографическая непрерывность обеспечивается line-полями внутри подписанного Frame/DataItem.