Cryptography
Open source
JavaScript
7 September 2015

Пиринговая сеть base.network

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-протокол.

base.network - scheme

Кольца


Выше было оговорено, что пространство сети ограничено определённым объемом (32 ГБ) и сеть таким образом работает как огромная хеш-таблица. Все это верно для виртуального пространства, ограниченного в рамках одного так называемого Кольца.

Система колец была разработана для того, чтобы свободно масштабировать виртуальное хранилище сети и строго не ограничивать её пространство. По мере наполнения данными текущих колец, сетью будут задействованы следующие виртуальные кольца. Количество сегментов для каждого следующего кольца увеличивается в 8 раз, размер сегментов в свою очередь тоже увеличивается в несколько раз. Если точнее, в количество раз кратное двум, для разных типов хранилищ это число будет разным (см. ниже Типы хранилищ). Таким образом, суммарный объем каждого следующего кольца на порядок превышает размер предыдущего и позволяет размещать все больше и больше данных. Потенциальный рост популярности сети и, как следствие, рост числа машин дает возможность обслуживать следующие кольца, позволяя сети осуществлять по сути неограниченный рост.

Например, для хранения файлов количество сегментов в первом кольце равно 8. Во втором 64. и т.д. Размеры сегментов увеличиваются в 2 раза. Объем каждого следующего кольца, таким образом, увеличивается в 16 раз. И, к примеру, для третьего кольца он составит 16 ТБ. А для 5-го уже 4 ПБ!

base.network - rings

В нулевом кольце всегда располагается один сегмент. Обычно в нем содержится ключевая для сети информация.

Ноды


Как и было сказано выше, ноды представляют собой небольшой веб-сервер с выделенным IP-адресом и портом. Каждый узел сети имеет информацию об остальных ее участниках. Получить карту всей сети можно сделав специальный http-запрос к любой ноде.

curl http://5.9.123.140:8080/-/nodes

{"nid":"5.9.123.140/8080","ver":1,"seg":"D,N,F,P,D0,D1,D2,D3,D4,D5,D6,D7,F0,F1,F2,F3,F4,F5,F6,F7,P0,P1,P2,P3,P4,P5,P6,P7,D06,D64,F50,P00,P55,P77"}
{"nid":"46.4.76.98/8081","ver":1,"seg":"D,N,F,P,D0,D1,D2,D3,D4,D5,D6,D7,F0,F1,F2,F3,F4,F5,F6,F7,P0,P1,P2,P3,P4,P5,P6,P7,D57,D66,F41,F54,P04"}

При первом подключении к системе нода пытается получить карту сети, связавшись хотя бы с одной из нод, указанных в ее изначальном списке.
Версию серверного ПО конкретной ноды, какие сегменты ею обслуживаются, насколько они заполнены, также можно получить сделав следующий http-запрос:

curl http://5.9.123.140:8080/-/about

