Розміщення сайтів у розподіленій файловій системі IPFS

Розміщення сайтів у розподіленій файловій системі IPFS

causa-arcana.com
хв
Логотип IPFS
Логотип IPFS

У статті " Децентралізовані сервіси проти розподілених " {1} як приклад розподіленої системи ми наводили IPFS (InterPlanerary File System) [2] . Настав час розповісти про неї докладніше, оскільки це одна з найперспективніших розподілених технологій.

Що таке IPFS?

IPFS – це глобальне сховище незмінної інформації. Працює як тимчасовий кеш, але також можливе використання спеціальних сервісів (платних або волонтерських), що гарантують збереження інформації.

Які проблеми вирішує IPFS?

IPFS повинен замінити деякі функції HTTP (та HTTPS) через проблеми цього протоколу: [3]

  • HTTP завантажує файл з одного сервера замість того, щоб отримувати його частини з багатьох джерел одночасно. Це збільшує навантаження на сервер і витрачає його мережевий трафік. IPFS дозволяє зменшити ці витрати. [4]
  • HTTP вимагає, щоб сервер, з якого відбувається завантаження файлу, був присутній в цей момент за адресою, що визначена в посиланні. Це призводить до того, що середнє життя веб-сторінки в Інтернеті становить 100 днів. [5] IPFS виконує функцію веб-архіву, дозволяючи зберігати корисну інформацію.
  • HTTP залежить від протоколів TCP, IP і DNS, що лежать в його основі, які керуються централізованими організаціями, тому схильні до стеження і цензури. IPFS не залежить від нижченаведених протоколів та наявності прямого підключення до Інтернету взагалі.
  • HTTP дозволяє підмінити вміст, що віддається. Хоча для багатьох завдань необхідно постійно оновлювати його, деякі файли та веб-сторінки повинні залишатися незмінними. IPFS ідентифікатор файлу однозначно визначає його вміст.

Пристрій IPFS

В основі IPFS лежать кілька простих принципів: [6]

  • Кожному файлу та директорії надається унікальний ідентифікатор (CID – Content Identifier) ​​на основі застосування до його вмісту криптографічної хеш-функції . Поодинокі файли отримують однаковий ідентифікатор, різні файли – різні ідентифікатори. [7]
  • Мережа усуває дублювання . Наприклад, якщо при завантаженні нової версії директорії частина файлів не змінилися, вони будуть розділені між новою та попередньою версіями.
  • Адресація вмісту здійснюється за його унікальним ідентифікатором (content addressing), тобто не залежить від його фактичного становища в мережі. [7]
  • Кожен вузол містить лише інформацію, у якій він зацікавлений , і навіть деяку додаткову інформацію, необхідну пошуку файлів у мережі (DHT – Distributed Hash Table). [8]

За більш детальною інформацією зверніться до whitepaper [9] та документації [10] .

УВАГА! IPFS є повністю публічною мережею. Будь-який поміщений до неї файл доступний кожному учаснику мережі. Використовуйте шифрування для обмеження доступу. Також можливе створення приватної мережі на основі IPFS. Докладніше читайте в документації [11] .

Фіксація вмісту

За промовчанням IPFS не гарантує, що файли зберігатимуться в мережі. Як було зазначено, вузли зберігають лише ті файли, які використовують.

Для збереження файлів існує механізм закріплення (pinning [12] ). Є кілька сценаріїв його використання:

  • Ви можете закріпити файл на робочому комп'ютері або ноутбуку. При цьому для вас він буде доступний завжди, навіть без доступу до Інтернету, але інші користувачі мережі не зможуть отримати до нього доступ, коли ви не в мережі.
  • Ви можете запустити вузол IPFS на сервері, який постійно запущено. При цьому файл буде доступний завжди, але з'являються витрати на утримання сервера (оплата послуг VDS, адміністрування).
  • Ви можете закріпити файл на чужому сервері IPFS особисто звернувшись до його адміністратора, а також скориставшись веб-інтерфейсом або API сервісу, якщо такі є.

Для надійності слід використовувати всі способи та закріплювати файли на кількох вузлах. Чим більше вузлів зберігає файл, тим менша ймовірність того, що він пропаде, якщо вузол буде закритий.

На даний момент єдиним відомим нам сервісом фіксації файлів в IPFS, що працює в автоматичному режимі, є Pinata [13] . Він надає 1 ГБ безкоштовно, понад це зберігання коштує $0.15 на місяць за 1 ГБ.

Шлюзи

