«А давайте на блокчейне соцсеть построим!» (с) Часть 3
ч2 - https://set.ki/post/mkxk5Gq
Я выделяю несколько основных развилок текущей реализации и возможных путей дальше. Это не призыв доработать существующее: иногда проще построить с нуля, а иногда — не начинать вовсе. Надеюсь только, что мысли кому-то окажутся полезными в будущем. А может, и мне самому.
## Что мы на самом деле строили
Я не сразу понял, что мы строим. Нет, задача была поставлена прямолинейно — делаем соцсеть со всеми вытекающими. Но потенциал технического решения я увидел чуть позже.
Связался как-то со мной парень: говорит, классную штуку сделали, я бы мог на её основе построить хранилище паролей. И меня осенило — распределённая система хранения данных, вот что мы делали всё это время. А соцсеть была лишь прототипом одного из применений.
## Универсальные транзакции и потолок
Как раз в то время я работал над унификацией социальной транзакции. Разрабатывать DTO под каждый тип — идея так себе. Но и одно поле вроде JSON — накладно. Так появились первые универсальные транзакции: для индексации «из коробки» набор полей string1, string2, int1, int2 и т. д. Заводить новые по смыслу транзакции стало проще.
Но консенсус всё ещё был встроен в блокчейн-узел. Это ограничение стало одним из самых сложных на пути к унификации системы: хочешь новое поведение — упираешься не в формат данных, а в то, что правила живут слишком глубоко.
## Layer-1 и Layer-2
Логично было бы разделить блокчейн и социальные данные. Пусть Layer-1 занимается транспортом и базовым монетарным консенсусом. Layer-2 узлы берут на себя консенсус верхнего уровня — социальный.
Второй слой не обязан быть одной цепочкой. Помимо учёта социальных контрактов это может быть модерация, своя логика вознаграждений. Пользователи много раз просили группы и сообщества — Layer-2 как раз хорошо лёг бы под такой функционал.
По ходу работы звучали и другие предложения: централизованные сервисы вместо Layer-2 узлов; или Layer-2, но без разделения ответственности — по сути копия текущей реализации, только для сегмента сети, например для сообщества. Варианты разные, но направление одно: не тащить всю семантику приложения в ядро цепочки.
## Разрешено всё, что не запрещено
Про реализацию консенсуса и социальных правил можно долго спорить, какой подход лучше: «разрешено всё, что не запрещено» или «запрещено всё, что не разрешено». Но однозначно ошибкой было контролировать всё.
Слишком сильный контроль за структурой payload и социальными контрактами принёс немало головной боли. Мой рецепт: разрешить всё, а при обработке дальше отбрасывать неподходящее. Это закрывает как минимум две проблемы:
- создавать «социальные» (и не только) транзакции без хардфорка — соцсеть, хранилище паролей, почта…; - упростить и удешевить prune — очистку старого ненужного для лёгкого варианта узла.
## Всё в одном — и цена этого требования
Разделение ответственности — хорошая штука. Но превращать децентрализованную сеть в микросервисную архитектуру, думаю, не стоит. Можно нарезать сервисы, собрать их через docker-compose или Kubernetes — и было бы «счастье». Но как быть с пользователями, которые этих слов не знают?
Возможно, это самое основное и самое спорное требование задачи — и оно однозначно накладывает кучу ограничений на реализацию. То самое «в пару кликов на домашнем ПК» из первой части в этом вопросе отзывается сильнее всего.
## Вместо разбора полётов
Сначала я думал описать эту часть в стиле: вот тут допустили ошибку, надо было так. Но начав писать, понял: не так уж много «фатальных» ошибок мы допустили — в конце концов сеть работает, и многим нравится. Да, многое сделано неидеально, а часть решений я бы сегодня не повторил, урок пройден так сказать.
Сетка не даёт писать совсем большие посты — часть 2 пришлось разбить, поэтому местами скомканность, но уж как есть.
## Эпилог
Эпилогом я хотел бы скромно похвастаться: как разработчику мне удалось поработать над проектом мечты, где ты и инженер и художник, что кажется редкостью в мире корпоративных решений и строгих грейдов ответственности.
// Side effects: // - 2 AI agents damaged during text formatting and proofreading