«А давайте на блокчейне соцсеть построим!» (с) Часть 2.2
Часть 2.1 - https://set.ki/post/LPwVqCt
## Миграция
Я предложил реструктуризовать социальную БД: отказаться от десериализации транзакций, а складывать их как есть — у транзакций фиксированный набор полей. Скорость записи выросла, но теперь всё лежит условно в одной таблице: и посты, и лайки, и комменты. А их нужно доставать для двух целей — для консенсусных правил и для публичного API. И тут индексы SQLite меня сильно удивили: в итоге удалось добиться компромисса по скорости и там, и там. Конечно, пришлось внести и несколько дополнительных решений. Например, оказалось дорого обновлять строки, а для некоторых транзакций нужна была пометка First/Last — для этого создали отдельную таблицу: вместо одного UPDATE — несколько INSERT/DELETE, но быстрее.
Вообще работа с SQLite — самое удивительное моё приключение в этом проекте. Мы осознанно отказались от ORM на первых порах, потому что искали баланс между работой узла с цепочкой блоков и работой социального API. Я делал ставку на разделение ответственности: блокчейн занимается своим, социальная составляющая — своим. Но об этом в части 3.
## Экономика и консенсус
Первая версия консенсуса была примитивным набором правил, чья основная цель — обеспечить согласованность БД. Сами по себе транзакции дают лишь атомарность; порядок и правила валидации обеспечивает код. С одной стороны, биткоин защищает от двойных трат и трат «пустых» монет; с другой — социальный консенсус защищает от нежелательных действий в соцсети, например от двойных лайков.
Помимо согласованности данных нам нужна была система рейтингов, на которую опирается «лотерея». Я упоминал, что майнеры зарабатывают тем, что их узлы создают блоки и обеспечивают согласованность, а пользователи — созданием контента. Каждый лайк или комментарий поднимает рейтинг, отрицательные лайки опускают его. На основе движения рейтинга в каждом блоке рассчитываются пользователи, которым начисляется доля от вознаграждения за созданный блок: в блоке выплаты идут не только майнерам, но и пользователям. С экономической точки зрения это один из важнейших механизмов сети.
Правила менялись по мере введения новых типов действий (транзакций); меняли и правила расчёта рейтинга, и лотереи. Код консенсусных правил перерос в набор классов, где каждое наследование реализовывало форк правил на определённой высоте. Это была одна из самых сложных и муторных моих задач: узлы могли не обновиться до наступления форка, в правилах допускались ошибки — и цепочка ветвилась.
Главный вопрос в такой системе: кто будет совершать действия, если за каждое придётся платить fee? Транзакции в блокчейне не бесплатные. Мы это понимали, поэтому сделали социальные транзакции почти бесплатными — 1 satoshi в терминологии биткоина, самая малая единица монеты. Идея была в том, что, имея 1 монету, можно годами работать, тратя «по копейке» за каждое действие, в то время как лотерея порой приносила сотую или десятую долю монеты — на порядки больше платы за транзакцию. Пока сеть маленькая и люди ещё не приглашали друзей, делясь стартовыми монетами, мы запустили «кран», выдавая монеты при регистрации. Это один из централизованных сервисов, который помогал сети жить.
## Инфраструктура
Инфраструктура проекта получилась весьма богатой: ряд прокси-серверов для поддержки веб-версии приложения (им нужны DNS и сертификаты), сервис аналитики, explorer блокчейна, хостинг медиа, который мы пытались шардировать и реплицировать. И чем дальше мы шли, тем больше задач появлялось на пути. Я не хочу говорить о невозможности полностью децентрализованной системы, моё мнение прежнее: можно и нужно — вопрос лишь в цене и мотивации.
## Что дальше
Вопросы текущей реализации местами спорны, поэтому в следующей части я постараюсь ответить на вопросы, которые задаю сам себе: почему, зачем и как было бы лучше? В начале пути сложно предсказать, где окажешься, когда нет чёткого плана. Думаю, это будет самая интересная тема для меня — описать идеи, подкреплённые не только будущим, но и прошлым.
// Side effects: // - 2 AI agents damaged during text formatting and proofreading