{"ver":1,"nid":"5.9.123.140/8080","segments":{"D":{"usage":0},"N":{"usage":0},"F":{"usage":0},"P":{"usage":0},"D0":{"usage":0},"D1":{"usage":0},"D2":{"usage":0},"D3":{"usage":0}," 
... ,
"updated":1441639911027}

После синхронизации информации, нода сообщает о себе остальным участникам. Они в свою очередь, убедившись что новая нода корректна, обновляют свою карту сети.

Адресация документов


Для получения (или сохранения) какого-либо документа в сети нам необходимо знать его адрес. Адресом может выступать любой строковый идентификатор. От этого строкового адреса вычисляется хеш (используя алгоритм SHA-256) — так называемый uid (уникальный идентификатор документа). Для файлов подобным идентификатором выступает хеш от содержимого файла. Первые разряды полученного хеша будут говорить нам о номере сегмента, в котором располагается документ. Например,

document URI:

 	D2/my-domain.base/path/document.txt

path:

 	my-domain.base/path/document

uid — sha256(path) (hex):

 	49ea72cbd1de7f2d...3cf23d49778

uid (oct):

 	2236516262750736...44365113570 

document`s coordinates:

 	storage:	D
 	ring:  		2
 	uid:		49ea72cbd1de7f...f23d49778
 	segment:	D22

Теперь, зная номер сегмента и список нод, обслуживающих этот сегмент, а также их внешние IP-адреса и порты, мы можем обратиться к любой физической машине и запросить документ обычным http-запросом. Для формирования подобных запросов у пользователя нет необходимости ставить специальное ПО. В качестве клиентского ПО может выступать обычный браузер.

Все данные сети имеют автора. Во время публикации каждый документ обязательно должен иметь свою цифровую подпись, которая формируется закрытым ключом его автора. Впоследствии авторство каждого документа может быть проверено при помощи его открытого ключа.

Все документы в системе характеризуются следующими параметрами:
  • storage — Тип хранилища. Указывается в виде одного символа. Например F,N,D,P
  • ring — номер кольца в хранилище (integer)
  • uid — уникальный идентификатор ресурса (hex64)

В общем случае ссылка на одиночный документ или список данных будет выглядеть следующим образом:

              <storage:char><ring:int>/<uid:hex64>


Для некоторых типов хранилищ, такие как файловое хранилище, список параметров будет чуть шире. Например:
  • extention — расширение файла. Говорит о типе содержимого.
  • aid — уникальный идентификатор автора (хеш от его публичного сертификата длиной 20 символов), необходим в случае, когда мы запрашиваем информацию только конкретного автора для указанного адреса.

Пример ссылок:

F1/ef43c9adc8aeec6910b4373ba0d9fbf28048ed53ec631ab9fd6fa8ad00a8a3a0.txt

D4/930bbc0fa952dcc8eb7e8a711ac953c61f76f86fecd1ba7b0b5c4e74834e12bf?aid=Ipf8SOrpxbgYnNMXszFk 

Типы хранилищ


На текущий момент система реализует 4 типа хранилищ данных, каждое из которых позволяет хранить различные структуры информации.
  • F — файловое хранилище
  • N — хранилище доменных имен, сертификаты
  • D — списки данных одного автора
  • P — публичные списки данных

Расскажем немного подробнее о каждом из них.

Файловое хранилище (тип хранилища F)

Файлы, в отличие от строковых данных, имеют некоторую специфику в адресации. Адресом файла (его uid-ом) выступает хеш sha-256 от его содержимого. Таким образом, один и тот же файл, залитый в сеть различными пользователями, будет иметь один и тот же адрес. Убедиться в том, что по заданному адресу возвращается корректное содержимое, можно проверив его хеш. Тип содержимого (Content-Type) файла указывается непосредственно в ссылке в виде расширения (extention).

Например, следующей ссылке
   F1/ef43c9adc8aeec6910b4373ba0d9fbf28048ed53ec631ab9fd6fa8ad00a8a3a0.txt
будет соответствовать документ с параметрами:
  • storage=F — тип хранилища “Files”,
  • ring=1 — первое кольцо,
  • uid=ef43...a3a0 — уникальный идентификатор файла,
  • extention=txt — расширение файла, которому соответствует тип содержимого (content-type) “text/plain”

По заданному uid, переведя его в 8-ричную систему, по первой цифре получим номер сегмента. Ему соответствует “7”. Теперь, зная все ноды, которые обслуживают сегмент с именем “F7”, а также физические адреса нод, мы можем получить сам документ:

curl -i http://5.9.123.140:8080/-/F7/data/ef43c9adc8aeec6910b4373ba0d9fbf28048ed53ec631ab9fd6fa8ad00a8a3a0.txt

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Cache-Control: max-age=315360000, public
Expires: Sun, 17 Aug 2025 15:18:30 GMT
Access-Control-Expose-Headers: x-base-author
x-base-author: AA3Evvx1AR...i8UONOm92Q==
Connection: keep-alive
Transfer-Encoding: chunked

TEST FILE

Теперь проверим хеш от содержимого полученного документа:

curl http://5.9.123.140:8080/-/F7/data/ef43c9adc8aeec6910b4373ba0d9fbf28048ed53ec631ab9fd6fa8ad00a8a3a0.txt|shasum -a 256

ef43c9adc8aeec6910b4373ba0d9fbf28048ed53ec631ab9fd6fa8ad00a8a3a0 -

Все в порядке: он соответствует нашему запрашиваемому uid.

Ниже приведена таблица соответствий количества сегментов и размера кольца в зависимости от его номера для файлового типа хранилища.

Params of F-storage

ring

Size of segment GB

Count of segments

TOTAL SIZE OF RING

Max Size of Data Pack, KB

Min count of records

0

2

1

2 GB

2

1.05E+06

1

4

8

32 GB

16

2.10E+06

2

8

64

512 GB

128

4.19E+06

3

16

512

8 TB

1 024

8.39E+06

4

32

4 096

128 TB

8 192

1.68E+07

5

64

32 768

2 PB

65 536

3.36E+07

6

128

262 144

32 PB

524 288

6.71E+07

7

256

2 097 152

512 PB

4 194 304

1.34E+08



Стоит обратить внимание на то, что допустимый размер одного файла в каждом кольце ограничен определенным размером. Сделано это для того, чтобы сеть не была “убита” заливкой огромных файлов недобросовестными пользователями. Как видно из таблицы ограничения на размеры файла снижаются по мере роста сети и захвата последующих колец новыми нодами.
Следует учитывать также то, что данный тип хранилища доступен на запись лишь зарегистрированным пользователям (с сертификатом имеющим подпись регистратора) и не позволяет добавлять файлы пользователям с анонимным сертификатом. Это ограничение введено, для того, чтобы защититься от потенциального флуда и не забить хранилище никому ненужной информацией.

Доменные имена (тип хранилища N)
Данный тип хранилища необходим для хранения информации о доменных именах, владельцах доменов и публичных сертификатах зарегистрированных пользователей. Этот тип хранилища доступен на запись исключительно регистраторам доменных зон. На данный момент он один — это регистратор виртуальной доменной зоны .base. Публичный ключ регистратора известен всем участникам сети и жестко прошивается непосредственно в клиентском и серверном ПО.
Размер сегмента нулевого кольца хранилища составляет 8 ГБ. Этого размера теоретически должно надолго хватить чтобы хранить все данные о доменах и сертификатах исключительно в одном сегменте нулевого кольца. Таким образом, получение информации по имени домена будет происходить без поиска в разных кольцах.
Итак, хранилище типа N представляет собой своего рода огромную хеш-таблицу. По имени домена можно запросить информацию о владельце домена и его публичный ключ.
Например, для домена test.base.network нам будут возвращены следующие данные:

curl 'http://5.9.123.140:8080/-/N/data/test.base'

{"ver":0,"author":"AA3Evvx1ARDVVyiPWZ1197l3MAOPe2U1FR7hjxQpL6TQmqf8dxEEoB/AV19Um49u9U7Lb8Lx9ujX2MurTd6qnWw=","hash":"yU6mMInrZqN43/ggsj+0J/g1rpsMs+lFiO7LuoXGwRo=","sign":"vB00Eewv7hzVrvtGUhUtjOHvU8u7uM0KujyId+py6GvJdwBNkInw8FeUX1+DYYFtygFX5QyB70BShhDv9Gd9ZA==","data":"eyJvd25lciI6IkFBM0V2dngxQVJEVlZ5aVBXWjExOTdsM01BT1BlMlUxRlI3aGp4UXBMNlRRbXFmOGR4RUVvQi9BVjE5VW00OXU5VTdMYjhMeDl1algyTXVyVGQ2cW5XeHVFeHhhdExQb1BadWtPdS9iTktkZEVqbm9VeDljZ0UzMzlnWkdzQUJWRGMvWDFGS1dPMjJGOElJejVxamF5b2R2ZklZZHZ0WmRjUEdXVm1rWUxYdngifQ=="}


Эта информация подписывается корневым сертификатом регистратора и клиенту всегда можно проверить ее валидность. Декодировав данные из base64, мы получим следующую информацию о домене в виде JSON. В качестве owner указан публичный сертификат владельца домена.
{"owner":"AA3Evvx1ARDVVyiPWZ1197l3MAOPe2U1FR7hjxQpL6TQmqf8dxEEoB/AV19Um49u9U7Lb8Lx9ujX2MurTd6qnWxuExxatLPoPZukOu/bNKddEjnoUx9cgE339gZGsABVDc/X1FKWO22F8IIz5qjayodvfIYdvtZdcPGWVmkYLXvx"}

Теперь, зная сертификат владельца домена, мы можем запросить манифест сайта — данные о настройках, структуре, движке и названии сайта.

Списки данных (тип хранилища D)
Помимо одиночных документов, в сети существует возможность работать со списками данных, формировать так называемые ленты. Списки, как и одиночные документы, располагаются по определенному уникальному идентификатору uid. Uid-ом для списков является хеш sha256 от его строкового адреса. Однако для данного типа хранилища, в отличии от первых двух, существует возможность запрашивать списки документов заданного автора с заданным порядком сортировки и смещениями. Фактически данное хранилище реализует простейший индекс, который позволяет возвращать упорядоченные данные.
Например адресу списка test.base.network/blog будет соответствовать следующий uid
sha256(“test.base/blog/”) ->
e1d8f9c396164dbbb8debf9c0ce08805bcf4bd8d98c2cc462c8bc21c21f27438


Теперь мы можем запросить список документов, автором которых в данном случае является владелец сайта test.base.network (с aid=Ipf8SOrpxbgYnNMXszFk). По умолчанию сортировка записей осуществляется в обратном порядке по времени добавления.

curl -i 'http://5.9.123.140:8080/-/D7/data/e1d8f9c396164dbbb8debf9c0ce08805bcf4bd8d98c2cc462c8bc21c21f27438?aid=Ipf8SOrpxbgYnNMXszFk'

HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Access-Control-Allow-Origin: http://core.base.network
Date: Tue, 25 Aug 2015 11:38:44 GMT
Connection: keep-alive
Transfer-Encoding: chunked

{"pos":"MjAxNTA3MTkwOTI1NDU5ODg=","ver":3,"author":"AA3Evvx1ARDVVyiPWZ1197l3MAOPe2U1FR7hjxQpL6TQmqf8dxEEoB/AV19Um49u9U7Lb8Lx9ujX2MurTd6qnWxuExxatLPoPZukOu/bNKddEjnoUx9cgE339gZGsABVDc/X1FKWO22F8IIz5qjayodvfIYdvtZdcPGWVmkYLXvx","hash":"MWEyLxrkDosW2FU3+GTYXk045PN8TBhsiloovkxuTvA=","sign":"rgtR7qJXc5GMbm7TxZijbQiKOtH9gpWhUUt7z6L2yetEcRR7bUdVxmW9UvUPVaMfq1LpVEcZ4IF2CuQf4NVvHw==","data":"eyJ0aXRsZSI6...sbCJ9"}

{"pos":"MjAxNTA3MTkwOTEzNTY0NzE=","ver":3,"author":"AA3Evvx1ARDVVyiPWZ1197l3MAOPe2U1FR7hjxQpL6TQmqf8dxEEoB/AV19Um49u9U7Lb8Lx9ujX2MurTd6qnWxuExxatLPoPZukOu/bNKddEjnoUx9cgE339gZGsABVDc/X1FKWO22F8IIz5qjayodvfIYdvtZdcPGWVmkYLXvx","hash":"7r+ZfOVi+2/ZkRFeHwNytk20j6xTZKvJ73m1GCuXsFY=","sign":"ZpZBWLrUT1RZ/s+5ea8o6ckG2dfqqzUkKkQMUjAnVoC3pRzaGW4Q3lV8/rUjDpCdCWPum9juA2tDNBLG+qqL1g==","data":"eyJkZXNjcm...iYWxsIn0="}

...


Валидность и авторство каждой такой записи можно проверить по ее хешу (hash) и подписи (sign), сформированной автором при добавлении документа.

Помимо всего, хранилища типа D и P дают клиентам возможность осуществлять подписку на добавление записей в ленту, используя для этого технологию SSE (Server-Sent Events). Например, следующим запросом можно подписаться на добавление данных в нашу ленту. Клиент откроет соединение и будет ожидать появления серверного события.
http://5.9.123.140:8080/-/D7/listen/e1d8f9c396164dbbb8debf9c0ce08805bcf4bd8d98c2cc462c8bc21c21f27438?aid=Ipf8SOrpxbgYnNMXszFk

Как и для файлов, анонимные пользователи не имеют возможность формировать свои ленты, и добавлять новые элементы в список могут лишь зарегистрированные пользователи (с сертификатом имеющим подпись регистратора).
В заключение, для данного типа хранилища приведены характеристики его колец. Как и у файлов, изначально размеры одной записи сильно ограничены. В первом кольце они составляют всего 16 КБ. Однако этого вполне должно быть достаточно для разработки динамических сервисов таких как посты, блоги, каталоги, плей-листы, различного рода списки и пр.

Публичные списки данных (тип хранилища P)

Данный тип хранилища очень похож на предыдущий за исключением того, что добавлять элементы в один список могут различные пользователи, в том числе анонимные. Такое хранилище позволяет организовать систему комментариев, отзывов, группы, закрытую переписку двух и более пользователей.

Например, http-адресу списка http://test.base.network/chat/ будет соответствовать следующий uid (=SHA256(“test.base/chat/”))
be977147bd78d5a4db7d09aa3a48b3f24c8578c3ea06806d8ff4210f08a2c5a4


curl -i 'http://5.9.123.140:8080/-/P5/data/be977147bd78d5a4db7d09aa3a48b3f24c8578c3ea06806d8ff4210f08a2c5a4'
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Access-Control-Allow-Origin: http://core.base.network
Date: Tue, 25 Aug 2015 11:29:47 GMT
Connection: keep-alive
Transfer-Encoding: chunked
{"pos":"MjAxNTA4MTQwODQ5MzYyOTA=","ver":1,"author":"AMywBHKulTlmRXYZ2P+Bl/naYVh9Gx6MACcKYXWd1ypuPrWnJrd0mu7xgAUxrfeArq43zaM9BeQp+fQty6fHcjU=","hash":"JgRFIFD3AyzsATMNCeAnyxvGgjU7TMmW/ODlXARG8Pk=","sign":"+LG5/taPav00KoRqScABctzjxTlvZIV7nykpqKtxn7AVx6fY4itn7Mtrbisiw5yhf0pC8DLd4akTHYO5C8iWtA==","data":"eyJ0ZXh0IjoidGVzdCAzMzMifQ=="}
{"pos":"MjAxNTA4MTQwODQ5MDI0MjQ=","ver":1,"author":"AMywBHKulTlmRXYZ2P+Bl/naYVh9Gx6MACcKYXWd1ypuPrWnJrd0mu7xgAUxrfeArq43zaM9BeQp+fQty6fHcjU=","hash":"llOP+Sq5BfIJMZKGfqdCJ5ERq8gPITanj9yDH75PAR4=","sign":"EsUH37lW4qF+N/4r0DcgSJKVf4j3UN0uWGHuh6asBbOER539K98o2/DBSCL10YKrA3KCOEHsTE2tsAGf9B/zSQ==","data":"eyJ0ZXh0IjoidGVzdDIyMiJ9"}
{"pos":"MjAxNTA4MTQwODA3Mzg1NTI=","ver":1,"author":"AMywBHKulTlmRXYZ2P+Bl/naYVh9Gx6MACcKYXWd1ypuPrWnJrd0mu7xgAUxrfeArq43zaM9BeQp+fQty6fHcjU=","hash":"XrRlv2sF9ae2GOWehfem6ovLJomZIXtLk27ir+6q+gs=","sign":"aYF7kB0OVc8gvg5U7TrsBB25+tF/HwpCePHkyyWPVvuS5ylgbxJV5Tb06eb/VIaeEK2Y2gMY23hHcRw4SDT1jQ==","data":"eyJ0ZXh0IjoidGVzdCJ9"}
...

Характеристики колец для публичных списков очень похожи на характеристики хранилища типа D:

P-storage

ring

Size of segment GB

Count of segments

TOTAL SIZE OF RING

Max Size of Data Pack, KB

Min count of records

0

2

1

2 GB

2

1.05E+06

1

4

8

32 GB

16

2.10E+06

2

8

64

512 GB

128

4.19E+06

3

16

512

8 TB

1 024

8.39E+06

4

32

4 096

128 TB

8 192

1.68E+07

5

64

32 768

2 PB

65 536

3.36E+07

6

128

262 144

32 PB

524 288

6.71E+07

7

256

2 097 152

512 PB

4 194 304

1.34E+08


Хранилище также дает возможность клиентам подписываться на события добавления записей в определенную ленту через Server-Sent Events.

В заключении можно сказать, что потенциально система не ограничивается только 4 типами хранилищ. Сторонними разработчиками могут быть предложены иные типы хранилищ, имеющие более широкие возможности. Например, такие как полнотекстовые индексы, сервера с раздачей медиа-потоков в реальном времени, хранилища агрегированных данных, статистик, системы для передачи мгновенных сообщений между пользователями без хранения их на диске, IP-телефонию, интернет-радио, IP-телевидение, видеоконференции и другие потоковые протоколы и сервисы.

Как сеть работает для пользователя


Для обычного пользователя работа с системой начинается без установки какого-либо специального ПО. Для этого достаточно лишь использовать обычный браузер. Для ВСЕХ адресов *.base.network/* возвращается статичная html-страница, которая включает в себя код клиентского ядра, написанный на JavaScript.

image

Подобная схема сейчас безусловно имеет центральную точку входа в виде сайта и домена base.network, для входа на который необходимо использовать существующую систему доменных имен. Однако такое допущение в последствии может быть легко устранено путем установки пользователем специального браузерного плагина. Подобный плагин для всех адресов *.base.network будет возвращать статичную страницу с базовым кодом ядра системы, не используя при этом текущую систему доменных имен и не делая дополнительных запросов к внешним центральным ресурсам.

Клиентское ядро содержит в себе начальный список нод (их IP-адреса и порты). При первой загрузке движка, скрипт пытается подключиться к любой ноде из этого списка и получить от нее свежую карту сети, которую он в последствии будет хранить в LocalStorage браузера. Скрипт периодически будет опрашивать ноды из его списка и обновлять информацию о сети. Карта сети содержит в себе список всех нод, их адреса и порты, версию серверного ПО, а также список сегментов обслуживаемых каждой нодой. Теперь на клиенте достаточно информации для того чтобы получить любой документ из сети. Для любого адреса документа мы знаем в каком сегменте он находится и какими нодами этот сегмент обслуживается. Для более быстрой загрузки данных из сети, клиент выбирает ближайшую к нему ноду. Подлинность скачанных данных клиент может проверить по хешу и сверив подпись автора, используя его открытый ключ.

При первом входе в сеть для пользователя генерируется анонимный сертификат, содержащий закрытый и открытый ключ. Этот сертификат хранится в LocalStorage браузера в пространстве имен домена core.base.network. Скрипты других доменов не имеют прямого доступа к этому пространству и не могут получить информацию о закрытом ключе.

base.network API

Все внешние http-запросы осуществляются исключительно из фрейма клиентского ядра — core.base.network. Движок сайта может работать с системой только через этот фрейм, используя для этого специальный API. API предоставляет сайтовому движку возможность заливать в сеть файлы, запостить данные, получать ленты данных, подписаться на событие добавления данных в ленту.

base.netwrok client side

В момент публикации ядро подписывает присылаемые сайтовым движком данные, используя для этого закрытый ключ, а имея на руках карту сети, осуществляет непосредственно POST-запрос на необходимые ноды.

Регистрация


Во время первого посещения пользователем любого сайта сети, ядро автоматически генерирует для него анонимный сертификат. Анонимный сертификат имеет ряд ограничений в работе с сетью. Анонимные пользователи не могут заливать в сеть файлы, зарегистрировать свой персональный домен, сайт, а также не могут оставлять комментарии к некоторым топикам, имеющие соответствующие ограничения в правах доступа.

base.network core iframe

Регистрация сертификата происходит одновременно с регистрацией персонального домена, закрепленного этим сертификатом. Сейчас понятия домена и публичного сертификата неразрывно связаны. Во время регистрации пользователь в шифрованном виде отправляет регистратору свой публичный ключ и имя домена, к которому необходимо будет привязать регистрируемый сертификат. Регистратор добавляет свою подпись к публичному ключу пользователя и размещает данные о сформированном сертификате и о владельце домена в хранилище доменных имен (storage N), где оно будет доступно остальным пользователям.

base.network registration

Стоит сказать немного о том, кто такой Регистратор. Регистратор — это корневой сертификат, которому все доверяют. Публичный ключ регистратора вшит непосредственно в клиентское и серверное ПО. Сертификаты всех зарегистрированных пользователей включают его подпись. Регистратор подписывает информацию о доменах и их владельцах. Представляет собой некий ограничитель от беспорядочных регистраций доменов. Является лишь регистратором доменов и не имеет технической возможности менять или как-то контролировать информацию сайтов. Ничего не знает о физическом владельце сертификата, его IP-адресе.

Сейчас регистратор является некой центральной фигурой в организации сети, что несколько противоречит духу децентрализованного устройства системы. Впоследствии в планах регистрацию и передачу доменов сделать полностью децентрализованной. Существующая схема регистрации доменов выбрана исключительно из-за скорости работы сети. Пользователю нет необходимости скачивать тяжелую базу всех доменных имен (как это сделано например в неймкоин), а лишь достаточно по одной записи проверить подпись регистратора. К тому же текущая схема регистрации жестко не ограничивает количество регистраций, что обеспечивает быстрых вход участников и дальнейшее распространение популярности системы.

Итак, сертификат является зарегистрированным, если он имеет подпись регистратора. Владельцем домена является лицо, которое имеет закрытый ключ от публичного сертификата. По имеющемуся сертификату всегда можно получить информацию о его владельце, включая имя его персонального домена. И наоборот. По названию домена всегда можно получить публичный сертификат его владельца. Информация о домене и сертификате подписывается регистратором и ее всегда можно получить из N-хранилища и проверить на подлинность.

В данный момент регистрация происходит по инвайту. Инвайт-код, может получить любой человек, имеющий gmail-аккаунт. На один gmail-аккаунт можно получить один инвайт. Подобная система инвайтов введена исключительно для того чтобы на первоначальном этапе работы системы хоть как-то ограничить бесконтрольные регистрации доменов. Введенные пользователем gmail-аккаунты нигде не сохраняются и нужны лишь непосредственно для отправки инвайт-кода. Для соблюдения анонимности регистратор никак не связывает инвайт-код с информацией о домене и владельце сертификата, а лишь помечает, что данный код уже был использован ранее.

Знакомство. Демо


Для каждого вновь зарегистрированного домена система устанавливает сайт с тестовым движком. На данный момент это, собственно, единственный сайтовый движок существующий в системе. Есть надежда, что с ростом популярности сети сторонними разработчиками будут конструироваться разнообразные движки.

Итак, после регистрации пользователем своего домена, он может зайти на свой персональный сайт, сменить настройки, указать тему, дизайн, потенциально установить сторонний движок, создавать и редактировать разделы сайта. Пример подобного сайта, а также демонстрация возможностей системы предлагаются по примеру тестового сайта: http://test.base.network/.

base.network demo site

В качестве примера текущий движок позволяет добавлять такие сервисы как:
  • блоги
  • фотоальбомы
  • музыкальные и видео плейлисты

Для каждого раздела можно указать свой заголовок, описание, фоновую картинку, иконку. Дополнительно можно задать минимальные права доступа на добавление дочерних элементов для текущего раздела.

base.network edit page

Сайт в соответствии с последними веяниями имеет адаптивный дизайн и вполне корректно отображается и редактируется на мобильных устройствах.

base.network mobile

Просьба, уважаемое сообщество, не сильно критиковать внешний вид сайта и текущий сайтовый движок, поскольку создавался он исключительно в качестве демонстрации возможностей системы и пока, безусловно, имеет ряд некоторых проблем с версткой и юзабилити. В не столь отдаленных планах находится доработка данного движка и доведение до ума функционала сайта.

Возможно, некоторым разработчикам будет интересно поучаствовать в данном проекте — привнести новые возможности, расширить функционал, добавить фичи или улучшить дизайн существующего движка. Велком! Буду весьма признателен любой помощи.

Инфраструктура проекта


Установка серверного ПО


Для поддержки проекта и развития сети любой желающий может предоставить свои серверные ресурсы. Для этого на своем сервере необходимо установить и запустить серверную ноду.

  1. Перед установкой ноды необходимо убедиться, что на сервере уже установлена платформа Node.js или установить ее в соответствии с инструкцией
  2. Скачать репозиторий с github

    git clone https://github.com/basenetwork/base.server-node
    

  3. Установить модуль sqlite3 для Node.js

    cd base.server-node && npm install sqlite3 --build-from-source && cd ..
    

  4. запустить ноду
    nohup base.server-node/base.node.js --size=32  >/var/log/base.node.log &
    

В качестве параметра size необходимо указать свободный объем на диске (в ГБ), который вы готовы выделить под ноду.
Для работы ноды необходимо выделить внешний IP адрес и свободный порт. По умолчанию система попытается автоматически использовать один из внешних IP адресов в списке network interfaces операционной системы. Возможно вручную указать IP-адрес и порт, используя параметры запуска --host и --port:

nohup base.server-node/base.node.js --size=32 --host=41.34.55.66 --port=2222  >/var/log/base.node.log &

Проверить работоспособность ноды можно, сделав http-запрос к веб-серверу:

curl http://41.34.55.66:2222/-/about

Исходный код


Со всеми исходниками проекта можно ознакомится на GitHub — github.com/basenetwork. Аккаунт содержит несколько репозиториев:
  • base.server-node
    Собственно, сама серверная нода. Репозиторий написан на Node.js. Инструкция по установке base-ноды на свой сервер была представлена выше.
  • client-js
    Клиентское ядро. Проект написан на JavaScript. Включает в себя базовые функции по работе с системой. Это непосредственно тот самый код, который подгружается при открытии любого сайта системы — http://base.network/core.js Сайтовым движкам для работы с сетью ядро предоставляет специальный API — baseAPI
  • site-engine-js
    Сайтовый движок. Написан на JavaScript с использованием библиотеки React.js. В качестве фреймворка для верстки и стилей использует Bootstrap v3. Это собственно тот код, который организует структуру сайтов, их внешнее представление. Реализует систему редактирования контента для владельцев сайтов. В данный момент в качестве теста движком реализованы такие сервисы как блоги, фотоальбомы и списки медиа, а также систему комментариев к постам и фотографиям. Движок не работает напрямую с сетью, а использует для этого специально предоставленный ядром API.
  • static-builder
    Специально разработанный билдер статических файлов. Билдер написан на Node.js. Работа билдера заключается в компиляции всех статических файлов в один единственный javascript-файл. Необходим для компиляции ядра и движка сайта. Скомпилированный файл включает в себя полностью весь функционал для работы с сайтом: программный код, логику, формы, стили, шрифты и иконки, используемые в оформлении сайта. Полученный файл выкладывается в сеть и подгружается пользователем в качестве движка один единственный раз, при посещении сайта.
    Билдер в css-файлах стилей непосредственно вместо ссылок на шрифты и иконки вставляет закодированное в base64 их содержимое. А уже полученные css-файлы, а также скомпилированные js и jsx объединяет в один единственный js-файл.

К сожалению, еще пока не создано подробной документации по проекту. Нет детального описания структуры репозиториев и протоколов обмена. Функционал не покрыт тестами (исходный код для ознакомления представлен в весьма сыром виде). Надеюсь, что ситуация будет исправлена в ближайшем времени.

Планы


  • Доработать сайтовый движок. Переработать дизайн и повысить юзабилити существующего функционала. Добавить ряд полезных функций, чтобы по функционалу не уступать современным социальным сетям.
  • Локализовать веб-интерфейс для популярных языков.
  • Добавить сервис личных сообщений с обеспечением полной анонимности. Сервис помимо шифрования непосредственно содержимого сообщений будет скрывать сам факт переписки двух лиц, чего сложно добиться с использованием централизованной системы. Реализация такого сервиса требует лишь небольших доработок сайтового движка на стороне клиента. Серверная часть уже сейчас вполне готова для воплощения подобного функционала.
  • Переписать серверное ПО на языке GO, поскольку скорость работы с криптографического алгоритмами на Node.js оставляет желать лучшего.
  • Покрыть весь функционал тестами.
  • Составить подробную документацию к проекту, API и протоколам общения клиент-сервер.
  • Создать своего рода Store сайтовых движков, сервисов и плагинов, а также стилей и дизайн-тем.

Поддержка проекта


Как вы наверное уже заметили, проект пока что находится в стадии становления и ему крайне требуется ваша помощь. Помочь проекту может каждый, кому небезразличны принципы свободы распространения информации в современном мире. Ваши советы, отзывы и предложения по улучшению проекта уже являются ощутимой помощью.

Кроме того, если у вас в распоряжении имеются сервера, либо на ваших персональных машинах есть выделенный канал, вы можете предоставить небольшую часть своих машинных ресурсов для развития сети. С инструкцией по установке серверной ноды вы можете ознакомится выше или на github. Также будут крайне важны ваши отзывы о работе установленного серверного ПО.
Веб-разработчики, владеющие Node.js, могут предложить свои доработки и советы по оптимизации серверного ПО.

Веб-дизайнеры, HTML-верстальщики, программисты, имеющие опыт работы на JavaScript, могут принять участие в развитии сайтового движка и его отдельных сервисов. Приветствуется также и разработка собственного сайтового движка с нуля.

Если у вас нет собственных серверных ресурсов и возможности напрямую поучаствовать в разработке проекта, вы можете проявить активность в соц сетях: лайки и репосты никогда не бывают лишними! Также помочь проекту можно своими финансовыми средствами.

Спасибо за поддержку!

Заключение


И в заключение немного лирики. Цензура в современном мире — это большая глупость. Любые идеи, неважно технические или гуманитарные, развиваются одинаково  —  они растут одна из другой, бесконечной цепочкой. Идея имеет право быть высказанной и услышанной в её оригинальном виде, без искажений и цензуры. Однако в современных реалиях рукописи вполне неплохо горят и написанное пером нещадно вырубается топорами. И, как ни печально осознавать это, но задуманный как рупор свободы, Интернет в руках правительств стран и государств превратился в инструмент всеохватывающего контроля. Причем контроля настолько неприкрытого, что все чаще продвинутая часть общества задается вопросом: а есть ли свобода слова в интернете? Можем ли мы с его помощью открыто заявлять о чем-то действительно важном? Видим ли на его просторах всю палитру разнохарактерных независимых мнений?

Меня зовут Денис Глазков, я представляю вашему вниманию свой проект — распределенную сеть base.network — проект, который при достаточной поддержке и развитии мог бы изменить ситуацию в иную сторону — предоставить нецензурируемую среду общения и распространения информации.

+25
20.2k 141
Comments 43
Top of the day