InterPlanetary File System — это новая децентрализованная сеть обмена файлами (HTTP-сервер, Content Delivery Network). О ней я рассказывал в статье "Межпланетная файловая система IPFS".
Всем хороша идея IPFS но вот только был один недостаток у неё. Данные загружаемые в сеть копировались в хранилище блоков удваивая занимаемое ими место. Более того файл резался на блоки которые мало пригодны для повторного использования.
Появилась экспериментальная опция --nocopy
, которая избавляет от этого недостатка. Для того чтобы пользоваться ей необходимо выполнить несколько условий.
Также появился новый тип идентификаторов. Его мы тоже разберём.
--nocopy
Это опция заставляет IPFS использовать как источник блоков исходные файлы. Тем самым файлы не копируются в хранилище блоков и не занимают в 2 раза больше места.
Для использования этой опции выполним следующие действия:
необходимо включить Filestore
ipfs config --json Experimental.FilestoreEnabled true
в каталог где лежит каталог ".ipfs"(он обычно в каталоге пользователя) нужно сделать ссылку на каталог или файл который надо загрузить в сеть
Файл можно связать hardlink'ом:
fsutil hardlink "[каталог где .ipfs]\[имя файла]" "[путь к файлу]\[имя файла]"
или
mklink /h "[каталог где .ipfs]\[имя файла]" "[путь к файлу]\[имя файла]"
Каталог можно связать символьной ссылкой:
linkd "[каталог где .ipfs]\[имя каталога]" "[путь к каталогу]\[имя каталога]"
или
mklink /j "[каталог где .ipfs]\[имя каталога]" "[путь к каталогу]\[имя каталога]"
И теперь добавляем
ipfs add -w --nocopy "[каталог где .ipfs]\[имя каталога или файла]"
Ключ
-w
оборачивает цель в каталог тем самым сохраняя её имя.
Результатом будут идентификаторы CIDv1 и CIDv0 (мультихеш)
WebSeed
Теперь в магнит или торрент можно будет добавить WebSeed.
Для файла:
http://127.0.0.1:8080/ipfs/[идентификатор]/[имя файла]
http://ipfs.io/ipfs/[идентификатор]/[имя файла]
Для каталога:
http://127.0.0.1:8080/ipfs/[идентификатор]/
http://ipfs.io/ipfs/[идентификатор]/
Пример магнита c WebSeed
magnet:?xt=urn:btih:953edbe75de612bc966194d2ee60099b3bc1a1aa&dn=Magnet-ссылка.txt&ws=https://ipfs.io/ipfs/QmfQCxNW9r2974xR5dXopXfQqsEvgexhza6aQgqTGL7Yh3/Magnet-ссылка.txt
Идентификатор контента (CID)
В связи с этими изменениями в IPFS появились RAW блоки. Ключ --nocopy
автоматически включает использование RAW блоков. Но можно включить этот режим и ключом --raw-leaves
. В связи с этим появился новый CID (Content IDentifier) или по русски "идентификатор контента".
Старый идентификатор
Называется CIDv0 и обычно имеет постоянный префикс "Qm".
CIDv0 это просто мультихеш в Base58
[varint ID хеша][varint длинна хеша][хеш]
Пример CIDv0: QmPbs8syAxac39bcNuMLpHXnqjKUguqakCM8LN8sZVPD9R
Новый идентификатор
У RAW блоков свой CID. Его можно отличить по постоянному префиксу "zb2rh".
CIDv1 содержит в себе больше информации.
[префикс основания][varint версия CID][varint тип контента][varint ID хеша][varint длинна хеша][хеш]
Пример CIDv1: zb2rhe143L6sgu2Nba4TZgFMdPidGMA6hmWhK9wLUoVGWYsR7
Разберём его на части
z
— base58 Bitcoin [префикс основания]
base58:
b2rhe143L6sgu2Nba4TZgFMdPidGMA6hmWhK9wLUoVGWYsR7
переводим в
HEX:01 55 12 20 6D542257CBD1BE7FD0AE8914F42066BCBF1E79487EF67B959A86DBEE4670B386
01
— v1 [varint версия CID]55
— raw binary [varint тип контента]12
— sha2-256 [varint ID хеша]20
— 32 байта [varint длинна хеша]6D542257CBD1BE7FD0AE8914F42066BCBF1E79487EF67B959A86DBEE4670B386
— sha2-256 digest [хеш]
Заключение
Опция --nocopy
очень помогает когда вы хотите поделиться с миром например дампом Википедии. Или другими полезными но очень большими по объёму массивами информации.
Ссылки
Ссылки в Windows, символьные и не только
ipfs command reference
List of experimental IPFS features
Другие части
Комментарии (14)
Mad__Max
16.06.2017 09:20Кто-нибудь может пояснить, что за трафик постоянно пропускает через себя работающая IPFS нода, даже когда НЕ загружает никаких данных (нет запросов владельца) и НЕ отдает файлы/блоки из собственного хранилища(предельный случай — в локальном хранилище вообще ничего нет)?
Как понимаю, она работает ретранслятором, пересылая по цепочке чужие блоки — примерно как ходит трафик в сети TOR. Только в отличии от TOR не понимаю зачем такое вообще нужно? Почему получатель (запрашивающий какой-то контент) не загружает его с ближайшей ноды(нод), в хранилище которых нашлись нужные блоки? Зачем вообще нужны посредники-ретрансляторы и кратное увеличение общего трафика в сети?
pavellab_indystrial
16.06.2017 21:24Наткнулся на интересную статью https://habrahabr.ru/post/260339/
Тема: Программируем BitTorrent-клиент. Чистый Delphi
Но делфи это же… Zona — вроде как известный торрент клиент, написан на Java, возможно ли такой «торрент клиент» создать самому в одиночку? Сколько нужно времени? Увы в той теме не смог задать вопрос так как публикация старая.ivan386
16.06.2017 23:55Есть libtorrent к которому можно прикрутить интерфейс и реализовать нужные плюшки.
Написать свой простецкий торрент клиент не сложно и может занять наверное не больше недели. Информация по протоколам лежит на bittorrent.org. Вот реализация всех остальных фишек уже может занять более длительное время.
Опыта у меня ни Delphi ни Java нет. Говорю относительно Lua.
MagisterAlexandr
18.06.2017 00:37Удобная система для академических целей. По сравнению с торрентами, очень высокая отзывчивость при работе с файлами, независимость от имён файлов и структуры каталогов.
Вопрос в том, можно ли использовать систему для работы с непубличными уникальными данными (например, контент для узкого круга подписчиков, корпоративные фотографии), хэши которых неизвестны? То есть, насколько возможно установить наблюдение за конкретным участником сети, узнать текущее содержимое его хранилища, что скачивает, что раздаёт?ivan386
18.06.2017 00:51В эксперементальных есть приватная сеть но IPFS создавалась не для приватных данных. Минимум раз в сутки она публикует в DHT содержимое хранилища блоков.
Приватные данные можно шифровать до публикации в сеть. Тогда даже если кто то узнает хеш и скачает их расшифровать то не сможет.
MagisterAlexandr
18.06.2017 23:28Вот бы базу archive.org в IPFS, заодно и дедубликация где только возможно.
ivan386
19.06.2017 11:16
Bal
Не обязательно размещать ссылку в самом
.ipfs
, достаточно в каталоге, в котором находится.ipfs
. Обычно это домашний каталог.Self_Perfection
А использование именно хардлинка для файлов обязательно? Симлинк не прокатит? Тоска же.
ivan386
Не обязательно.
Bal
Симлинки на каталоги замечательно работают. На файлы не пробовал.
Т.е. я просто в
/home/balancer
создал каталогipfs-share
, куда накидал симлинки на все нужные каталоги с файлами. И расшариваю их из этого каталога.