Всем хороша идея IPFS но вот только был один недостаток у неё. Данные загружаемые в сеть копировались в хранилище блоков удваивая занимаемое ими место. Более того файл резался на блоки которые мало пригодны для повторного использования.
Появилась экспериментальная опция --nocopy
, которая избавляет от этого недостатка. Для того чтобы пользоваться ей необходимо выполнить несколько условий.
Также появился новый тип идентификаторов. Его мы тоже разберём.
Напомню: InterPlanetary File System — это новая децентрализованная сеть обмена файлами (HTTP-сервер, Content Delivery Network). О ней я начал рассказ в статье "Межпланетная файловая система IPFS".
--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 -r -w --nocopy "[каталог где .ipfs]\[имя каталога или файла]"
Ключ
-w
оборачивает цель в каталог тем самым сохраняя её имя.
Результатом будут идентификаторы CIDv1 и CIDv0 (мультихеш)
WebSeed
Теперь в магнит или торрент можно будет добавить WebSeed.
Для файла:
http://127.0.0.1:8080/ipfs/[идентификатор]/[имя файла]
http://gateway.ipfs.io/ipfs/[идентификатор]/[имя файла]
Для каталога:
http://127.0.0.1:8080/ipfs/[идентификатор]/
http://gateway.ipfs.io/ipfs/[идентификатор]/
Пример магнита c WebSeed
magnet:?xt=urn:btih:953edbe75de612bc966194d2ee60099b3bc1a1aa&dn=Magnet-ссылка.txt&ws=http://gateway.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
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