SHA256
55 lines
3.2 KiB
Markdown
55 lines
3.2 KiB
Markdown
# TECH блоки (`type=0`, `version=1`)
|
||
|
||
TECH-тип покрывает системные записи цепочки.
|
||
|
||
## Подтипы
|
||
|
||
1. `subType=0` — `HEADER_COMPAT`
|
||
- стартовый блок цепочки;
|
||
- payload: tag `SHiNE` + login владельца.
|
||
|
||
2. `subType=1` — `TECH_CREATE_CHANNEL`
|
||
- создание нового канала;
|
||
- хранит line-поля + `channelName` + `channelDescription` + `channelType` + `channelTypeVersion`.
|
||
|
||
3. `subType=2` — `TECH_FORK`
|
||
- первый новый блок после точной перепубликации выбранного префикса предыдущего fork новым blockchain key;
|
||
- связывает новую активную цепочку с предыдущей и фиксирует точку rollback/продолжения.
|
||
|
||
### `TECH_FORK` body (`version=1`)
|
||
|
||
Big-endian:
|
||
|
||
- `parentBlockchainKey[32]` — public key предыдущего fork;
|
||
- `forkPointBlockNumber[4]` — последний блок старой цепочки, сохранённый в новом fork;
|
||
- `forkPointBlockHash32[32]`;
|
||
- `forkPointTimestampMs[8]`;
|
||
- `parentTipBlockNumber[4]` — tip старой цепочки на момент начала ротации;
|
||
- `parentTipBlockHash32[32]`;
|
||
- `parentTipTimestampMs[8]`;
|
||
- `discardedBlocksCount[4]` — `parentTipBlockNumber - forkPointBlockNumber`;
|
||
- `reasonCode[1]`;
|
||
- `commentUtf8Length[2]`;
|
||
- `comment[N]` — произвольный комментарий пользователя, максимум 1024 UTF-8 байт.
|
||
|
||
`reasonCode`:
|
||
|
||
- `1` — `ROUTINE_ROTATION`: обычная смена пароля/ключей, компрометация не предполагается;
|
||
- `2` — `POSSIBLE_COMPROMISE`: возможная компрометация, неизвестные записи не подтверждены;
|
||
- `3` — `CONFIRMED_COMPROMISE_ROLLBACK`: обнаружены нежелательные/чужие записи и выполнен rollback;
|
||
- `4` — `RECOVERY`: восстановление доступа recovery-механизмом.
|
||
|
||
Правила:
|
||
|
||
- блоки `0..forkPointBlockNumber` в новом fork должны быть точными Frame-копиями выбранного префикса предыдущей цепочки;
|
||
- `TECH_FORK` идёт сразу после этого префикса и является первым действительно новым Frame нового fork;
|
||
- если история сохранена полностью, `forkPointBlockNumber == parentTipBlockNumber` и `discardedBlocksCount == 0`;
|
||
- если сохраняется только genesis, новый fork содержит прежний `block 0`, а `block 1` является `TECH_FORK`;
|
||
- новый blockchain key в body не дублируется: он определяется owner/signature нового ANS-104 DataItem.
|
||
|
||
## Назначение
|
||
|
||
- инициализация блокчейна;
|
||
- управление набором каналов пользователя;
|
||
- фиксация происхождения нового fork и причины ротации/rollback.
|