- PVSM.RU - https://www.pvsm.ru -

Межпланетная файловая система IPFS

Это новая децентрализованная сеть обмена файлами. Отличие от других аналогичных сетей в том что самостоятельной единицей передаваемой в сети является блок. Блок может содержать как часть файла так и ссылки на другие блоки. Из блоков выстраивается направленный ациклический граф [1] из которого в дальнейшем собирается файл или каталог. Такая система позволяет более гибко подойти к хранению и передаче данных в сети. Недостатком такого подхода является то что всё что загружается в сеть режется на блоки и складывается в отдельный каталог на вашем диске. Поиск по имени файла или каталога в IPFS отсутствует также как и в сети BitTorrent.

image [2]

Мультихеш

Base58: QmcXx5mKDQAc7tCWLq84Hn7XFxWfBdZpvogJk3tNXQRFiv 
HEX: 12 20 D2E8A669F85E864B5C285CAB18DE72CF8927DC1643516373FEFF871A69F2A127

Идентификатором в этой децентрализованной сети служит обёрнутый в мультихеш [3] sha128 от корневого блока файла или каталога. Мультихеш состоит из трёх частей: ID хеш функции, размер хеша в байтах, хеш. Для хранения ID и размера используется сейчас по одному байту но значения их не может быть больше или равно 128 до тех пор пока они не определятся с форматом unsigned-varint [4] коими они обозначены. Мультихеш в ссылках представлен в кодировке Base58 bitcoin [5].

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

Клиент

ipfs daemon

В рабочем состоянии для сети IPFS существует мультиплатформенный клиент [6] написанный GO. Его можно как скачать [7] так и скомпилировать [8] самостоятельно.

Команда ipfs daemon запускает клиент который предоставляет web интерфейс. Войти на него можно по адресу по умолчанию http://127.0.0.1:5001/webui [9].

Добавить файл и каталог в сеть можно командной ipfs add [путь к файлу] или ipfs add -r [путь к каталогу]. Также файлы можно добавить через webui на странице http://127.0.0.1:5001/webui#files [10].

После добавления файла или каталога будет выдан его мультихеш. Добавленные таким способом обьекты автоматически прицепляются то есть они не будут удалены если выполнить команду ipfs repo gc. Также они становятся доступны во всей сети по этим мультихешам. Если открыть страницу web интерфейса http://127.0.0.1:5001/webui#objects [11] можно увидеть как в сети представлены файлы введя их мультихеш в строку поиска. На ней показывается содержимое блока.

Блок

Выше я говорил что самостоятельной единицей в сети является блок. Если взять со страницы http://127.0.0.1:5001/webui#objects [11] мультихеш блока файла и добавить к нему http://127.0.0.1:8080/ipfs/ то сеть отдаст часть файла или каталога соответствующую блоку с этим мультихешем.

Для прямой работы с raw блоками у ipfs также имеются команды:

 ipfs block get <key>    - Получить raw IPFS блок.
 ipfs block put <data>   - Сохранить ввод как IPFS блок.
 ipfs block rm <hash>... - Удалить IPFS блок(и).
 ipfs block stat <key>   - Вывести информацию о raw IPFS блоке.

При помощи ipfs block get [мультихеш] я выяснил чему соответствует мультихеш от тестового файла который я только что загрузил командой ipfs add [полный путь к файлу] используя RHash [12] и Base58 online декодер [13]. Файлы размером меньше 262158 байт хранятся в сети одним блоком. Формат этого блока я так и не выяснил.

Интересно что webui храниться в децентрализованной сети и часть кода самого клиента также храниться в ней. Код подгружается из сети автоматически перед компиляцией клиента. Зачем это сделано не знаю. Это немного затрудняет чтение исходников.

Шлюз

У сети IPFS есть выход в обычную сеть. То есть через сайт ipfs.io можно получить доступ к любому фалу или каталогу доступному в сети IPFS. Для этого достаточно знать его мультихеш и добавить его к адресу http://ipfs.io/ipfs/[мультихеш].

Некоторые клиенты децентрализованных сетей научились тянуть данные по http(s). Сайт ipfs.io [14] можно использовать как WebSeed. А если у вас будут установлены одновременно IPFS и другой клиент поддерживающий WebSeed то второй сможет использовать IPFS локально через http://127.0.0.1:8080/ipfs/[мультихеш].

В этой статье "Почему Интернету нужен IPFS, пока ещё не поздно [15]" в браузеры предлагается добавить расширение которое будет менять адрес ipfs.io на 127.0.0.1:8080. Это необходимо для просмотра в браузере контента из IPFS через локальный клиент.

Эксперименты с IPFS и BitTorrent

Экспериментируя с IPFS WebSeed [16] и qBittorent я заметил что локальный IPFS очень медленно отдаёт данные запрашиваемые в случайном порядке. Только когда я включил последовательное скачивание скорость возросла до 1МБ/c. И этом все блоки раздачи находятся в локальном хранилище. Также IPFS сильно грузит процессор.

Для BitTorrent'а IPFS клиент может послужить хорошим дедупликатором. Он сможет найти копии файлов по IPFS мультихешу каталога или файла. Для этого достаточно добавить его как WebSeed в торрент.

IPFS WebSeed

