13 KiB
Черновик TEXT_CHANNEL_META для каналов SHiNE
Статус документа
Этот файл является рабочим черновиком и не считается финальной спецификацией.
Важно:
- это не окончательный формат;
- точная версия должна быть зафиксирована отдельно при начале реализации;
- до реализации допустимы изменения синтаксиса, ограничений и полей БД;
- документ временно лежит в корне проекта как согласованный draft.
Назначение
Нужен специальный скрытый тип текстового сообщения канала, который:
- технически хранится в блокчейне как
TEXT-блок; - не показывается пользователям как обычное сообщение ленты;
- может писать только владелец канала;
- не редактируется;
- задаёт полное текущее состояние метаданных канала.
Через этот блок должны обновляться:
- человекочитаемое заглавие канала;
- аватар канала;
- описание канала.
Место в формате блокчейна
msg_type = 1subType = 70- имя подтипа:
TEXT_CHANNEL_META
Этот подтип относится к текстовым блокам, но трактуется как скрытое техническое сообщение канала.
Общая модель применения
TEXT_CHANNEL_META:
- пишется в линию конкретного канала;
- задаёт полный снимок метаданных;
- при чтении канала сервер берёт последний валидный
TEXT_CHANNEL_METAв линии; - более старые
TEXT_CHANNEL_METAостаются в истории блокчейна, но не участвуют в вычислении текущего состояния; - если meta-блок не найден, используются базовые данные канала без override-полей.
Общий формат текста
Внутри TEXT_CHANNEL_META текст строится так:
- в начале идут технические теги
<SHiNE:...>; - после тегов идёт обычный UTF-8 текст;
- этот хвостовой текст считается описанием канала.
Пример:
<SHiNE:title;v=1;Моё имя канала>
<SHiNE:avatar;v=1;size=248193;sha256=3f2c8a...;ar=AbCdEf...>
Тут описание канала.
Поддерживаемые теги
1. Тег заглавия
Формат:
<SHiNE:title;v=1;Моё имя канала>
Смысл:
- задаёт красивое отображаемое имя канала;
- хранится как обычный UTF-8 текст;
- это не технический slug и не системное имя.
2. Тег аватара
Формат:
<SHiNE:avatar;v=1;size=248193;sha256=3f2c8a...;ar=AbCdEf...>
Смысл:
- задаёт аватар канала;
arхранит толькоtxId, без полного URL;- конкретный gateway/URL уже выбирает клиент или сервер.
Правила порядка
- теги должны идти только в начале текста;
- после начала обычного описания новые теги больше не допускаются;
- рекомендуемый порядок:
titleavatar- текст описания
- каждый тег допустим не более одного раза.
Правила отсутствующих полей
- если
titleотсутствует, используется обычное техническое имя канала; - если
avatarотсутствует, аватар у канала отсутствует; - если текста после тегов нет, описание считается пустым;
- если тегов нет вообще, но текст есть, это означает пустые
titleиavatar, а текст используется как описание.
Полный снимок состояния
Каждый новый TEXT_CHANNEL_META задаёт полное состояние канала целиком.
Это значит:
- новый блок не дозаполняет старые поля;
- новый блок не наследует значения из прошлого meta-блока;
- если в новом блоке нет
title, то красивое имя сбрасывается к обычному имени канала; - если в новом блоке нет
avatar, аватар сбрасывается; - если в новом блоке нет текста описания, описание становится пустым.
Ограничения для тега title
title хранится как UTF-8 строка, но для упрощения формата запрещаются следующие символы:
<>;- табуляция
- перевод строки
\0
Дополнительно:
- максимальная длина
title—50символов; - допускаются обычные Unicode-символы, включая кириллицу, латиницу, эмодзи и декоративные символы, если они не нарушают запреты выше.
Ограничения для описания
- описание хранится как обычный UTF-8 текст;
- максимальная длина —
250символов.
Если описание длиннее лимита, meta-блок должен считаться невалидным.
Ограничения для тега avatar
Обязательные поля тега:
vsizesha256ar
Правила:
size— размер файла в байтах;sha256— SHA-256 файла в hex;sha256должен иметь длину ровно64hex-символа;ar— толькоtxIdArweave;- длина
arдолжна соответствовать длине идентификатора Arweave-транзакции; - имя файла в meta-теге аватара не хранится.
Валидация блока
Блок TEXT_CHANNEL_META считается валидным только если одновременно соблюдены все условия:
- теги находятся строго в начале текста;
- каждый тип тега встречается не более одного раза;
titleудовлетворяет ограничениям;avatar-тег имеет все обязательные поля и корректные значения;- длина описания не превышает лимит.
Если блок невалиден:
- весь meta-блок не применяется целиком;
- сервер не должен частично брать из него только отдельные поля.
Что именно хранится в текущем состоянии канала
Текущее вычисленное состояние канала должно включать:
- техническое имя канала;
- красивое отображаемое имя;
- описание;
ava_ar;ava_sha256;ava_size;- время последнего meta-обновления.
База данных
Базовую таблицу каналов предлагается не менять концептуально, а расширить существующую модель хранения каналов.
Текущая основа уже есть в таблице:
channel_names_state
В неё предлагается добавить поля:
ava_arava_sha256ava_sizemeta_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=1subType=70- имя:
TEXT_CHANNEL_META - это скрытый технический текстовый блок канала
- порядок: теги в начале, потом описание
- теги:
<SHiNE:title;v=1;...><SHiNE:avatar;v=1;size=...;sha256=...;ar=...>
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-блоков.