Немногие слышали про 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)
dordyan
20.09.2016 23:38Спасибо, но к сожалению очень кратко. Хотелось бы видеть больше статей про сам протокол IPFS и разработку проектов завязанных на него в частности.
xuexi
20.09.2016 23:46+1Начальная информация есть в статье ув. Мицгола https://habrahabr.ru/post/268275/
Более подробная информация будет завязана на конкретную задачу, вот Вас что интересует?
ivlis
20.09.2016 23:45А что будет, когда два файла имеют одинаковый хеш?
xuexi
20.09.2016 23:49+1Значит это либо одинаковые файлы, либо коллизия, но в системе мультихэшей IPFS они сводятся к достаточно низкой вероятности.
xuexi
20.09.2016 23:55Таким образом, если просто добавить два одинаковых файла в сеть, то она будет расширена одним файлом, более того, файлы при добавлении бьются на блоки, может случиться так, что эти блоки тоже повторяются и равны блоками из других файлов.
ivlis
21.09.2016 00:15А если я специально буду генерить разные файлы с одинаковым хешем, судя по виду там же просто sha1.
blueboar2
21.09.2016 12:36Я правильно понимаю, что просто сохранить свои файлы в сети не получится? Вот, например, у меня есть 10 файлов, которые мне очень дороги. Я их сохранил и опубликовал в сеть. Но никто же не знает что они у меня есть, соответственно никто и не скачает, и они так и останутся висеть у меня? Не буду ж я всем орать «ребят, у меня тут 10 файлов, заберите кто может...».
То есть, не получится, скажем выделить 10 гигов места, чтобы хранить данные других, а за это чтобы хранили 10 гигов моих?xuexi
21.09.2016 12:43Есть два варианта сохранения данных в сети, "прикрепление" и кэширование. Если вы запросите свои данные через другие узлы, то они там закэшируются и в принципе, будут лежать довольно долго, пока не будет выполнена сборка мусора, то есть очистка локальной БД узла от незакрепленных данных.
А закрепление (pin) спасает от такой очистки. То есть, вы можете попросить друга закрепить 10 хэшей, закат солнца вручную.
И в данной версии ПО IPFS (0.4.4) автоматического прикрепления нет. Отчасти эту проблему может решать продукт вроде моего webdav-сервиса, который будет закреплять пользовательские файлы на узлах автоматически. Но это стороннее ПО, с понятными перспективами.
Сами разработчики IPFS придумали Filecoin, систему которая будет способствовать тому, чтобы люди хранили чужие данные за копеечку, как сейчас Ethereum позволяет запускать чужой код на своей машине за gas. Но Filecoin пока нет в паблике.
ton1
21.09.2016 15:07Для просто сохранить в сети есть freenet, но он древний и неудачный по многим параметрам.
А также в разработке safenet, с похожей логикой работы но с новыми прибабахами.
ipfs — пока видится как замена торрентам и статичному контенту на сайтах, но и то и другое пока не спешат вымирать.blueboar2
22.09.2016 06:48А можно ссылки на страницы где описано как в этих FreeNet и SafeNet кинуть файлы в сеть и забрать чужие?
blueboar2
21.09.2016 12:48Ну значит пока эта программа для меня бесполезна. Пока не будет автоматического прикрепления.
xuexi
21.09.2016 12:56Это грозит централизацией сети, ведь нет гарантии, что люди будут готовы хранить чужие файлы, а значит их будут хранить только крупные игроки в сети. И это ничем не будет отличаться от сегодняшних облачных хранилищ.
blueboar2
21.09.2016 13:02Я ж не говорю, что это правильно/неправильно или вообще реализуемо/нереализуемо. Просто в текущем виде это для меня бесполезно, ибо я не могу найти, для чего мне может это понадобиться. Но я ж не говорю, что не может быть других людей, которые будут это использовать.
xuexi
21.09.2016 15:56И вот буквально сегодня (2016-09-21) вышла новая версия IPFS демона с оптимизациями в плане памяти и сетевого протокола https://ipfs.io/blog/19-ipfs-0-4-3-released/
xuexi
21.09.2016 17:49И ещё новости, про FileCoin https://www.reddit.com/r/ethereum/comments/53rdjx/ipfs_filecoin_to_be_built_on_ethereum/
xuexi
За время, пока статья ожидала приглашения, удалось реализовать.систему, локов и аттрибутов файлов, и почти пройти тест webdav litmus.