[Из песочницы] Работа в 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 появились функции мутабельной файловой системы, которая пока недокументирована, но возможно даст необходимое быстродействие и удобство работы.
Ссылки
- Исходный код проекта IPFS
- Исходный код ipfs2webdav
- Документация по IPFS
Комментарии (1)
20 сентября 2016 в 19:19 (комментарий был изменён)
0↑
↓
За время, пока статья ожидала приглашения, удалось реализовать.систему, локов и аттрибутов файлов, и почти пройти тест webdav litmus.