Для того чтобы раздать используя IPFS WebSeed содержимое каталога перед загрузкой в IPFS его необходимо перенести в другой пустой каталог и его уже добавить на загрузку командой ipfs add -r [путь к каталогу]. Доступ к исходному каталогу будет по ссылке http://ipfs.io/ipfs/[мультихеш]/[Имя исходного каталога] или http://127.0.0.1:8080/ipfs/[мультихеш]/[Имя исходного каталога].

BitTorrent клиенты автоматически добавляют к WebSeed ссылке полный путь к файлу из торрента в случае если это торрент каталога. Достаточно как WebSeed добавить ссылку вида http://ipfs.io/ipfs/[мультихеш] или http://127.0.0.1:8080/ipfs/[мультихеш].

Для однофайлового торрента достаточно просто добавить файл командой ipfs add [путь к файлу] и WebSeed ссылки на него будут того же вида http://ipfs.io/ipfs/[мультихеш] или http://127.0.0.1:8080/ipfs/[мультихеш].

WebTorrent и IPFS WebSeed

WebTorrent сможет работать только с локальным шлюзом IPFS и то только после настройки так как шлюз должен дать разрешение для WebTorrent использовать HTTP заголовок Range.

Для этого необходимо открыть http://127.0.0.1:5001/webui#config [17]

И в строки:

      "Access-Control-Allow-Headers": [
        "X-Requested-With"
      ],

добавить «Range»:

      "Access-Control-Allow-Headers": [
        "X-Requested-With",
        "Range"
      ],

после чего сохранить и перезапустить IPFS

Межпланетная система имён

Также у каждого клиента есть возможность привязать объект к мультихешу своего публичного ключа. На сайте ipfs.io можно получить доступ к этому объекту добавив мультихеш публичного ключа к адресу http://ipfs.io/ipns/. Для того чтобы привязать или получить объект по мультихешу публичного ключа существуют команды:

  ipfs name publish <ipfs-path> - Публиковать объект в IPNS.
  ipfs name resolve [<name>]    - Взять значение опубликованного по IPNS имени.

Сочетание бесплатного DNS, http://ipfs.io/ipns/[мультихеш публичного ключа] и IPFS клиента позволяет раздавать с домашнего сервера небольшой статичный сайт даже находясь за NAT.

Межпланетная файловая система и магнит

Сейчас IPFS не умеет работать с магнит-ссылкам [18] и да и не описан URN [19] который содержит в себе используемый в сети мультихеш.

Я предлагаю такой: urn:ipfs:[Base58 bitcoin encoded IPFS multihash]

В магнит ссылке он соответственно будет выглядеть так:

magnet:?xt=urn:ipfs:[Base58 bitcoin encoded IPFS multihash]

Пример:

magnet:?xt=urn:ipfs:QmcXx5mKDQAc7tCWLq84Hn7XFxWfBdZpvogJk3tNXQRFiv

Написав небольшой скрипт можно научить работать IPFS с магнитами или другие децентрализованные клиенты использовать IPFS как WebSeed.

Я думаю использование магнит-ссылки позволит отвязаться от сайта ipfs.io с которым может произойти та же история что и с доменом shareaza [20]. И более чётко обозначить IPFS мультихеш.

Немного не по теме

Я тут для магнитов нарисовал(написал на самом деле) логотип для безвозмездного использования. Хочу его представить чтоб он стал узнаваемым символом магнит-ссылки ну и использовался для её обозначения. Может тогда я смогу откатить отмену моей правки в статье по магнит-ссылкам и вернуть логотип в статью.

Автор: ivan386

Источник [21]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/detsentralizovanny-e-seti/207879

Ссылки в тексте:

[1] направленный ациклический граф: https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D1%86%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B3%D1%80%D0%B0%D1%84

[2] Image: https://habrahabr.ru/post/314768/

[3] мультихеш: https://github.com/multiformats/multihash

[4] unsigned-varint: https://github.com/multiformats/unsigned-varint

[5] Base58 bitcoin: https://ru.wikipedia.org/wiki/Base58

[6] мультиплатформенный клиент: https://github.com/ipfs/go-ipfs

[7] скачать: https://ipfs.io/ipns/dist.ipfs.io/#go-ipfs

[8] скомпилировать: https://github.com/ipfs/go-ipfs#build-from-source

[9] http://127.0.0.1:5001/webui: http://127.0.0.1:5001/webui

[10] http://127.0.0.1:5001/webui#files: http://127.0.0.1:5001/webui#files

[11] http://127.0.0.1:5001/webui#objects: http://127.0.0.1:5001/webui#objects

[12] RHash: http://rhash.anz.ru/

[13] Base58 online декодер: http://lenschulwitz.com/base58

[14] ipfs.io: https://ipfs.io

[15] Почему Интернету нужен IPFS, пока ещё не поздно: https://habrahabr.ru/post/268275/

[16] WebSeed: https://ru.wikipedia.org/wiki/BitTorrent_(%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB)#Web-.D1.81.D0.B8.D0.B4.D1.8B

[17] http://127.0.0.1:5001/webui#config: http://127.0.0.1:5001/webui#config

[18] магнит-ссылкам: https://ru.wikipedia.org/wiki/Magnet-%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0

[19] URN: https://ru.wikipedia.org/wiki/URN

[20] доменом shareaza: https://habrahabr.ru/post/21119/

[21] Источник: https://habrahabr.ru/post/314768/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best