Для доступу до файлів, розміщених у IPFS, потрібне встановлення спеціального програмного забезпечення [14] Розширення для веб-браузерів IPFS Companion [15] робить досвід взаємодії у веб-браузері зі сторінками з IPFS невідмінним від взаємодії зі звичайними веб-сторінками. IPFS Desktop [16] дозволяє рядовому користувачеві легко використовувати IPFS. Для адміністраторів серверів або для просунутих користувачів можливе встановлення за допомогою ipfs-update [17] , з бінарних репозиторіїв [18] або шляхом компіляції з вихідного коду [19] .

Необхідність встановлення програмного забезпечення, навіть якщо вона не викликає великих труднощів, сильно обмежує потенціал IPFS. Для вирішення цієї проблеми були придумані шлюзи (gateways [20] ) - Звичайні веб-сайти, які віддають вміст з IPFS.

Як це працює? Допустимо, в IPFS є файл з адресою ipfs://bafybeifoottvirj3crpx66qdsey7lxlp6qwk57wl37xygjqymeobwixy5e/concepts/ipfs-gateway/Традиційне програмне забезпечення не вміє відкривати такі адреси. Тому ми можемо сформувати звичайне заслання: https://ipfs.io/ipfs/bafybeifoottvirj3crpx66qdsey7lxlp6qwk57wl37xygjqymeobwixy5e/concepts/ipfs-gateway/Тут ipfs.io– це шлюз, що належить розробникам IPFS. Він використовує спосіб дозволу імен через шлях запиту. У загальному випадку URL виглядає так:

https://{URL шлюза}/ipfs/{CID}/{путь к ресурсу}

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

Тому існує ще спосіб дозволу імен через піддомен. Посилання на наш файл у цьому випадку матиме вигляд https://bafybeifoottvirj3crpx66qdsey7lxlp6qwk57wl37xygjqymeobwixy5e.ipfs.dweb.link/concepts/ipfs-gateway/, де ipfs.dweb.link- це шлюз, який підтримує такий спосіб дозволу імен. У загальному випадку URL виглядає так:

https://{CID}.ipfs.{URL шлюза}/{путь к ресурсу}

Список шлюзів є за посиланням https://ipfs.github.io/public-gateway-checker [21] . Необхідно розуміти, що використання сторонніх шлюзів нівелює переваги IPFS. Однією з проблем сторонніх шлюзів є те, що вони легко можуть здійснити атаку MitM (man-in-the-middle), тобто підмінити вміст, однак це вирішується використанням власного шлюзу, тому ви цілком можете використовувати IPFS для розміщення серйозних веб-сайтів та веб-застосунків, не створюючи незручностей для користувачів.

IPNS

Оскільки IPFS використовує адресацію на основі вмісту, найменша зміна повністю змінює адресу. Для того, щоб мати постійне посилання на вміст, що змінюється, поверх IPFS побудована система IPNS (InterPlanetary Name System) [22] . Ця система дуже проста. З використанням приватного ключа вузол повідомляє мережі, що він хоче опублікувати на адресу, пов'язану з цим ключем, визначений CID. Ця прив'язка залишається дійсною деякий проміжок часу, зазвичай, добу. Щоб адреса залишалася актуальною, потрібно періодично повторно здійснювати цю операцію, яку можна автоматизувати, наприклад, за допомогою cron [23] .

На жаль, цей процес не можна делегувати сторонньому сервісу, як це можливо, у разі простого зберігання файлів, не передаючи йому свій приватний ключ. Однак, це дозволяє роздавати веб-сайт, наприклад, з постійно увімкненого домашнього комп'ютера, навіть якщо він знаходиться за NAT. Система IPNS ще розвивається. Можливо, у майбутньому це обмеження буде усунено.

Як приклад наводимо постійну адресу веб-сайту Causa Arcana в IPNS (через шлюз): https://k51qzi5uqu5ditckag7gw12c301kwxac5fpobs62i21uysuiry3bobotvbenmc.ipns.dweb.link [24] .

DNSLink

IPNS використовує як ідентифікатор CID. Це дуже довгий рядок, що нічого не означає для людини, його незручно вимовляти вголос і вводити вручну. Завдяки DNSLink [25] можна прив'язати вміст IPFS до традиційного доменного імені. Наприклад, веб-сайт https://causa-arcana.com [26] працює через DNSLink. При цьому користувачі, які мають програмне забезпечення IPFS, отримують вміст із цієї мережі, а інші користувачі отримують вміст через шлюз.

Для прив'язки CID до доменного імені необхідно створити два записи в DNS:

causa-arcana.com. IN CNAME cloudflare-ipfs.com.
_dnslink.causa-arcana.com. IN TXT "dnslink=/ipfs/bafybeic7vznjiq3tby7fezgdux6225x2pj3f6lkmrmivz3j4vbvb43yvhm"

Тут cloudflare-ipfs.comце адреса шлюзу, який підтримує DNSLink.

