# Черновик `TEXT_CHANNEL_META` для каналов SHiNE ## Статус документа Этот файл является рабочим черновиком и не считается финальной спецификацией. Важно: - это не окончательный формат; - точная версия должна быть зафиксирована отдельно при начале реализации; - до реализации допустимы изменения синтаксиса, ограничений и полей БД; - документ временно лежит в корне проекта как согласованный draft. ## Назначение Нужен специальный скрытый тип текстового сообщения канала, который: - технически хранится в блокчейне как `TEXT`-блок; - не показывается пользователям как обычное сообщение ленты; - может писать только владелец канала; - не редактируется; - задаёт полное текущее состояние метаданных канала. Через этот блок должны обновляться: - человекочитаемое заглавие канала; - аватар канала; - описание канала. ## Место в формате блокчейна - `msg_type = 1` - `subType = 70` - имя подтипа: `TEXT_CHANNEL_META` Этот подтип относится к текстовым блокам, но трактуется как скрытое техническое сообщение канала. ## Общая модель применения `TEXT_CHANNEL_META`: - пишется в линию конкретного канала; - задаёт полный снимок метаданных; - при чтении канала сервер берёт последний валидный `TEXT_CHANNEL_META` в линии; - более старые `TEXT_CHANNEL_META` остаются в истории блокчейна, но не участвуют в вычислении текущего состояния; - если meta-блок не найден, используются базовые данные канала без override-полей. ## Общий формат текста Внутри `TEXT_CHANNEL_META` текст строится так: 1. в начале идут технические теги ``; 2. после тегов идёт обычный UTF-8 текст; 3. этот хвостовой текст считается описанием канала. Пример: ```text Тут описание канала. ``` ## Поддерживаемые теги ### 1. Тег заглавия Формат: ```text ``` Смысл: - задаёт красивое отображаемое имя канала; - хранится как обычный UTF-8 текст; - это не технический slug и не системное имя. ### 2. Тег аватара Формат: ```text ``` Смысл: - задаёт аватар канала; - `ar` хранит только `txId`, без полного URL; - конкретный gateway/URL уже выбирает клиент или сервер. ## Правила порядка - теги должны идти только в начале текста; - после начала обычного описания новые теги больше не допускаются; - рекомендуемый порядок: 1. `title` 2. `avatar` 3. текст описания - каждый тег допустим не более одного раза. ## Правила отсутствующих полей - если `title` отсутствует, используется обычное техническое имя канала; - если `avatar` отсутствует, аватар у канала отсутствует; - если текста после тегов нет, описание считается пустым; - если тегов нет вообще, но текст есть, это означает пустые `title` и `avatar`, а текст используется как описание. ## Полный снимок состояния Каждый новый `TEXT_CHANNEL_META` задаёт полное состояние канала целиком. Это значит: - новый блок не дозаполняет старые поля; - новый блок не наследует значения из прошлого meta-блока; - если в новом блоке нет `title`, то красивое имя сбрасывается к обычному имени канала; - если в новом блоке нет `avatar`, аватар сбрасывается; - если в новом блоке нет текста описания, описание становится пустым. ## Ограничения для тега `title` `title` хранится как UTF-8 строка, но для упрощения формата запрещаются следующие символы: - `<` - `>` - `;` - табуляция - перевод строки - `\0` Дополнительно: - максимальная длина `title` — `50` символов; - допускаются обычные Unicode-символы, включая кириллицу, латиницу, эмодзи и декоративные символы, если они не нарушают запреты выше. ## Ограничения для описания - описание хранится как обычный UTF-8 текст; - максимальная длина — `250` символов. Если описание длиннее лимита, meta-блок должен считаться невалидным. ## Ограничения для тега `avatar` Обязательные поля тега: - `v` - `size` - `sha256` - `ar` Правила: - `size` — размер файла в байтах; - `sha256` — SHA-256 файла в hex; - `sha256` должен иметь длину ровно `64` hex-символа; - `ar` — только `txId` Arweave; - длина `ar` должна соответствовать длине идентификатора Arweave-транзакции; - имя файла в meta-теге аватара не хранится. ## Валидация блока Блок `TEXT_CHANNEL_META` считается валидным только если одновременно соблюдены все условия: - теги находятся строго в начале текста; - каждый тип тега встречается не более одного раза; - `title` удовлетворяет ограничениям; - `avatar`-тег имеет все обязательные поля и корректные значения; - длина описания не превышает лимит. Если блок невалиден: - весь meta-блок не применяется целиком; - сервер не должен частично брать из него только отдельные поля. ## Что именно хранится в текущем состоянии канала Текущее вычисленное состояние канала должно включать: - техническое имя канала; - красивое отображаемое имя; - описание; - `ava_ar`; - `ava_sha256`; - `ava_size`; - время последнего meta-обновления. ## База данных Базовую таблицу каналов предлагается не менять концептуально, а расширить существующую модель хранения каналов. Текущая основа уже есть в таблице: - `channel_names_state` В неё предлагается добавить поля: - `ava_ar` - `ava_sha256` - `ava_size` - `meta_updated_at_ms` При этом: - техническое имя канала продолжает храниться отдельно; - красивое имя хранится в `display_name`; - описание хранится в `channel_description`. ## Поведение API и чтения каналов Обычным пользователям `TEXT_CHANNEL_META` не должен приходить как обычное сообщение ленты. Это означает: - в `GetChannelMessages` такие блоки не показываются как сообщения; - в обычных списках каналов клиент получает уже вычисленное текущее состояние канала; - в debug/raw-чтении сам блок может оставаться доступным как часть блокчейна. ## UI-заметки ### 1. В обычной ленте `TEXT_CHANNEL_META` не показывается как обычное текстовое сообщение. ### 2. Системная карточка UI может показывать специальную системную карточку: - для текущего состояния канала; - для стартового состояния при создании канала. ### 3. Что показывать по нажатию По нажатию на системную карточку нужно показывать полную информацию: - дата и время; - заглавие; - аватар; - описание. ### 4. История UI На первом этапе UI показывает только текущую системную карточку состояния. Полная история всех прошлых meta-обновлений в UI на этом этапе не требуется. ## Поведение при создании канала Для UI полезно также иметь отдельный визуальный системный блок в начале канала: - «канал создан»; - по нажатию можно показать стартовые данные канала; - если на момент создания уже есть заглавие/ава/описание, UI показывает именно их. Это UI-заметка и не требует отдельного нового блокчейн-формата поверх `TEXT_CHANNEL_META`. ## Краткое резюме согласованной схемы - `msg_type=1` - `subType=70` - имя: `TEXT_CHANNEL_META` - это скрытый технический текстовый блок канала - порядок: теги в начале, потом описание - теги: - `` - `` - `title`: - UTF-8 - максимум `50` символов - нельзя `<`, `>`, `;`, таб, перевод строки, `\0` - описание: - UTF-8 - максимум `250` символов - `avatar`: - `ar` только `txId` - хранится без имени файла - новый meta-блок задаёт полный снимок состояния - сервер применяет только последний валидный meta-блок - невалидный meta-блок не применяется целиком - БД расширяется в той же модели каналов - в UI обычным сообщением блок не показывается ## Что ещё потребуется зафиксировать позже При переводе черновика в официальную спецификацию нужно будет дополнительно утвердить: - точный номер версии формата; - точный способ подсчёта длины `title` и описания: - по Unicode code points; - по Java `String.length()`; - или по UTF-8 байтам; - точную проверку длины `ar`; - список API-ответов, куда должны быть добавлены новые поля; - правила миграции старых каналов без meta-блоков.