Міжпланетна файлова система IPFS

Це нова децентралізована мережа обміну файлами. Відміну від інших аналогічних мереж в тому що самостійною одиницею переданої в мережі є блок. Блок може містити як частину файлу так і посилання на інші блоки. З блоків вибудовується спрямований ациклічний граф з якого надалі збирається файл або каталог. Така система дозволяє більш гнучко підійти до зберігання та передачі даних в мережі. Недоліком такого підходу є те що все що завантажується в мережу ріжеться на блоки і складається в окремий каталог на вашому диску. Пошук по імені файлу або каталогу в IPFS відсутня також як і в мережі BitTorrent.

image

Мультихеш
Base58: QmcXx5mKDQAc7tCWLq84Hn7XFxWfBdZpvogjk3tnxqrfiv 
HEX: 12 20 D2E8A669F85E864B5C285CAB18DE72CF8927DC1643516373FEFF871A69F2A127

Ідентифікатором у цій децентралізованої мережі служить обгорнутий в мультихеш sha128 від кореневого блоку файлу або каталогу. Мультихеш складається з трьох частин: ID хеш функції, розмір хеш в байтах, хеш. Для зберігання ID і розміру використовується зараз по одному байту але значення їх не може бути більше або дорівнює 128 до тих пір поки вони не визначаться з форматом unsigned-varint якими вони позначені. Мультихеш в посиланнях представлений в кодуванні Base58 bitcoin.

Мультихеш використовується з доробком на майбутнє-що б мережа мала можливість перейти на нові, більш стійкі хеш функції.

Клієнт
ipfs daemon

В робочому стані для мережі IPFS існує мультиплатформовий клієнт написаний GO. Його можна як завантажити так скомпілювати самостійно.

Команда
ipfs daemon
запускає клієнт який надає веб-інтерфейс. Увійти на нього можна за адресою за замовчуванням http://127.0.0.1:5001/webui.

Додати файл і каталог в мережу можна командного
ipfs add [шлях]
або
ipfs add -r [шлях до каталогу]
. Також файли можна додати через webui на сторінці http://127.0.0.1:5001/webui#files.

Після додавання файлу або каталогу буде виданий його мультихеш. Додані таким способом об'єкти автоматично причіпляються тобто вони не будуть видалені якщо виконати команду
ipfs repo gc
. Також вони стають доступні у всій мережі за цим мультихешам. Якщо відкрити сторінку web інтерфейсу http://127.0.0.1:5001/webui#objects можна побачити як у мережі представлені файли ввівши їх мультихеш в рядок пошуку. На ній відображається вміст блоку.

Блок
Вище я говорив, що самостійною одиницею в мережі є блок. Якщо взяти зі сторінки http://127.0.0.1:5001/webui#objects мультихеш блоку файлу і додати до нього
http://127.0.0.1:8080/ipfs/
то мережа віддасть частину файлу або каталогу відповідну блоку з цим мультихешем.

Для прямої роботи з raw блоками у ipfs також є команди:

ipfs get block <key> - Отримати raw IPFS блок.
ipfs block put <data> - Зберегти enter як IPFS блок.
ipfs block rm <hash>... - Видалити IPFS блок(і).
ipfs block stat <key> - Вивести інформацію про raw IPFS блоці.

За допомогою
ipfs get block [мультихеш]
я з'ясував чому відповідає мультихеш від тестового файлу який я тільки що завантажив командою
ipfs add [повний шлях до файлу]
використовуючи RHash і Base58 online декодер. Файли розміром менше 262158 байт зберігаються в мережі одним блоком. Формат цього блоку я так і не з'ясував.

Цікаво що webui зберігатися в децентралізованої мережі і частина коду самого клієнта також зберігатися в ній. Код підвантажується з мережі автоматично перед компіляцією клієнта. Навіщо це зроблено не знаю. Це трохи ускладнює читання исходников.

Шлюз
У мережі IPFS є вихід в звичайну мережу. Тобто через сайт ipfs.io можна отримати доступ до будь фалу або каталогу доступного в мережі IPFS. Для цього достатньо знати його мультихеш і додати його до адресою
http://ipfs.io/ipfs/[мультихеш]
.

Деякі клієнти децентралізованих мереж навчилися тягнути дані по http(s). Сайт ipfs.io можна використовувати як WebSeed. А якщо у вас будуть встановлені одночасно IPFS й інший клієнт підтримує WebSeed то другий зможе використовувати IPFS локально через
http://127.0.0.1:8080/ipfs/[мультихеш]
.

