Работа в IPFS с человеческим лицом

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


Ссылки


AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 22

    0

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

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

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


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

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

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

            0

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

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

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

                  0
                  Вкратцѣ: нѣтъ, тамъ SHA-2.
                    0
                    По русски пожалуйста.
                    • UFO just landed and posted this here
            0
            Я правильно понимаю, что просто сохранить свои файлы в сети не получится? Вот, например, у меня есть 10 файлов, которые мне очень дороги. Я их сохранил и опубликовал в сеть. Но никто же не знает что они у меня есть, соответственно никто и не скачает, и они так и останутся висеть у меня? Не буду ж я всем орать «ребят, у меня тут 10 файлов, заберите кто может...».

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

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


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


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

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

                ipfs — пока видится как замена торрентам и статичному контенту на сайтах, но и то и другое пока не спешат вымирать.
                  0
                  А можно ссылки на страницы где описано как в этих FreeNet и SafeNet кинуть файлы в сеть и забрать чужие?
                0
                Ну значит пока эта программа для меня бесполезна. Пока не будет автоматического прикрепления.
                  0

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

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

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

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

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

                Only users with full accounts can post comments. Log in, please.