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

image

Мультихеш


Base58: QmcXx5mKDQAc7tCWLq84Hn7XFxWfBdZpvogJk3tNXQRFiv 
HEX: 12 20 D2E8A669F85E864B5C285CAB18DE72CF8927DC1643516373FEFF871A69F2A127

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

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

Клиент


ipfs daemon

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

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

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

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

Блок


Выше я говорил что самостоятельной единицей в сети является блок. Если взять со страницы http://127.0.0.1:5001/webui#objects мультихеш блока файла и добавить к нему 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 и Base58 online декодер. Файлы размером меньше 262158 байт хранятся в сети одним блоком. Формат этого блока я так и не выяснил.

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

Шлюз


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

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

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

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


Экспериментируя с IPFS WebSeed и 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

И в строки:

      "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 не умеет работать с магнит-ссылкам и да и не описан URN который содержит в себе используемый в сети мультихеш.

Я предлагаю такой: 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. И более чётко обозначить IPFS мультихеш.

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


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

магнит-ссылка он же на GitHub

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

Источники:

Поделиться с друзьями
-->

Комментарии (32)


  1. Ajex
    09.11.2016 10:43

    Меня, как-то очень заинтересовал этот проект, было много идей, но смущало то, что попавшую в сеть информацию невозможно удалить, даже при всем своем большом желании. А это сильно напрягало.
    Или я просто не разобрался со всем функционалом и удаление/редактирование своих файлов возможно?


    1. xuexi
      09.11.2016 10:54

      IPFS это content addressed storage (cas), то есть "редактирование" в принципе невозможно. Удаление это другой вопрос, в принципе, удаление возможно, так как кэш блоков данных иногда очищается на каждом узле, но если кто-то успел за-pin-ить ваш файл, то уже невозможно.


    1. dartraiden
      09.11.2016 12:57
      +1

      Все, что попало в интернет остаётся там навсегда :)


  1. Vindicar
    09.11.2016 11:09
    +6

    Прошу прощения за глупый вопрос, но… что в этой ФС межпланетного?


    1. xuexi
      09.11.2016 12:06
      +5

      Ну, например, скорость отклика центрального гейтвея gateway.ipfs.io, видимо, сервера перегружены, ощущение, что ждёшь файл с сервера на Луне или на Марсе.


      1. ivan386
        09.11.2016 16:18

        Если нужного блока нет в кеше шлюза ему приходится его запрашивать в сети это даёт задержку. Так-же клиент не доверяет судя по всему даже своему кешу и перепроверяет хеш каждого блока перед передачей и чем глубже дерево блоков тем больше блоков перепроверять. Клиент плохо адаптирован к рандомному запросу частей файла. Это даёт большую нагрузку на сервера и как они справляются я не представляю.

        Я хотел картиночку наверху статьи захостить на их сервисе Ipfs.pics. Тот мне показал красного рака и сказал что сервера перегружены а это было ночью.

        В общем клиент ещё надо допиливать чтоб работал быстрее и качественнее.


        1. xuexi
          09.11.2016 16:52

          Это всё понятно. Но пока нет возможности включить свой шлюз в список публичных и доверенных, чтобы он мог принять на себя посильную часть нагрузки. Всем нужен только https://ipfs.io, а сами они не хотят делиться нагрузкой.


          1. ivan386
            09.11.2016 17:52

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

            Но никто не запрещает выставить свой шлюз наружу.


            1. xuexi
              09.11.2016 20:31

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


              1. ivan386
                09.11.2016 20:48

                Я думаю шлюз в интернет больше для демонстрации работы сети а не для полноценного пользования IPFS сетью. Для полноценного использования на обоих концах должен быть установлен клиент со своим локальным шлюзом. Иначе это просто бесплатный хостинг с особенностями который может быть прикрыт РКН.


    1. Halt
      09.11.2016 13:39
      +4

      Я грешным делом надеялся прочитать про систему хранения, построенную на базе deep space network и протоколов связи, рассчитанных на большие задержки.


      1. Fedcomp
        09.11.2016 20:47

        Не вы один )


    1. mr_tron
      09.11.2016 14:08

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


    1. ivan386
      09.11.2016 14:23

      Независимость от источника. Даные могут быть получены с любого узла имеющего нужные блоки.


    1. redmanmale
      09.11.2016 17:23

      Это название — дань памяти идеям Дж. К. Р. Ликлайдера о «межгалактическом» Интернете.


  1. am-amotion-city
    09.11.2016 14:08

    Это просто блокчейн же, нет?


    1. ivan386
      09.11.2016 14:53

      Нет с блокчейном тут мало общего. В блокчейне всё жёстко связанно хешами и подписями и нужно хранить его полностью. Здесь наоборот каждый блок не зависим и из них составляется разветвлённая структура составляющая файл или каталог. Для поиска источника блока в сети используется DHT. Подпись позволяет првязать блок к хешу публичного ключа чтоб появилась возможность публиковать изменения. В этом есть схожесть с .onion сайтами.


      1. am-amotion-city
        09.11.2016 15:24

        А, да, вот теперь улеглось. Спасибо.


  1. ton1
    09.11.2016 14:08

    И как это использовать?
    zeronet например завершенный продукт, все очевидно и юзабельно. WebTorrent и CacheP2P интегрируются в броузер и уже работают. А это?
    Или применение этой системе найдется только когда станут массовыми межпланетные перелеты? :)


    1. ivan386
      09.11.2016 14:33

      Так-же как и BitTorrent. Устанавливаем клиент. Шарим нужные файлы. Передаём мультихеш или ссылку другу или публикуем в интернете. Теоритически можно сделать идекс файлов сети на каком нибудь узле и тогда будет возможен поиск.


      1. dmitryredkin
        09.11.2016 15:06

        eMule?


        1. ivan386
          09.11.2016 15:25

          Я давно не заглядывал в сеть Edonkey2000 в ней самостоятельной еденицей всё-таки считается файл а не блок. Сделали ли в ней возможность публикации каталога не знаю.


        1. ivan386
          09.11.2016 15:31

          Кстати в ed2k ссылке есть возможность вставить WebSeed так что IPFS может послужить дополнитеным источником и для этой сети.


      1. ton1
        09.11.2016 16:23

        И чем оно лучше торрента? Про ссылки на файлы а не абстрактный инфохеш уже упомянули, с осликом сравнив.
        Реквестирую рассказ про ipns и версии файлов.


        1. ivan386
          09.11.2016 16:47

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

          Есть уже эксперементальный загрузчик TAR файлов в сеть который делит tar на файлы. Файлы из архива при этом становятся доступны из сети отдельно но tar можно собрать по хэшу может собрать только та же утилита.

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


        1. ivan386
          09.11.2016 17:18

          Про IPNS

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

          Версии файлов.

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

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


        1. SEVENID
          09.11.2016 17:25

          Решается проблема вида «Загружено: 92.8%. Времени осталось: ?. Сидов: 0.»
          Если я всё правильно понял, даже если полностью файла найти не удаётся, ipfs ищет любые кусочки, ассоциированные с ним, скачивает их и собирает требуемый файл (уже как bittorrent). Что может быть очень полезно при изоляции сегмента сети.


          1. GamePad64
            09.11.2016 20:16

            В bittorrent оно так же решено через DHT.


            1. ivan386
              09.11.2016 20:41

              BitTorrent DHT работает аналогично трекеру. Ты ему хеш он тебе источники. Была попытка создавать многофайловые торренты в которых для каждого файла был дополнительный ифохеш но проблема остаётся в том что инфохеш зависит не только от содержимого файла но и от его имени. То есть если этот же файл будет в другой раздаче под другим именем его не найти. Ну до уровня файла ещё можно придумать костыли так чтобы сеть их поддерживала а до уровня блока уже надо делать глобальное обновление протокола.

              Shareaza в создаваемые ей торренты добавляет sha1, ed2k, tth хеши для каждого файла что позволяет их скачать из других сетей. Но умеет качать торрент из других p2p сетей только она и то только для однофайлового торрента.


              1. sim2q
                10.11.2016 12:57

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

                Вот это ужасно раздражает. Например у меня все хранится как проект_-_альбом_год/проект_-_название_трека, тогда как частенько бывает альбом/название_трэка,


  1. xuexi
    09.11.2016 16:53

    Кстати, кому интересна тема IPFS, могут ознакомиться с моей статьёй и проектом https://habrahabr.ru/post/310554/


    1. ivan386
      09.11.2016 17:21

      Ваша статья уже есть в списке источников.