Дата: 27.04.2026 # Ответ по блокчейну, форматам, каналам и расширяемости Короткий итог: текущую систему можно запускать и развивать дальше. Архитектура уже в целом готова к расширению версиями, но расширять нужно по строгим правилам совместимости. ## 1) Что важно зафиксировать про эволюцию форматов Да, ваш подход верный: - новые возможности добавляем через новые `type/subType/version` и/или новый `frameCode`; - старые блоки не переписываем и не «переподписываем»; - делаем конвертер/адаптер чтения: старые блоки читаются и приводятся к новой внутренней модели. Это и есть правильная схема «старое автоматически читается и представляется в новом формате». ## 2) Есть ли в коде узкие места, где нельзя расширять Критичных тупиков не видно, но есть важные ограничения: - Парсер сейчас строгий: неизвестные `type/subType/version` и неизвестный frame отклоняются. - Значит новые форматы нужно явно добавлять в парсер и серверную валидацию. - Старые блоки без нужных полей не проблема, если новый код умеет читать их как legacy-ветку. Вывод: расширение возможно, но только через явную поддержку версий, а не «само появится». ## 3) Про канал `0` Зафиксировано правило: - канал `0` оставляем как технический root; - контент-посты туда пока не публикуем. Это теперь отмечено в коде комментариями и проверками: - на клиенте (UI) пост в `lineCode=0` блокируется с понятной ошибкой; - на сервере добавлена валидация, которая тоже отклоняет `TEXT_POST` в канал `0`. ## 4) Формат аватара (`ava`) — обновлено Раньше: - `AR:` Теперь поддерживается составной формат: - `SHA256:,AR:` Что сделано: - парсер и сборщик формата в UI обновлены; - при загрузке нового аватара считается `SHA-256` оптимизированного файла и сохраняется вместе с `AR`; - при выборе существующего `txId` сначала качается файл, считается `SHA-256`, и только потом пишется `ava`; - серверный граф связей теперь умеет извлекать `AR` из составной строки (включая fallback для legacy/кривых значений). Это улучшает целостность: у вас есть не только адрес файла, но и контрольный хэш. ## 5) Как устроены ответы в каналах и насколько это надёжно Ответы (`REPLY` / `EDIT_REPLY`) сделаны отдельно от линейных постов: - `REPLY` хранит ссылку на цель (`toBlockchainName + blockNumber + hash32`) и текст; - `EDIT_REPLY` хранит ссылку на оригинальный reply (`blockNumber + hash32`) и новый текст. Сильные стороны: - ссылка идёт по номеру + хэшу (устойчиво к подмене цели); - редактирование отделено от оригинала и может агрегироваться в чтении. Для будущего это расширяемо: - можно добавить `TEXT_REPLY_V2` с новым payload, сохранив `V1` для старых клиентов. ## 6) Вложенные файлы и «мини-разметка» внутри сообщения Идея рабочая, но лучше делать аккуратно. ### Вариант A: «теги в тексте» (ваша идея) Плюсы: - быстро внедрить; - стандартно для пользователей (похоже на HTML/Markdown). Риски: - экранирование `<` `>` и безопасность рендера; - сложнее валидировать и безопасно отображать (XSS/инъекции). Если идти этим путём, лучше: - разрешить только whitelist-теги (`img/file/h1/h2/h3/b/i` и т.д.); - хранить метаданные файла явно: `type,size,sha256,ar`; - рендерить через безопасный парсер, а не через «сырой HTML». ### Вариант B: структурированный payload (рекомендуется как основной) Сделать `TEXT_POST_V2`: - массив сегментов: `text`, `image`, `file`, `heading`, `style`; - для файла хранить `kind`, `mime`, `size`, `sha256`, `storage`, `address`. Плюс: - надёжная валидация и безопасный рендер. Оптимальная стратегия: 1. В UI можно дать «мини-разметку» для ввода. 2. На запись преобразовывать её в структурированный payload V2. 3. Для старых клиентов отдавать fallback plain text. ## 7) Практический roadmap без остановки разработки 1. Оставить текущий blockchain running. 2. Формально описать versioning policy (что считается breaking/non-breaking). 3. Зафиксировать channel `0` как технический root-only. 4. Использовать `ava = SHA256 + AR` как новый стандарт. 5. Запланировать `TEXT_*_V2` для вложений и форматирования. Итог: стартовать и развивать можно уже сейчас. Основа хорошая, если строго держать версионирование и адаптеры чтения для legacy-блоков.