Перевагою DNSLink перед IPNS, окрім зручнішого імені веб-сайту та відсутності необхідності мати сервер для постійного повторення процесу публікації, є відсутність у посиланні доменного імені конкретного шлюзу. Якщо шлюз перестав працювати або заблокував ваш веб-сайт, достатньо вибрати інший шлюз і вписати його в запис DNS типу CNAME. У той же час, цей спосіб має на увазі прив'язку до традиційної системи доменних імен, яка є централізованою, в ній можливі цензура та вилучення домену.

Види CID

Існує два види ідентифікаторів вмісту:

  • CIDv0 :QmesV3cwCMeweAMePKhPCkoKNh2A3cMgEYQwRPUUf3Cvy7
  • CIDv1 :bafybeihvuei3zko5ao5v7k2tutds4b2fm7gcbc3mjete7ifkzsqayuq7ai

Хоча CIDv0 все ще є стандартним для вмісту, що міститься в IPFS, він погано підходить для піддоменів, оскільки використовує і великі, і малі літери, в той час як доменні імена не чутливі до регістру.

Один і той же ідентифікатор CIDv1 може використовувати різні кодування:

  • Base32 :bafzaajaiaejca2m4edvf5zdbgnbj5nvz2nm7chdtwzfcupmoaaarifdonsl7ibqu
  • Base36 :k51qzi5uqu5ditckag7gw12c301kwxac5fpobs62i21uysuiry3bobotvbenmc

Саме CIDv1 з кодуванням Base36 використовується для піддоменів.

Для перетворення між різними видами CID існує сервіс CID Inspector [27] .

Публікуємо веб-сайт в IPFS

Вам потрібна операційна система на основі GNU/Linux, навички роботи в командному рядку та програмне забезпечення IPFS [18] .

Створюємо веб-сайт

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

$ cd
$ mkdir hello_ipfs
$ cd hello_ipfs

Також створіть директорію для другої сторінки сайту. Це потрібно для демонстрації роботи відносних посилань:

$ mkdir subdir

У директорії верхнього рівня створіть файл index.htmlЛітери після слова random(тут це 74eownSL2tdYBsXm) замініть будь-які випадкові літери. Можна просто натискати довільні літери на клавіатурі.

<!DOCTYPE html>
<html>
<head>
<!-- random: 74eownSL2tdYBsXm -->
<meta charset="utf-8"/>
<title>Hello, IPFS!</title>
</head>
<body>
<h1>Hello, IPFS!</h1>
<a href="subdir/index.html">Subdir</a>
</body>
</html>

У директорії subdirтакож створіть файл index.htmlАналогічно замініть літери після слова random(тут це TKj20YgXq9fsqYTr) на випадкові літери.

<!DOCTYPE html>
<html>
<head>
<!-- random: TKj20YgXq9fsqYTr -->
<meta charset="utf-8"/>
<title>Hello from subdir, IPFS!</title>
</head>
<body>
<h1>Hello from subdir, IPFS!</h1>
<a href="../index.html">Root</a>
</body>
</html>

Розміщуємо веб-сайт в IPFS

Перейдіть до кореневої директорії вашого проекту і наберіть команду ipfs add -r ., після чого ви повинні побачити приблизно наступний текст:

$ ipfs add -r .
added QmfGCviBGivYgbRGd1JfCgxhiXAUgszjwESBtVa9AoxFoW hello_ipfs/index.html
added QmdkXcfsSkpgaeh6GvQLBKVHsCoPEgBso7LW2rQdBoMgUo hello_ipfs/subdir/index.html
added QmPYofiX37wLX7ZDgxvsqNmqSDjDAzz3aurbgdZiSbyMGj hello_ipfs/subdir
added Qmd8QkqLB6xu1p6n6C3bWvtspidsPbx1gJ81fvXQiLdu6s hello_ipfs
490 B / 490 B [========================================================] 100.00%

Якщо ви точно дотримувалися інструкцій та використовували випадкові символи, то вказані в кожному рядку після слова addedCID у вас будуть відрізнятися від представлених. Нас цікавить останній CID (тут це Qmd8QkqLB6xu1p6n6C3bWvtspidsPbx1gJ81fvXQiLdu6s). Наберіть його в адресному рядку вашого браузера після адреси будь-якого шлюзу. Вийде схоже посилання: https://ipfs.io/ipfs/Qmd8QkqLB6xu1p6n6C3bWvtspidsPbx1gJ81fvXQiLdu6sЯкщо ви перейдете по ній, ви побачите ваш веб-сайт. Посилання з однієї його сторінки має вести на другу, і навпаки.

Сторінки веб-сайту
Сторінки веб-сайту
Просмотры:

Коментарі

Популярні публікації