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

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
+51 -24
View File
@@ -1,41 +1,68 @@
# CONNECTION блоки (`type=3`, `version=1`)
CONNECTION-тип описывает социальные связи и подписки.
CONNECTION описывает историю социальных связей и подписок пользователя.
## Подтипы
• `10/11` — `close_friend / unclose_friend` (близкий друг)
• `20/21` — `contact / uncontact` (контакт)
• `30/31` — `follow / unfollow` (подписан)
• `40/41` — `spouse / unspouse` (супруг/супруга)
• `50/51` — `parent / unparent` (родитель)
• `52/53` — `child / unchild` (ребёнок)
• `54/55` — `sibling / unsibling` (брат/сестра)
• `60/61` — `known_person / unknown_person` (знаю этого человека)
• `70/71` — `shine_confirmed / shine_unconfirmed` (точно уверен, что сияющий)
• `74/75` — `shine_seen / shine_unseen` (мало знаком, но видел сияющим)
• `10/11` — `close_friend / unclose_friend` (близкий друг)
• `14/15` — `friend / unfriend` (друг)
• `20/21` — `contact / uncontact` (контакт)
• `30/31` — `follow / unfollow` (подписка)
• `40/41` — `spouse / unspouse`
• `50/51` — `parent / unparent`
• `52/53` — `child / unchild`
• `54/55` — `sibling / unsibling`
• `70/71` — `shine_confirmed / shine_unconfirmed`
• `74/75` — `shine_seen / shine_unseen`
• `80/81` — `official_account / unofficial_account`
## Общий формат payload
`60/61` — legacy/reserved и новым UI не создаются.
- line-поля (`lineCode`, `prevLineNumber`, `prevLineHash32`, `thisLineNumber`)
- target (`toLogin`, `toForkNumber`, `toBlockGlobalNumber`, `toBlockHash32`)
## Линия связей
## Бинарный target
У пользователя существует ровно одна линия `CONNECTION`. Отдельный `lineCode` в body не хранится: логический код линии всегда `0`.
Первый CONNECTION ссылается на `HEADER #0` и имеет `connectionSequence=1`. Каждый следующий обязан ссылаться на фактический текущий хвост CONNECTION-линии и увеличивать sequence ровно на `1`.
## Body (`version=1`)
Big-endian:
```text
[1] toLoginLen (uint8)
[4] prevConnectionBlockNumber
[32] prevConnectionBlockHash32
[4] connectionSequence
[1] toLoginLen
[N] toLogin UTF-8
[2] toForkNumber (uint16, BigEndian)
[2] toForkNumber
[4] toBlockGlobalNumber
[32] toBlockHash32
```
`toForkNumber` хранит fork, который видел автор связи (`1..999`), но не участвует в identity. Значения `0` и `1000+` недопустимы. Для связи на пользователя используется **реальный HEADER hash**: `toBlockGlobalNumber=0`, `toBlockHash32=SHA-256(Frame HEADER)`. Нулевой hash запрещён.
- `prevConnectionBlockNumber` — глобальный `blockNumber` предыдущего CONNECTION-блока.
- `prevConnectionBlockHash32` — SHA-256 Frame предыдущего CONNECTION-блока.
- `connectionSequence` — порядковый номер изменения связей `1..N`.
## Правила target
Сервер проверяет номер, hash и sequence относительно текущего хвоста CONNECTION-линии. Это позволяет выгрузить только связи пользователя и проверить, что внутри выбранной истории нет пропущенного шага.
- FRIEND/CONTACT обычно указывают на `HEADER` цели (`block 0`).
- FOLLOW указывает на root канала:
- `HEADER` для канала `0`;
- `CREATE_CHANNEL` для пользовательского канала.
- Для остальных типов связи (`SPOUSE/PARENT/CHILD/SIBLING`) используется тот же target-формат.
## Target
`toForkNumber` хранит fork, который видел автор связи (`1..999`), но не входит в логическую identity цели. `0` зарезервирован как unknown/legacy; `1000+` недопустим.
Для связи на пользователя обычно используется его HEADER:
```text
toBlockGlobalNumber=0
toBlockHash32=SHA-256(Frame HEADER)
```
Для FOLLOW на канал target указывает на root канала: HEADER для канала `0` либо `TECH_CREATE_CHANNEL` для пользовательского канала.
## ANS-104 тег
Каждый CONNECTION обязан иметь подписанный тег:
```text
t=conn
```