SHA256
Добавить линии связей и параметров пользователя
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user