Добавить линии связей и параметров пользователя

This commit is contained in:
AidarKC
2026-10-02 00:33:13 +03:00
parent 8d22602761
commit e101e5c5f4
33 changed files with 1293 additions and 568 deletions
@@ -2,47 +2,87 @@
## 1. Именованный блокчейн
Базовый идентификатор цепочки пользователя:
Базовый идентификатор физической цепочки пользователя:
- `blockchainName = <login>-<NNN>`
- `NNN` — реальный номер fork строго `001..999`; `000` и `1000+` недопустимы;
- пример: `alice-001`
- `blockchainName = <login>-<NNN>`;
- `NNN` — номер fork `001..999`;
- пример: `alice-001`.
Обычно это одна основная цепочка пользователя.
## 2. Логические линии внутри пользовательской цепочки
## 2. Логические линии внутри одной цепочки
Глобально все блоки пользователя идут одной последовательностью `blockNumber` и `prevHash32`. Дополнительно некоторые типы образуют собственные проверяемые линии.
Физически цепочка одна, но внутри есть независимые логические последовательности (линии), которые ведутся через поля:
Актуальные линии:
- `lineCode`
- `prevLineNumber`
- `prevLineHash32`
- `thisLineNumber`
- `TECH` — системная история: `TECH_CREATE_CHANNEL`, `TECH_FORK`; root — `HEADER`;
- `TEXT` — отдельная линия каждого канала; root — `HEADER` для канала `0` или `TECH_CREATE_CHANNEL` для пользовательского канала;
- `CONNECTION` — единая история изменений связей пользователя; root — `HEADER`;
- `USER_PROFILE` — единая история изменений профиля пользователя; root — `HEADER`.
Линии используются для:
- TECH-событий;
- каналов с текстовыми постами;
- связей и подписок;
- пользовательских параметров.
`STATUS_ACTION` в line-модель сейчас не входит.
## 3. Правила line-полей (фактическая серверная валидация)
## 3. Два формата line-prefix
Line-поля: `lineCode`, `prevLineNumber`, `prevLineHash32`, `thisLineNumber`.
### 3.1. Линии с явным `lineCode`
- Line-поля разрешены только для `msg_type`: `0`, `1`, `3`, `4`.
- Если передано хотя бы одно line-поле, должны быть переданы все 4.
- `prevLineNumber/prevLineHash32` должны указывать на существующий блок этой же цепочки.
- Для первого шага после root (`prevLineNumber == lineCode`):
- `TEXT (msg_type=1)`: `thisLineNumber = 0`;
- `TECH/CONNECTION/USER_PARAM (0/3/4)`: `thisLineNumber = 1`.
- Для обычного шага:
- `TEXT`: `thisLineNumber` допускает `same` или `+1` от предыдущего блока линии;
- `TECH/CONNECTION/USER_PARAM`: строго `+1`.
`TECH` и `TEXT` хранят:
## 4. Root-идея для каналов и подписок
```text
[4] lineCode
[4] prevLineNumber
[32] prevLineHash32
[4] thisLineNumber
```
Для ссылок вида follow/friend/contact принято ссылаться на корневые блоки:
- `HEADER` для базовой сущности пользователя/канала `0`;
- `CREATE_CHANNEL` для пользовательских каналов.
- для 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.