💾 Archived View for causa-arcana.com › blog › 2021 › 03 › 25 › ipfs.gmi captured on 2021-12-05 at 23:47:19. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2021-11-30)
-=-=-=-=-=-=-
25 Март, 2021 01:40 • Александр Котов
В статье "Децентрализованные сервисы против распределённых" в качестве примера распределённой системы мы приводили IPFS (InterPlanerary File System). Пришла пора рассказать о ней подробнее, поскольку это одна из наиболее перспективных распределённых технологий.
Децентрализованные сервисы против распределённых
IPFS (InterPlanerary File System)
IPFS -- это глобальное хранилище неизменяемой информации. Работает как временный кэш, но также возможно использование специальных сервисов (платных или волонтёрских), гарантирующих сохранность информации.
IPFS должен заменить некоторые функции HTTP (и HTTPS) из-за проблем этого протокола:
В основе IPFS лежат несколько простых принципов:
За более подробной информацией обратитесь к whitepaper и к документации.
ВНИМАНИЕ! IPFS является полностью публичной сетью. Любой помещённый в неё файл доступен каждому участнику сети. Для ограничения доступа используйте шифрование. Также возможно создание приватной сети на основе IPFS. Более подробно читайте в документации.
IPFS по умолчанию не даёт никаких гарантий того, что файлы будут храниться в сети. Как уже было сказано, узлы хранят только те файлы, которые используют.
Для сохранения файлов существует механизм закрепления (pinning). Есть несколько сценариев его использования:
Для надёжности следует использовать все способы и закреплять файлы на нескольких узлах. Чем больше узлов хранит файл, тем меньше вероятность того, что он пропадёт, если узел будет закрыт.
На данный момент единственным известным нам сервисом по фиксации файлов в IPFS, работающим в автоматическом режиме, является Pinata. Он предоставляет 1 ГБ бесплатно, сверх этого хранение стоит $0.15 в месяц за 1 ГБ.
Для доступа к файлам, размещённым в IPFS, требуется установка специального программного обеспечения. Расширение для веб-браузеров IPFS Companion делает опыт взаимодействия в веб-браузере со страницами из IPFS неотличимым от взаимодействия с обычными веб-страницами. IPFS Desktop позволяет рядовому пользователю легко использовать IPFS. Для администраторов серверов или для продвинутых пользователей возможна установка с помощью ipfs-update, из бинарных репозиториев или путём компиляции из исходного кода.
Необходимость установки программного обеспечения, даже если она не вызывает больших трудностей, сильно ограничивает потенциал IPFS. Для решения этой проблемы были придуманы шлюзы (gateways) -- обычные веб-сайты, которые отдают содержимое из 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/. Необходимо понимать, что использование сторонних шлюзов нивелирует преимущества IPFS. Одной из проблем сторонних шлюзов является то, что они без труда могут осуществить атаку MitM (man-in-the-middle), то есть подменить содержимое, однако это решается использованием собственного шлюза, поэтому вы вполне можете использовать IPFS для размещения серьёзных веб-сайтов и веб-приложений, не создавая неудобств для пользователей.
https://ipfs.github.io/public-gateway-checker/
Поскольку IPFS использует адресацию на основе содержимого, малейшее изменение полностью меняет адрес. Для того, чтобы иметь постоянную ссылку на меняющееся содержимое, поверх IPFS построена система IPNS (InterPlanetary Name System). Эта система очень простая. С использованием приватного ключа узел сообщает сети, что он хочет опубликовать по адресу, связанному с этим ключом, определённый CID. Эта привязка остаётся действительной некоторый промежуток времени, обычно сутки. Чтобы адрес оставался актуальным, требуется периодически повторно осуществлять эту операцию, что можно автоматизировать, например, с помощью Cron.
IPNS (InterPlanetary Name System)
К сожалению, этот процесс нельзя делегировать стороннему сервису, как это возможно в случае простого хранения файлов, не передавая ему свой приватный ключ. Однако, это позволяет раздавать веб-сайт, например, с постоянно включенного домашнего компьютера, даже е��ли он находится за NAT. Система IPNS ещё развивается. Возможно, в будущем это ограничение будет устранено.
В качестве примера приводим постоянный адрес веб-сайта Causa Arcana в IPNS (через шлюз):
https://k51qzi5uqu5ditckag7gw12c301kwxac5fpobs62i21uysuiry3bobotvbenmc.ipns.dweb.link
IPNS использует в качестве идентификатора CID. Это очень длинная и ничего не значащая для человека строка, её неудобно произносить вслух и вводить вручную. Благодаря DNSLink можно привязать содержимое IPFS к традиционному доменному имени. Например, веб-сайт https://Causa-Arcana.com работает через 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. В то же время, этот способ подразумевает привязку к традиционной системе доменных имён, которая является централизованной, в ней возможны цензура и изъятие домена.
Существует два вида идентификаторов содержимого:
Хотя CIDv0 всё ещё является стандартным для содержимого, помещаемого в IPFS, он плохо подходит для поддоменов, поскольку использует и заглавные, и строчные буквы, в то время как доменные имена не чувствительны к регистру.
Один и тот же идентификатор CIDv1 может использовать различные кодировки:
Именно CIDv1 с кодировкой Base36 используется для поддоменов.
Для преобразования между различными видами CID существует сервис
Вам потребуются операционная система на основе GNU/Linux, навыки работы в командной строке и
Для начала создадим простой веб-сайт, состоящий из двух страниц. Создайте пустую директорию в вашем домашнем каталоге и перейдите в неё:
$ 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 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%
Если вы точно следовали инструкциям и использовали случайные символы, то указанные в каждой строке после слова `added` CID у вас будут отличаться от представленных. Нас интересует последний CID (здесь это `Qmd8QkqLB6xu1p6n6C3bWvtspidsPbx1gJ81fvXQiLdu6s`). Наберите его в адресной строке вашего веб-браузера после адреса любого шлюза. Получится похожая ссылка: `https://ipfs.io/ipfs/Qmd8QkqLB6xu1p6n6C3bWvtspidsPbx1gJ81fvXQiLdu6s`. Если вы перейдёте по ней, вы увидите ваш веб-сайт. Ссылка с одной его страницы должна вести на вторую, и наоборот.
https://ipfs.io/ipfs/Qmd8QkqLB6xu1p6n6C3bWvtspidsPbx1gJ81fvXQiLdu6s