InterPlanetary File System — это новая децентрализованная сеть обмена файлами (HTTP-сервер, Content Delivery Network). О ней я рассказывал в статье "Межпланетная файловая система IPFS".


Всем хороша идея IPFS но вот только был один недостаток у неё. Данные загружаемые в сеть копировались в хранилище блоков удваивая занимаемое ими место. Более того файл резался на блоки которые мало пригодны для повторного использования.


Появилась экспериментальная опция --nocopy, которая избавляет от этого недостатка. Для того чтобы пользоваться ей необходимо выполнить несколько условий.


Также появился новый тип идентификаторов. Его мы тоже разберём.


image


--nocopy


Это опция заставляет IPFS использовать как источник блоков исходные файлы. Тем самым файлы не копируются в хранилище блоков и не занимают в 2 раза больше места.


Для использования этой опции выполним следующие действия:


  1. необходимо включить Filestore


    ipfs config --json Experimental.FilestoreEnabled true

  2. в каталог где лежит каталог ".ipfs"(он обычно в каталоге пользователя) нужно сделать ссылку на каталог или файл который надо загрузить в сеть


    Файл можно связать hardlink'ом:


    fsutil hardlink "[каталог где .ipfs]\[имя файла]" "[путь к файлу]\[имя файла]"

    или


    mklink /h "[каталог где .ipfs]\[имя файла]" "[путь к файлу]\[имя файла]"

    Каталог можно связать символьной ссылкой:


    linkd "[каталог где .ipfs]\[имя каталога]" "[путь к каталогу]\[имя каталога]"

    или


    mklink /j "[каталог где .ipfs]\[имя каталога]" "[путь к каталогу]\[имя каталога]"

  3. И теперь добавляем


    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


Разберём его на части


  1. zbase58 Bitcoin [префикс основания]


    base58: b2rhe143L6sgu2Nba4TZgFMdPidGMA6hmWhK9wLUoVGWYsR7
    переводим в
    HEX: 01 55 12 20 6D542257CBD1BE7FD0AE8914F42066BCBF1E79487EF67B959A86DBEE4670B386


  2. 01 — v1 [varint версия CID]
  3. 55 — raw binary [varint тип контента]
  4. 12sha2-256 [varint ID хеша]
  5. 20 — 32 байта [varint длинна хеша]
  6. 6D542257CBD1BE7FD0AE8914F42066BCBF1E79487EF67B959A86DBEE4670B386 — sha2-256 digest [хеш]

Заключение


Опция --nocopy очень помогает когда вы хотите поделиться с миром например дампом Википедии. Или другими полезными но очень большими по объёму массивами информации.


Ссылки


Ссылки в Windows, символьные и не только
ipfs command reference
List of experimental IPFS features


Другие части


  1. Межпланетная файловая система IPFS
  2. Публикуем сайт в межпланетной файловой системе IPFS
  3. Хостим сайт в межпланетной файловой системе IPFS под Windows
Поделиться с друзьями
-->

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


  1. Bal
    16.06.2017 06:25
    +1

    Не обязательно размещать ссылку в самом .ipfs, достаточно в каталоге, в котором находится .ipfs. Обычно это домашний каталог.


    1. Self_Perfection
      16.06.2017 11:49
      +1

      А использование именно хардлинка для файлов обязательно? Симлинк не прокатит? Тоска же.


      1. ivan386
        16.06.2017 12:58

        Не обязательно.


      1. Bal
        16.06.2017 13:39

        Симлинки на каталоги замечательно работают. На файлы не пробовал.


        Т.е. я просто в /home/balancer создал каталог ipfs-share, куда накидал симлинки на все нужные каталоги с файлами. И расшариваю их из этого каталога.


  1. Mad__Max
    16.06.2017 09:20

    Кто-нибудь может пояснить, что за трафик постоянно пропускает через себя работающая IPFS нода, даже когда НЕ загружает никаких данных (нет запросов владельца) и НЕ отдает файлы/блоки из собственного хранилища(предельный случай — в локальном хранилище вообще ничего нет)?

    Как понимаю, она работает ретранслятором, пересылая по цепочке чужие блоки — примерно как ходит трафик в сети TOR. Только в отличии от TOR не понимаю зачем такое вообще нужно? Почему получатель (запрашивающий какой-то контент) не загружает его с ближайшей ноды(нод), в хранилище которых нашлись нужные блоки? Зачем вообще нужны посредники-ретрансляторы и кратное увеличение общего трафика в сети?


    1. ivan386
      16.06.2017 10:11
      +1

      Как минимум нода обслуживает DHT. А так можно включить режим --debug=true
      и видеть всё что она делает.


  1. pavellab_indystrial
    16.06.2017 21:24

    Наткнулся на интересную статью https://habrahabr.ru/post/260339/
    Тема: Программируем BitTorrent-клиент. Чистый Delphi
    Но делфи это же… Zona — вроде как известный торрент клиент, написан на Java, возможно ли такой «торрент клиент» создать самому в одиночку? Сколько нужно времени? Увы в той теме не смог задать вопрос так как публикация старая.


    1. ivan386
      16.06.2017 23:55

      Есть libtorrent к которому можно прикрутить интерфейс и реализовать нужные плюшки.

      Написать свой простецкий торрент клиент не сложно и может занять наверное не больше недели. Информация по протоколам лежит на bittorrent.org. Вот реализация всех остальных фишек уже может занять более длительное время.

      Опыта у меня ни Delphi ни Java нет. Говорю относительно Lua.


  1. goragora2
    16.06.2017 21:24

    дк это же sjcx


    1. ivan386
      16.06.2017 21:38

      Расскажите по подробней. Что такое sjcx и чем оно схоже с ipfs?


  1. MagisterAlexandr
    18.06.2017 00:37

    Удобная система для академических целей. По сравнению с торрентами, очень высокая отзывчивость при работе с файлами, независимость от имён файлов и структуры каталогов.

    Вопрос в том, можно ли использовать систему для работы с непубличными уникальными данными (например, контент для узкого круга подписчиков, корпоративные фотографии), хэши которых неизвестны? То есть, насколько возможно установить наблюдение за конкретным участником сети, узнать текущее содержимое его хранилища, что скачивает, что раздаёт?


    1. ivan386
      18.06.2017 00:51

      В эксперементальных есть приватная сеть но IPFS создавалась не для приватных данных. Минимум раз в сутки она публикует в DHT содержимое хранилища блоков.

      Приватные данные можно шифровать до публикации в сеть. Тогда даже если кто то узнает хеш и скачает их расшифровать то не сможет.


  1. MagisterAlexandr
    18.06.2017 23:28

    Вот бы базу archive.org в IPFS, заодно и дедубликация где только возможно.


    1. ivan386
      19.06.2017 11:16

      Что то вроде этой мысли уже есть:


      1. Internet Archive
      2. IPFS as a backend to a web archiving