SHA256
89 lines
4.6 KiB
Markdown
89 lines
4.6 KiB
Markdown
# Виды блокчейнов и логических линий
|
||
|
||
## 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` хранят:
|
||
|
||
```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.
|