Распределенная сеть base.network
«Свобода — это возможность сказать, что дважды два – четыре. Если дозволено это, всё остальное отсюда следует.» Джордж Оруэлл — «1984»
В современном мире активно развиваются различные распределенные технологии. Уже не первый год успешно функционируеют такие проекты как пиринговая платежная система Bitcoin, распределенные микроблоги (Twister), распределенные мессенджеры (например, Tox). Дошло дело и до полноценных распределенных сайтов.
Частично функционал распределённых сайтов уже реализован в таких проектах как Freenet и I2P. Однако подобные проекты имеют ряд недостатков. Например, в настоящее время Freenet не может быть использован для создания или распространения динамического контента, такого, который использует базы данных или скрипты. Для доступа к подобным сетям часто необходимо устанавливать специальное программное обеспечение или скачивать базы данных огромных размеров. Многие пиринговые сети имеют большое время отклика. Между публикацией информации и тем когда ее увидят остальные пользователи проходит немало времени.
Предлагаемая система base.network призвана устранить подобные недостатки пиринговых сетей и объединить в себе все технические преимущества централизованных систем со свободой обмена информации в распределенных сетях. Это своего рода попытка создать защищённую децентрализованную сеть с малым временем отклика и свойствами автономности, отказоустойчивости и масштабируемости. Ключевой целью проекта является способность функционировать даже под давлением организаций, осуществляющих контроль, пресечение публикации, а также ограничение доступа к информации в Интернете. Все аспекты проекта доступны в виде открытого исходного кода и бесплатны.
Это позволяет убедиться, что программное обеспечение делает именно то, что заявлено, и дает возможность всем разработчикам совершенствовать защиту сети от попыток ограничить свободное распространение информации.
base.network — Что это?
Это одноранговая сеть предназначенная для децентрализованного распределённого хранения данных без возможности их цензурирования. Система не имеет центральных серверов и не находится под контролем каких-либо частных лиц или организаций. Создана с целью предоставить пользователям свободу слова в онлайн-пространстве. Система работает на основе объединения в общий кластер серверных нод, предоставляемых членами сети на безвозмездной основе. Все данные равномерно распределены между серверными нодами и не требуют центрального хранилища. Участники предоставляют полосу пропускания и дисковое пространство своих серверов для публикации или получения в Сети разного рода информации. Например, файлы, структуры данных и упорядоченные списки.
Как результат, подобная схема хранения данных позволяет реализовать динамические приложения, такие как блоги, новостные каналы, комментарии, закрытые групповые переписки, медиа листы, поисковые индексы и каталоги. Особенностью этих приложений является стойкость к перебоям обусловленная децентрализованной архитектурой системы. Еще одна важная особенность — невозможность цензурирования со стороны третьих лиц, в том числе со стороны разработчиков приложений.
Все данные залитые в систему обязательно подписываются автором, используя для этого криптосистемы с открытым ключом. Проверить авторство тех или иных данных всегда можно зная публичный ключ автора. В качестве криптографического алгоритма для создания цифровой подписи и шифрования данных в системе используется асимметричный алгоритм шифрования с открытым ключом основанный на ECDSA (Elliptic Curve Digital Signature Algorithm) с длиной ключа 256 бит (в частности, используется кривая secp256k1) и хеш функция SHA-256.
Как устроена сеть
В системе, в отличии от других пиринговых сетей, разделяется понятие сервера и клиента. Клиентским ПО является обычный браузер, что делает сеть более доступной в использовании для рядового пользователя по сравнению со многими другими пиринговыми сетями.
Все данные сети хранятся на серверах, предоставляемых участниками на безвозмездной основе. В идеале выделенные серверные узлы имеют доступ к хорошему интернет-каналу, что позволяет пользователям получить быстрый доступ к ресурсам сети.
Итак, участники системы для поддержания сети предоставляют свои серверные ресурсы. Для этого они устанавливают специальное серверное ПО, которое по сути представляет собой небольшой веб-сервер и БД в одном лице — так называемая серверная нода. Для работы ноды необходимо выделить внешний IP адрес (v4) и свободный порт.
Хранение данных
Для начала, чтобы понять организацию хранения данных, представим, что все пространство сети ограничено строго заданным объемом, скажем, в 32 ГБ. Таким образом, сеть превращается в огромную хеш-таблицу, где каждый документ по его хеш-адресу будет строго иметь свое место в виртуальном пространстве сети. Чтобы не хранить все данные сети на одной физической машине (как это сделано, например, в системе Bitcoin) разделим всё наше виртуальное пространство на некоторое количество сегментов. Для начала, поделим его, скажем, на 8 сегментов. Каждый сегмент по 4ГБ. Теперь выделенные физические машины могут по отдельности обслуживать отдельные сегменты, без необходимости хранить полную копию базы, а лишь её кусочек. Каждая такая серверная нода может поддерживать несколько сегментов сети. Один же сегмент будет обслуживаться несколькими независимыми нодами. Зная физические адреса машин, и имея информацию о том какие сегменты какими машинами обслуживаются, мы всегда можем получить доступ к отдельному документу по его адресу. Доступ к нодам осуществляется посредством стандартного http-протокола.
После добавления данных пользователями на одну из нод, информация тут же синхронизируется между всеми нодами, обслуживающими тот же сегмент, используя для этого тот же http-протокол.
Кольца
Выше было оговорено, что пространство сети ограничено определённым объемом (32 ГБ) и сеть таким образом работает как огромная хеш-таблица. Все это верно для виртуального пространства, ограниченного в рамках одного так называемого Кольца.
Система колец была разработана для того, чтобы свободно масштабировать виртуальное хранилище сети и строго не ограничивать её пространство. По мере наполнения данными текущих колец, сетью будут задействованы следующие виртуальные кольца. Количество сегментов для каждого следующего кольца увеличивается в 8 раз, размер сегментов в свою очередь тоже увеличивается в несколько раз. Если точнее, в количество раз кратное двум, для разных типов хранилищ это число будет разным (см. ниже Типы хранилищ). Таким образом, суммарный объем каждого следующего кольца на порядок превышает размер предыдущего и позволяет размещать все больше и больше данных. Потенциальный рост популярности сети и, как следствие, рост числа машин дает возможность обслуживать следующие кольца, позволяя сети осуществлять по сути неограниченный рост.
Например, для хранения файлов количество сегментов в первом кольце равно 8. Во втором 64. и т.д. Размеры сегментов увеличиваются в 2 раза. Объем каждого следующего кольца, таким образом, увеличивается в 16 раз. И, к примеру, для третьего кольца он составит 16 ТБ. А для 5-го уже 4 ПБ!
В нулевом кольце всегда располагается один сегмент. Обычно в нем содержится ключевая для сети информация.
Ноды
Как и было сказано выше, ноды представляют собой небольшой веб-сервер с выделенным IP-адресом и портом. Каждый узел сети имеет информацию об остальных ее участниках. Получить карту всей сети можно сделав специальный http-запрос к любой ноде. При первом подключении к системе нода пытается получить карту сети, связавшись хотя бы с одной из нод, указанных в ее изначальном списке. После синхронизации информации, нода сообщает о себе остальным участникам. Они в свою очередь, убедившись что новая нода корректна, обновляют свою карту сети.
Адресация документов
Для получения (или сохранения) какого-либо документа в сети нам необходимо знать его адрес. Адресом может выступать любой строковый идентификатор. От этого строкового адреса вычисляется хеш — так называемый uid (уникальный идентификатор документа). Для файлов подобным идентификатором выступает хеш от содержимого файла. Первые разряды полученного хеша будут говорить нам о номере сегмента, в котором располагается. Зная номер сегмента и список нод, обслуживающих этот сегмент, а также их внешние IP-адреса и порты, мы можем обратиться к любой физической машине и запросить документ обычным http-запросом. Для формирования подобных запросов у пользователя нет необходимости ставить специальное ПО. В качестве клиентского ПО может выступать обычный браузер.
Все данные сети имеют автора. Во время публикации каждый документ обязательно должен иметь свою цифровую подпись, которая формируется закрытым ключом его автора. Впоследствии авторство каждого документа может быть проверено при помощи его открытого ключа.
Типы хранилищ
На текущий момент система реализует 4 типа хранилищ данных, каждое из которых позволяет хранить различные структуры информации.
- F — файловое хранилище
- N — хранилище доменных имен, сертификаты
- D — списки данных одного автора
- P — публичные списки данных
Файловое хранилище (тип хранилища F)
Адресом файла выступает хеш от его содержимого. Таким образом, один и тот же файл, залитый в сеть различными пользователями, будет иметь один и тот же адрес. Убедиться в том, что по заданному адресу возвращается корректное содержимое, можно проверив его хеш.
Доменные имена (тип хранилища N)
Данный тип хранилища необходим для хранения информации о доменных именах, владельцах доменов и публичных сертификатах зарегистрированных пользователей. Этот тип хранилища доступен на запись исключительно регистраторам доменных зон. Публичный ключ регистратора известен всем участникам сети и жестко прошивается непосредственно в клиентском и серверном ПО. Итак, хранилище типа N представляет собой своего рода огромную хеш-таблицу. По имени домена можно запросить информацию о владельце домена и его публичный ключ. Эта информация подписывается корневым сертификатом регистратора и клиенту всегда можно проверить ее валидность. Теперь, зная сертификат владельца домена, мы можем запросить манифест сайта - данные о настройках, структуре, движке и названии сайта.
Списки данных (тип хранилища D)
Помимо одиночных документов, в сети существует возможность работать со списками данных, формировать так называемые ленты. Списки, как и одиночные документы, располагаются по определенному уникальному идентификатору uid. Однако для данного типа хранилища, в отличии от первых двух, существует возможность запрашивать списки документов заданного автора с заданным порядком сортировки и смещениями. Фактически данное хранилище реализует простейший индекс, который позволяет возвращать упорядоченные данные.
Валидность и авторство каждой такой записи можно проверить по ее хешу и подписи, сформированной автором при добавлении документа.
Помимо всего, хранилища типа D и P дают клиентам возможность осуществлять подписку на добавление записей в ленту, используя для этого технологию SSE (Server-Sent Events). Например, следующим запросом можно подписаться на добавление данных в нашу ленту. Клиент откроет соединение и будет ожидать появления серверного события.
Как и для файлов, анонимные пользователи не имеют возможность формировать свои ленты, и добавлять новые элементы в список могут лишь зарегистрированные пользователи (с сертификатом имеющим подпись регистратора).
Публичные списки данных (тип хранилища P)
Данный тип хранилища очень похож на предыдущий за исключением того, что добавлять элементы в один список могут различные пользователи, в том числе анонимные. Такое хранилище позволяет организовать систему комментариев, отзывов, группы, закрытую переписку двух и более пользователей.
В заключении можно сказать, что потенциально система не ограничивается только 4 типами хранилищ. Сторонними разработчиками могут быть предложены иные типы хранилищ, имеющие более широкие возможности. Например, такие как полнотекстовые индексы, сервера с раздачей медиа-потоков в реальном времени, хранилища агрегированных данных, статистик, системы для передачи мгновенных сообщений между пользователями без хранения их на диске, IP-телефонию, интернет-радио, IP-телевидение, видеоконференции и другие потоковые протоколы и сервисы.
Как сеть работает для пользователя
Для обычного пользователя работа с системой начинается без установки какого-либо специального ПО. Для этого достаточно лишь использовать обычный браузер. Для ВСЕХ адресов *.base.network/* возвращается статичная html-страница, которая включает в себя код клиентского ядра, написанный на JavaScript.
Подобная схема сейчас безусловно имеет центральную точку входа в виде сайта и домена base.network, для входа на который необходимо использовать существующую систему доменных имен. Однако такое допущение в последствии может быть легко устранено путем установки пользователем специального браузерного плагина. Подобный плагин для всех адресов *.base.network будет возвращать статичную страницу с базовым кодом ядра системы, не используя при этом текущую систему доменных имен и не делая дополнительных запросов к внешним центральным ресурсам.
Клиентское ядро содержит в себе начальный список нод (их IP-адреса и порты). При первой загрузке движка, скрипт пытается подключиться к любой ноде из этого списка и получить от нее свежую карту сети, которую он в последствии будет хранить в LocalStorage браузера. Скрипт периодически будет опрашивать ноды из его списка и обновлять информацию о сети. Карта сети содержит в себе список всех нод, их адреса и порты, версию серверного ПО, а также список сегментов обслуживаемых каждой нодой. Теперь на клиенте достаточно информации для того чтобы получить любой документ из сети. Для любого адреса документа мы знаем в каком сегменте он находится и какими нодами этот сегмент обслуживается. Для более быстрой загрузки данных из сети, клиент выбирает ближайшую к нему ноду. Подлинность скачанных данных клиент может проверить по хешу и сверив подпись автора, используя его открытый ключ.
При первом входе в сеть для пользователя генерируется анонимный сертификат, содержащий закрытый и открытый ключ. Этот сертификат хранится в LocalStorage браузера в пространстве имен домена core.base.network. Скрипты других доменов не имеют прямого доступа к этому пространству и не могут получить информацию о закрытом ключе.
Все внешние http-запросы осуществляются исключительно из фрейма клиентского ядра — core.base.network. Движок сайта может работать с системой только через этот фрейм, используя для этого специальный API. API предоставляет сайтовому движку возможность заливать в сеть файлы, запостить данные, получать ленты данных, подписаться на событие добавления данных в ленту.
В момент публикации ядро подписывает присылаемые сайтовым движком данные, используя для этого закрытый ключ, а имея на руках карту сети, осуществляет непосредственно POST-запрос на необходимые ноды.
Регистрация домена
Во время первого посещения пользователем любого сайта сети, ядро автоматически генерирует для него анонимный сертификат. Анонимный сертификат имеет ряд ограничений в работе с сетью. Анонимные пользователи не могут заливать в сеть файлы, зарегистрировать свой персональный домен, сайт, а также не могут оставлять комментарии к некоторым топикам, имеющие соответствующие ограничения в правах доступа.
Регистрация сертификата происходит одновременно с регистрацией персонального домена, закрепленного этим сертификатом. Сейчас понятия домена и публичного сертификата неразрывно связаны. Во время регистрации пользователь в шифрованном виде отправляет регистратору свой публичный ключ и имя домена, к которому необходимо будет привязать регистрируемый сертификат. Регистратор добавляет свою подпись к публичному ключу пользователя и размещает данные о сформированном сертификате и о владельце домена в хранилище доменных имен (storage N), где оно будет доступно остальным пользователям.
Регистратор — это корневой сертификат, которому все доверяют. Публичный ключ регистратора вшит непосредственно в клиентское и серверное ПО. Сертификаты всех зарегистрированных пользователей включают его подпись. Регистратор подписывает информацию о доменах и их владельцах. Представляет собой некий ограничитель от беспорядочных регистраций доменов. Является лишь регистратором доменов и не имеет технической возможности менять или как-то контролировать информацию сайтов. Ничего не знает о физическом владельце сертификата, его IP-адресе.
Сейчас регистратор является некой центральной фигурой в организации сети, что несколько противоречит духу децентрализованного устройства системы. Впоследствии в планах регистрацию и передачу доменов сделать полностью децентрализованной. Существующая схема регистрации доменов выбрана исключительно из-за скорости работы сети. Пользователю нет необходимости скачивать тяжелую базу всех доменных имен (как это сделано например в неймкоин), а лишь достаточно по одной записи проверить подпись регистратора. К тому же текущая схема регистрации жестко не ограничивает количество регистраций, что обеспечивает быстрых вход участников и дальнейшее распространение популярности системы.
Итак, сертификат является зарегистрированным, если он имеет подпись регистратора. Владельцем домена является лицо, которое имеет закрытый ключ от публичного сертификата. По имеющемуся сертификату всегда можно получить информацию о его владельце, включая имя его персонального домена. И наоборот. По названию домена всегда можно получить публичный сертификат его владельца. Информация о домене и сертификате подписывается регистратором и ее всегда можно получить из N-хранилища и проверить на подлинность.
Знакомство. Демо сайт
Для каждого вновь зарегистрированного домена система устанавливает сайт с тестовым движком. На данный момент это, собственно, единственный сайтовый движок существующий в системе. Есть надежда, что с ростом популярности сети сторонними разработчиками будут конструироваться разнообразные движки.
Итак, после регистрации пользователем своего домена, он может зайти на свой персональный сайт, сменить настройки, указать тему, дизайн, потенциально установить сторонний движок, создавать и редактировать разделы сайта. Пример подобного сайта, а также демонстрация возможностей системы предлагаются по примеру тестового сайта: http://test.base.network/.
В качестве примера текущий движок позволяет добавлять такие сервисы как:
- блоги
- фотоальбомы
- чаты
- музыкальные и видео плейлисты
Для каждого раздела можно указать свой заголовок, описание, фоновую картинку, иконку. Дополнительно можно задать минимальные права доступа на добавление дочерних элементов для текущего раздела.
Сайт в соответствии с последними веяниями имеет адаптивный дизайн и вполне корректно отображается и редактируется на мобильных устройствах.
Планы
- Доработать сайтовый движок. Переработать дизайн и повысить юзабилити существующего функционала. Добавить ряд полезных функций, чтобы по функционалу не уступать современным социальным сетям.
- Локализовать веб-интерфейс для популярных языков.
- Добавить сервис личных сообщений с обеспечением полной анонимности. Сервис помимо шифрования непосредственно содержимого сообщений будет скрывать сам факт переписки двух лиц, чего сложно добиться с использованием централизованной системы. Реализация такого сервиса требует лишь небольших доработок сайтового движка на стороне клиента. Серверная часть уже сейчас вполне готова для воплощения подобного функционала.
- Переписать серверное ПО на языке GO, поскольку скорость работы с криптографического алгоритмами на Node.js оставляет желать лучшего.
- Покрыть весь функционал тестами.
- Составить подробную документацию к проекту, API и протоколам общения клиент-сервер.
- Создать своего рода Store сайтовых движков, сервисов и плагинов, а также стилей и дизайн-тем.
Поддержка проекта
Возможно, некоторым разработчикам будет интересно поучаствовать в данном проекте — привнести новые возможности, расширить функционал, добавить фичи или улучшить дизайн существующего движка. Велком! Буду весьма признателен любой помощи.
Со всеми исходниками проекта можно ознакомится на GitHub — github.com/basenetwork.
Как вы наверное уже заметили, проект пока что находится в стадии становления и ему крайне требуется ваша помощь. Помочь проекту может каждый, кому небезразличны принципы свободы распространения информации в современном мире. Ваши советы, отзывы и предложения по улучшению проекта уже являются ощутимой помощью.
Кроме того, если у вас в распоряжении имеются сервера, либо на ваших персональных машинах есть выделенный канал, вы можете предоставить небольшую часть своих машинных ресурсов для развития сети. С инструкцией по установке серверной ноды вы можете ознакомится выше или на github. Также будут крайне важны ваши отзывы о работе установленного серверного ПО.
Веб-разработчики, владеющие Node.js, могут предложить свои доработки и советы по оптимизации серверного ПО.
Веб-дизайнеры, HTML-верстальщики, программисты, имеющие опыт работы на JavaScript, могут принять участие в развитии сайтового движка и его отдельных сервисов. Приветствуется также и разработка собственного сайтового движка с нуля.
Если у вас нет собственных серверных ресурсов и возможности напрямую поучаствовать в разработке проекта, вы можете проявить активность в соц сетях: лайки и репосты никогда не бывают лишними! Также помочь проекту можно своими финансовыми средствами.
Спасибо за поддержку!
Заключение
И в заключение немного лирики. Цензура в современном мире — это большая глупость. Любые идеи, неважно технические или гуманитарные, развиваются одинаково — они растут одна из другой, бесконечной цепочкой. Идея имеет право быть высказанной и услышанной в её оригинальном виде, без искажений и цензуры. Однако в современных реалиях рукописи вполне неплохо горят и написанное пером нещадно вырубается топорами. И, как ни печально осознавать это, но задуманный как рупор свободы, Интернет в руках правительств стран и государств превратился в инструмент всеохватывающего контроля. Причем контроля настолько неприкрытого, что все чаще продвинутая часть общества задается вопросом: а есть ли свобода слова в интернете? Можем ли мы с его помощью открыто заявлять о чем-то действительно важном? Видим ли на его просторах всю палитру разнохарактерных независимых мнений?
Меня зовут Денис Глазков, я представляю вашему вниманию свой проект — распределенную сеть base.network — проект, который при достаточной поддержке и развитии мог бы изменить ситуацию в иную сторону — предоставить нецензурируемую среду общения и распространения информации.