Немногие слышали про IPFS, ещё более немногие добрались до детального изучения. И совсем уж единицы погрузились в проект поглубже.




Если вкратце, IPFS это химера, созданная из технологий, лежащих в основе git и bittorrent, с одной особенностью — адресация объектов по содержимому (CAS).


Любой объект, файл или пользовательские данные хэшируются, и получившийся хэш становится адресом этого файла в системе IPFS. Далее, этот контент могут запросить другие узлы сети, и он расползётся по планете, и в идеале, никогда больше не исчезнет, будучи доступным по хэшу. Из этого свойства так же вытекает иммутабельность объектов в системе, ведь любое изменение содержимого создаёт новый адрес-хэш в сети.


Типичная ссылка на объект: http://ipfs.io/ipfs/QmPQGujZ4K1xPNNcCjBWMoSuYrcJae43dukJP51mbfftDK


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


Файловая система


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


Возможность хорошая, она дала жизнь следующей возможности — хостинг статических сайтов непосредственно в сети ipfs, вот так https://ipfs.io/ipns/i.ocsf.in/.


При всём при этом из документации ipfs понятно, что максимум, что может сделать пользователь с этой виртуальной файловой системой — примонтировать содержимое базы данных объектов при старте локального демона. Возможно, этого достаточно для каких-то задач. Но для более-менее полноценной работы с ФС нужно больше возможностей.


Конечно, для полноценной виртуализации файловой системы нам бы потребовалось разработать свой драйвер для fuse, или для dokanY под Windows, это увлекательный процесс, но для начала можно сделать что-нибудь попроще, чтобы оценить возможности сети и API файловой системы IPFS.


А какой механизм может работать примерно во всех экосистемах? Веб-протокол. Например, WebDAV. В Windows есть встроенный клиент, в linux есть в основных графических файловых менеджерах и в консоли через cadaver.


Будем строить зиккурат. На golang. А потом, возможно, на node.js.


Имплементация


Из коробки в golang доступен webdav-сервис с базовой функциональностью и возможностью построить свою имплементацию файловой системы. Интерфейс почти совпадает с интерфейсом файловой системы в стандартном пакете os.


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


WebDAV так же поддерживает систему блокировок файлов. Она применяется для совместного доступа к ФС многих пользователей. Пока остаётся нерешённой проблема доступа к постоянно изменяющемуся корневому каталогу, который меняется при каждом изменении в ФС.


WebDAV-middleware реализован в виде демона, который запускается рядом с go-ipfs-демоном и взаимодействует с IPFS по http-api, что накладывает ограничения на быстродействие. Поэтому в дальнейшем имеет смысл работать с сетью ipfs непосредственно вкомпилировав свои модули в go-ipfs-демон.


Так же у встроенной в IPFS структуры объектов виртуальной ФС не хватает возможностей по хранению пользовательских аттрибутов файлов и каталогов. Костыль придумать всегда можно, но это не путь для продуктов, которые будут хоть немного круче данного исследовательского проекта.


Выводы


В процессе разработки были выявлены некоторые недостатки в поддержке WebDAV в некоторых ОС, например, такие. Также сам WebDAV при работе с большим количеством мелких файлов работает не очень быстро. А в сети IPFS есть проблемы с большими файлами, загрузка их в систему занимает относительно много времени. Для более широкого применения системы IPFS наравне с WebDAV необходимы и другие драйверы для доступа к файловой системе внутри IPFS. Более того, в последних версиях в API появились функции мутабельной файловой системы, которая пока недокументирована, но возможно даст необходимое быстродействие и удобство работы.


Ссылки


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

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


  1. xuexi
    20.09.2016 19:19

    За время, пока статья ожидала приглашения, удалось реализовать.систему, локов и аттрибутов файлов, и почти пройти тест webdav litmus.


  1. dordyan
    20.09.2016 23:38

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


    1. xuexi
      20.09.2016 23:46
      +1

      Начальная информация есть в статье ув. Мицгола https://habrahabr.ru/post/268275/


      Более подробная информация будет завязана на конкретную задачу, вот Вас что интересует?


  1. ivlis
    20.09.2016 23:45

    А что будет, когда два файла имеют одинаковый хеш?


    1. xuexi
      20.09.2016 23:49
      +1

      Значит это либо одинаковые файлы, либо коллизия, но в системе мультихэшей IPFS они сводятся к достаточно низкой вероятности.


      1. xuexi
        20.09.2016 23:55

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


        1. ivlis
          21.09.2016 00:15

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


          1. xuexi
            21.09.2016 00:21

            Такой вопрос возник не только у вас:
            https://github.com/ipfs/faq/issues/24


          1. Mithgol
            21.09.2016 13:14

            Вкратц?: н?тъ, тамъ SHA-2.


  1. blueboar2
    21.09.2016 12:36

    Я правильно понимаю, что просто сохранить свои файлы в сети не получится? Вот, например, у меня есть 10 файлов, которые мне очень дороги. Я их сохранил и опубликовал в сеть. Но никто же не знает что они у меня есть, соответственно никто и не скачает, и они так и останутся висеть у меня? Не буду ж я всем орать «ребят, у меня тут 10 файлов, заберите кто может...».

    То есть, не получится, скажем выделить 10 гигов места, чтобы хранить данные других, а за это чтобы хранили 10 гигов моих?


    1. xuexi
      21.09.2016 12:43

      Есть два варианта сохранения данных в сети, "прикрепление" и кэширование. Если вы запросите свои данные через другие узлы, то они там закэшируются и в принципе, будут лежать довольно долго, пока не будет выполнена сборка мусора, то есть очистка локальной БД узла от незакрепленных данных.
      А закрепление (pin) спасает от такой очистки. То есть, вы можете попросить друга закрепить 10 хэшей, закат солнца вручную.


      И в данной версии ПО IPFS (0.4.4) автоматического прикрепления нет. Отчасти эту проблему может решать продукт вроде моего webdav-сервиса, который будет закреплять пользовательские файлы на узлах автоматически. Но это стороннее ПО, с понятными перспективами.


      Сами разработчики IPFS придумали Filecoin, систему которая будет способствовать тому, чтобы люди хранили чужие данные за копеечку, как сейчас Ethereum позволяет запускать чужой код на своей машине за gas. Но Filecoin пока нет в паблике.


    1. ton1
      21.09.2016 15:07

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

      ipfs — пока видится как замена торрентам и статичному контенту на сайтах, но и то и другое пока не спешат вымирать.


      1. blueboar2
        22.09.2016 06:48

        А можно ссылки на страницы где описано как в этих FreeNet и SafeNet кинуть файлы в сеть и забрать чужие?


  1. blueboar2
    21.09.2016 12:48

    Ну значит пока эта программа для меня бесполезна. Пока не будет автоматического прикрепления.


    1. xuexi
      21.09.2016 12:56

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


      1. blueboar2
        21.09.2016 13:02

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


        1. xuexi
          21.09.2016 14:25

          А какие у вас кейсы?


          1. blueboar2
            22.09.2016 06:45

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


  1. xuexi
    21.09.2016 15:56

    И вот буквально сегодня (2016-09-21) вышла новая версия IPFS демона с оптимизациями в плане памяти и сетевого протокола https://ipfs.io/blog/19-ipfs-0-4-3-released/