У цій статті "Чому Інтернету потрібен IPFS, поки ще не пізно" в браузери пропонується додати розширення яка буде змінювати адресу
ipfs.io
на
127.0.0.1:8080
. Це необхідно для перегляду в браузері контенту з IPFS через локальний клієнт.

Експерименти з IPFS і BitTorrent
Експериментуючи з IPFS WebSeed і qBittorent я помітив що локальний IPFS дуже повільно віддає дані запитувані у випадковому порядку. Тільки коли я включив послідовне завантаження швидкість зросла до 1МБ/c. І це всі блоки роздачі знаходяться в локальному сховищі. Також IPFS сильно навантажує процесор.

Для BitTorrent'а IPFS клієнт може послужити хорошим дедупликатором. Він зможе знайти копії файлів за IPFS мультихешу каталогу або файлу. Для цього досить додати його як WebSeed в торрент.

IPFS WebSeed
Для того щоб роздати використовуючи IPFS WebSeed вміст каталогу перед завантаженням в IPFS його необхідно перенести в інший порожній каталог і його вже додати на завантаження командою
ipfs add -r [шлях до каталогу]
. Доступ до каталогу буде по посиланню
http://ipfs.io/ipfs/[мультихеш]/[Ім'я вихідного каталогу]
або
http://127.0.0.1:8080/ipfs/[мультихеш]/[Ім'я вихідного каталогу]
.

BitTorrent клієнти автоматично додають до WebSeed ссылке повний шлях до файлу з торрента у разі якщо це торрент каталогу. Достатньо як WebSeed додати посилання виду
http://ipfs.io/ipfs/[мультихеш]
або
http://127.0.0.1:8080/ipfs/[мультихеш]
.

Для однофайлового торрента досить просто додати файл командою
ipfs add [шлях]
і WebSeed посилання на нього будуть того ж виду
http://ipfs.io/ipfs/[мультихеш]
або
http://127.0.0.1:8080/ipfs/[мультихеш]
.

WebTorrent і IPFS WebSeed
WebTorrent зможе працювати тільки з локальним шлюзом IPFS і то тільки після налаштування так як шлюз повинен дати дозвіл для WebTorrent використовувати HTTP заголовок Range.

Для цього необхідно відкрити http://127.0.0.1:5001/webui#config

І в рядки:

"Access Control-Allow-Headers": [
"X-Requested-With"
],

додати «Range»:

"Access Control-Allow-Headers": [
"X-Requested-With",
"Range"
],

після чого зберегти і перезапустити IPFS

Міжпланетна система імен
Також у кожного клієнта є можливість прив'язати об'єкт до мультихешу свого публічного ключа. На сайті
ipfs.io
можна отримати доступ до цього об'єкта додавши мультихеш публічного ключа адресою
http://ipfs.io/ipns/
. Для того щоб прив'язати або отримати об'єкт за мультихешу публічного ключа існують команди:

ipfs name publish <ipfs-path> - Публікувати об'єкт в IPNS.
ipfs name resolve [<name>] - Взяти значення опублікованого по IPNS імені.

Поєднання безкоштовного DNS,
http://ipfs.io/ipns/[мультихеш публічного ключа]
і IPFS клієнта дозволяє роздавати з домашнього сервера невеликої статичний сайт навіть перебуваючи за NAT.

Міжпланетна файлова система і магніт
Зараз IPFS не вміє працювати з магніт-посилання та так і не описаний URN, який містить в собі використовуваний у мережі мультихеш.

Я пропоную такий: urn:ipfs:[Base58 bitcoin encoded IPFS multihash]

В магніт засланні він відповідно буде виглядати так:

magnet:?xt=urn:ipfs:[Base58 bitcoin encoded IPFS multihash]

Приклад:

magnet:?xt=urn:ipfs:QmcXx5mKDQAc7tCWLq84Hn7XFxWfBdZpvogjk3tnxqrfiv

Написавши невеликий скрипт можна навчити працювати IPFS з магнітами або інші децентралізовані клієнти використовувати IPFS як WebSeed.

Я думаю використання магніт-посилання дозволить відв'язатися від сайту ipfs.io з яким може статися та ж історія що і з доменом shareaza. І більш чітко позначити IPFS мультихеш.

Трохи не по темі
Я тут для магнітів намалював(написав насправді) логотип для безоплатного використання. Хочу представити його щоб він став впізнаваним символом магніт-посилання ну і використовувався для її позначення. Може тоді я зможу відкотити скасування моєї правки у статті магніт-посилання і повернути логотип у статтю.

image на GitHub

Кольори для магніту взяті з логотипів клієнтів децентралізованих мереж. Я не дизайнер. Намагався зробити малюнок простим і компактним. Ви можете вільно копіювати його і змінювати.

Джерела:

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.