Межпланетная файловая система — больше нет необходимости копировать в сеть

Habrahabr

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:2F825A27112B0E5C89D20B656045920F1C10830C28&ws=https://ipfs.io/ipfs/QmPbs8syAxac39bcNuMLpHXnqjKUguqakCM8LN8sZVPD9R/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