# Общий формат добавляемого блока (Frame v0) Этот файл описывает **единый бинарный формат** блока, который клиент отправляет через `AddBlock` в поле `blockBytesB64`. ## 1. Полная структура блока Блок состоит из двух частей: 1. **PREIMAGE** (подписывается) 2. **TAIL** (маркер подписи + подпись) ### PREIMAGE - `frameCode (uint16)` - `prevHash32 (32 bytes)` - `blockSize (int32)` — размер PREIMAGE - `blockNumber (int32)` - `timestamp (int64)` - `type (uint16)` - `subType (uint16)` - `version (uint16)` - `bodyBytes (N)` ### TAIL - `sigMarker (uint16)` - `signature64 (64 bytes, Ed25519)` ## 2. Что проверяет сервер при AddBlock - `frameCode` должен быть `0x0000`. - `sigMarker` должен быть `0x0100`. - `blockNumber` должен идти строго по порядку (`last + 1`). - `prevHash32` должен совпасть с вершиной цепочки на сервере. - `body` должен пройти `check()` для конкретного типа. - подпись должна валидироваться публичным ключом блокчейна. ## 3. Ограничения - максимальный полный размер блока: до 4 MiB; - timestamp не должен сильно уходить в будущее; - `bodyBytes` парсится по `type/subType/version` из заголовка блока. ## 4. Почему это важно Одинаковый общий формат позволяет: - передавать разные виды записей через один RPC `AddBlock`; - валидировать блоки единообразно; - расширять типы `body`, не ломая каркас блока.