TL;DR: IPFS позволяет хостить статические сайты распределённо, доступ к которым можно осуществлять через публичные кеширующие гейты (прозрачные реверс-прокси) в интернете, без необходимости устанавливать программу посетителю. Такие сайты можно раздавать без маршрутизируемого («белого») статического IP-адреса (будет работать за NAT), они остаются работоспособными при кратковременном (несколько часов) отсутствии раздающих, за счет кеша на гейтах. К гейтам по желанию можно привязать свой домен, причём добавить DNS-записи можно на несколько гейтов одновременно, для повышения надёжности и балансировки нагрузки. Сайт могут скачать другие пользователи IPFS и помочь с раздачей.
IPFS отлично подходит для статических блогов, простых сайтов, файловых архивов (в качестве замены Bittorrent), а также просто для единовременной передачи больших файлов без предварительной загрузки их на какой-либо сервис.

Что такое IPFS?

IPFS — децентрализованная пиринговая система передачи файлов, по принципу работы похожая на BitTorrent, но с возможностью доступа через HTTP, для Web. Все скачиваемые пользователем файлы временно кешируются IPFS-демоном и раздаются другим пользователям, запрашивающим их. Важные файлы можно «прикрепить» (pin) к IPFS-демону, тогда они не исчезнут из кеша.
Добавляемые в IPFS файлы получают глобальные хеши-идентификаторы, которые не меняются при повторном добавлении файла. Адресация в сети осуществляется по идентификаторам контента (CID), внутри которых содержится мультихеш. В контексте IPFS, они указывают на неизменяющийся или изменяющийся файл, директорию, метаданные или симлинк.

На текущий момент развития, проект полноценно работает только со статическими данными, но уже имеется экспериментальная поддержка протокола типа издатель-подписчик (publish/subscribe), а также реализация IPFS на Javascript, работающая в браузере, что в перспективе позволит создавать динамические сайты (например, блоги с комментариями) с возможностью взаимодействия в реальном времени (например, чаты).

Одно из серьезных преимуществ IPFS в сравнении с другими подобными технологиями — доступ к ресурсам из интернета через гейты, которые устанавливают компании и энтузиасты технологии. Они позволяют просматривать сайты и скачивать файлы без установки IPFS на компьютер. Самый большой гейт — от Cloudflare, он также позволяет выпустить бесплатный HTTPS-сертификат для домена.

Зачем нужен IPFS, и где его применять?

Сеть позволяет эффективно, распределённо и децентрализованно раздавать и скачивать данные, в том числе из браузера. Я вижу следующие реальные применения проекту:

  1. Бесплатный бомж-хостинг статических веб-сайтов на домашнем компьютере, без выделенного IP-адреса (за NAT), без домена или с доменом;
  2. Не подконтрольный цензуре хостинг сайтов повышенного риска, которые могут быть заблокированы государством или сторонними компаниями в рамках DMCA;
  3. Раздача периодически меняющихся или добавляющихся данных, которые нельзя эффективно раздать через Bittorrent (придется постоянно пересоздавать torrent-файл и просить всех раздающих скачивать его заново, что ведёт к фрагментации сидов);
  4. Альтернатива CDN, не требующая настроек на стороне «CDN-провайдера».

Как создать сайт в IPFS?

Это проще, чем с обычным хостингом! Рассмотрим бомж-хостинг простого статического сайта.

Самый простой вариант — с использованием графической утилиты Siderus Orion.
Устанавливаем утилиту, запускаем, нажимаем File > Add Directory, выбираем директорию с файлами сайта.

Через какое-то время появится окно с информацией импортированного контента:
image

Переходим во вкладку «Files», нажимаем правой кнопкой мыши на хеш > Open in browser:
image

Если всё было сделано правильно, сайт откроется через гейт siderus.com:
https://siderus.io/ipfs/QmU8rJjkXbfkPqEE3Dr8GiUMKF1vPnnNUKWdaB5DsZDfJ7/

Это всё, ваш статический сайт доступен для других пользователей, пока вы держите запущенной программу, или пока он остается в кеше гейта.

Альтернативный консольный вариант — скачиваем официальный клиент go-ipfs, распаковываем, инициализируем и запускаем так, как написано на сайте:
ipfs init
ipfs daemon

Далее, добавляем нашу директорию с файлами сайта:
ipfs add -r ./www.uncleoutrage.com
…
added QmXdaairbPoSGV98sQ3GsEuevVTE1EBUzZ4PhbLfKVh1nX www.uncleoutrage.com/images/fanart
added QmdFbHdzzB4qBBkn8UsyHnjg1BKEtm9d5LaTyv5aZd8bbE www.uncleoutrage.com/images/gigs/thumbs
added QmVPJ3Mr8gZL5x15A9XARC1uHASqb2JMsKTT7mWs37UmBo www.uncleoutrage.com/images/gigs
added Qmd3AbVwMVE9W6ZSEuax96Xnymbnic4XVCdNEKBPZcWi5c www.uncleoutrage.com/images/live/thumbs
added QmebUfmT2wmZMbJcAmSMS4cZJr4guTqV67xNJ3hiQGsLYx www.uncleoutrage.com/images/live
added QmaEVaRiUUXfDnjjuXHGGsg7jDaFrCaxS7wi6q83q4N1uu www.uncleoutrage.com/images/misc/thumbs
added QmW2ZivQF5eh5LHSLet298AhKCHiQsFV6rvUFvMcCkLopo www.uncleoutrage.com/images/misc
added QmZXXn7abBvj7SvYJoYMAXUeajP6A1UABKENrNwuhKqofk www.uncleoutrage.com/images/promo/thumbs
added Qmcx6bMKur4Anzh91bJC6o5vMPftzocSMmd7iYxoGwQrNX www.uncleoutrage.com/images/promo
added QmW8P3ZnvKUytCWJF6y6wvBD8XAkk4bvJoVK8j3apokzLS www.uncleoutrage.com/images
added QmXG1QjfpCjErQBGZvF6VWBryXe9WFLPqhrsGWtikACVwR www.uncleoutrage.com/js
added QmYGXwLJBnqXwWYGKVtjZtmwncgwNoqNmnYqo1NTinTGBp www.uncleoutrage.com/theband/misc/pages
added QmWg4JyZ4ox9hcHt6JGBfzUm5CqWsb6DixUksamFvbirH4 www.uncleoutrage.com/theband/misc
added QmPtn9XBhWqe7A1z3ikktWExSPSM27LTzUL3US9N5xcAPB www.uncleoutrage.com/theband/redsaug21/pages
added QmaGV6kfLdL1bKGBBHYJLDVstiejAANayBZt16NMF9g9j9 www.uncleoutrage.com/theband/redsaug21
added QmScmcUAdC5pinMxaoLuXSy3FDUAX5E68dADnGjYZbPUiY www.uncleoutrage.com/theband
added QmU8rJjkXbfkPqEE3Dr8GiUMKF1vPnnNUKWdaB5DsZDfJ7 www.uncleoutrage.com

Последний хеш — хеш директории, он нам и нужен.

Составляем ссылку для открытия директории через гейт вручную, вида:
https://домен/ipfs/хеш

Например:
https://cloudflare-ipfs.com/ipfs/QmU8rJjkXbfkPqEE3Dr8GiUMKF1vPnnNUKWdaB5DsZDfJ7

Как привязать IPFS-хеш к домену?

Чтобы сделать веб-сайт доступным по домену https://uncleoutrage.com/, а не по длинной и некрасивой ссылке, необходимо добавить несколько DNS-записей:

  1. A и AAAA-записи, указывающие на IP-адрес гейта, либо CNAME-запись, указывающую на доменное имя гейта;
  2. TXT-запись "_dnslink", с содержимым вида «dnslink=/ipfs/HASH».

В моём случае, я добавил A и AAAA-записи, указывающие на IP-адреса cloudflare-ipfs.com, и TXT-запись "_dnslink.uncleoutrage.com":
uncleoutrage.com.  IN  A 104.18.252.167
uncleoutrage.com.  IN  A 104.18.255.167
uncleoutrage.com.  IN  AAAA 2400:cb00:2048:1::6812:fda7
uncleoutrage.com.  IN  AAAA 2400:cb00:2048:1::6812:40a8
_dnslink.uncleoutrage.com. IN TXT "dnslink=/ipfs/QmU8rJjkXbfkPqEE3Dr8GiUMKF1vPnnNUKWdaB5DsZDfJ7"

У Cloudflare можно получить HTTPS-сертификат для привязанного домена, его нужно запросить на специальной странице получения сертификата.
Если вам не нужна поддержка HTTPS, вы можете добавить сразу несколько A/AAAA-записей на разные гейты, актуальный список рабочих гейтов доступен на форуме проекта.
В случае обновления сайта, вам придётся обновить и TXT-запись домена.

Как не обновлять TXT-запись при обновлениях сайта?

IPFS позволяет сгенерировать специальный статичный хеш-идентификатор, указывающий на изменяющийся хеш — IPNS. В графическом клиенте достаточно нажать File > Publish to IPNS, и указывать в ссылке или в TXT-записи домена свой peer ID, а не хеш, полученный при добавлении директории. Например:
https://cloudflare-ipfs.com/ipns/QmV97DGqaaTVn54RH9CLTi9hxXfr57gJQ4zGtyHcVbtfH6

Однако, IPNS-запись нужно обновлять (публиковать) раз в несколько часов вручную, и резолвятся они заметно медленнее /ipfs/.

К слову, IPNS умеет резолвить не только CID, но и dnslink-записи домена — сайт можно открыть по ссылке вида https://cloudflare-ipfs.com/ipns/uncleoutrage.com.

Заключение

Если вы хотите узнать больше об IPFS — читайте цикл отличных статей ivan386. Они гиковские, и в них почти не рассказывается, зачем обычному человеку может потребоваться IPFS (иначе этой статьи бы не было).

Хотите помочь в раздаче IPFS-сайтов, или быть информированным о том, что домен привязан к IPFS-гейту? Устанавливайте браузерное дополнение (для Firefox, для Chrome), переадресующее IPFS-сайты на вашу локальную ноду.

Антизапрет уже несколько месяцев раздает терабайт PAC-файлов в сутки через IPFS, с использованием гейта Cloudflare. Работает стабильно, значительно экономит трафик сервера.

Комментарии (26)


  1. thauquoo
    10.12.2018 03:43

    Хочу отметить, что IPFS не является анонимной сетью, то есть, имея ссылку на данные, можно узнать IP узлов, которые хранят данные. К счастью, есть версия IPFS для I2P, которая позволяет скрыть физическое местонахождение нод, таким образом затрудняя цензуру.


    1. ValdikSS Автор
      10.12.2018 04:29

      Как и Bittorrent. Для IPFS существуют транспорты, например, есть транспорт для Tor: github.com/OpenBazaar/go-onion-transport
      Разработчики IPFS не хотят интегрироваться с анонимными сетями до того, как пройдут аудит безопасности.
      Я не слышал о версии IPFS для I2P. Где её взять?


  1. SDKiller
    10.12.2018 05:55

    Не подконтрольный цензуре хостинг сайтов...

    Просто будут блокировать публичные гейты целиком.


    1. foxyrus
      10.12.2018 09:05

      Да, для РКН не проблема заблочить весь Cloudflare.


    1. ValdikSS Автор
      10.12.2018 11:44

      Имелся в виду хостинг сайтов без гейтов, конечно. Гейт — временный костыль, пока пользователь не поставит себе IPFS-демон и расширение в браузер, а как поставит — блокировки не страшны.


      1. adictive_max
        10.12.2018 12:05

        пока пользователь не поставит себе IPFS-демон
        И тогда его можно будет ещё и за пособничество нарко-педо-экстримизму прижать… По числу сайтов в системе.


        1. ValdikSS Автор
          10.12.2018 12:06

          А когда доделают JS-IPFS, можно будет ему прямо на страницу браузера демон инжектить, при заходе на сайт!


          1. JekaMas
            10.12.2018 14:43

            Отличная новость!
            Из мира ethereum swarm ее не увидел. Спасибо!


  1. Tsvetik
    10.12.2018 11:22

    О спасибо.
    Давно хотел сделать сайт на IPFS


    1. ValdikSS Автор
      10.12.2018 21:21
      +1

      Посмотрите еще проект ZeroNet, он позволяет создавать динамические распределенные сайты, гибко управлять доступом, для него есть готовые движки блогов, форумов, чатов, видеохостингов, GIT-репозиториев, есть своя распределённая почта, провайдеры регистрации и аутентификации (а-ла oauth), классный интерфейс, и возможность работы через Tor.
      Одна проблема — он не приспособлен для доступа через гейты, и в него есть всего два рабочих.
      proxy.zeronet.a0z.ru


      1. ankh1989
        11.12.2018 10:20

        Если вкратце, то можно ли на его основе сделать распределённый форум тиба хабра чтобы клиентами были телефоны?


        1. ValdikSS Автор
          11.12.2018 11:47

          Да, там движок распределенных блогов уже есть — ZeroMedium, аналог medium.com. Он как бы объединяет множество разрозненных блогов, принадлежащих разным людям, в единый интерфейс, с помощью технологии объединения сайтов merger sites.
          В Play Store есть ZeroNet, должен работать.


          1. ankh1989
            12.12.2018 09:37

            Почитал про ZeroNet. Если я правильно понял, это способ сделать свой блог, опубликовать его хеш через торрент-трекер и позволить другим найти и скачать этот блог по его хешу. Всё написано на питоне. Возможности редактировать блог сообща там нет.

            То о чём я думаю это немного другое. Есть у нас каталог книг вроде либрусека. Сами книги там не хранятся, только их описание и комментарии к ним. Есть модераторы и админы, но их список не прибит гвоздями, а может меняться голосованием например. Может быть вообще так, что каталог книг есть, а модераторов нет и удалять ничего нельзя. Нет даже админа с приватным ключом который мог бы что то поменять. Судя по всему в рамках ZeroNet такую штуку сделать нельзя.


  1. netricks
    10.12.2018 11:37

    Благодарю за статью. IPFS очень интересен.


  1. ton1
    10.12.2018 11:49

    Последнююю фразу статьи нужно было ставить первой. Большинство народу не почешется пока им денежкой не помашешь ;)

    Хотелось бы добавить альтернативную идею по развитию этого направления — на волне недавнего бана прона на тумблере, переезд всех заинтересованных в распределенные сети например одна из fediverse систем + хостинг собственно картинок в ipfs. При наличии халявных хостингов как в статье это все становится более-менее подьемным.


    1. ValdikSS Автор
      10.12.2018 12:04

      Он не «халявный», файлы всё-равно нужно где-то хранить. В IPFS планируется интеграция с Filecoin — криптовалютой, созданной для хранения файлов. Платишь небольшое количество валюты — твои файлы в IPFS хранит кто-то другой какое-то время.

      Интересная концепция была у хостинга файлов glop.me — файлы загружались в IPFS в единую директорию, и любой мог периодически делать ipfs pin add директория, чтобы скачать себе все загруженные файлы и помочь в их хранении раздаче.


  1. ankh1989
    10.12.2018 12:19

    Однозначно плюс за статью и за популяризацию. IPFS это крутая идея, но им решительно не хватает денег и времени, поэтому разработка движется со скоростью улитки. Состояние дел на сегодня это два клиента — Go и JS — которые жрут память и CPU как не в себя, не очень умеют в NAT и JS версия делает DHT уже второй год. Всё делается крошечными шагами когда/если у разработчиков есть на это время.


    1. ValdikSS Автор
      10.12.2018 12:53

      go-ipfs с версии 0.4.18 больше не течёт, больше 600 МБ RAM не потребляет у меня, процессор особо не нагружает. NAT нормально пробивает, пробовал добавить уникальные файлы и открыть их через гейт — работает, хоть и первое открытие занимает десятки секунд.


  1. netricks
    10.12.2018 13:04

    И вновь встаёт вопрос об универсальных ссылках в браузерах.


    1. ValdikSS Автор
      10.12.2018 13:12

      Если у вас установлено браузерное расширение, то оно поймёт, что ссылка указывает на IPFS-хеш, и откроет её локальным демоном или работающим гейтом.
      В перспективе будут использоваться схемы ipfs:// и dweb:/, см. github.com/ipfs/in-web-browsers/blob/master/ADDRESSING.md

      Если вы хотите вставить, например, картинку, то в HTML5 можно указать несколько её источников с помощью тега source.


      1. netricks
        10.12.2018 13:13

        Спасибо. Я был неуклюж и случайно потёр пост, на который вы отвечали.


        1. ValdikSS Автор
          10.12.2018 13:14

          Текст был следующий:

          Меня беспокоит такое обстоятельство. Я могу дать доступ к документу в ipfs через один из гейтов, например cloudflare-ipfs.com/ipfs/QmSUYxtRRHyCpTJn4RxU8vcj9T23wZmjxHke7mBjWkPu8u.
          Но если cloudflare убьёт гейт, то все ссылки протухнут.


      1. netricks
        10.12.2018 13:17

        Нужно будет внимательно изучить эти методы.
        P.S. Нет ли информации о том, собираются ли как-то стандартизовать эти решения с добавлением их непосредственно в браузеры в ближайшее время?


        1. ValdikSS Автор
          10.12.2018 13:24

          Сомневаюсь, что это произойдет в ближайшем будущем, но Mozilla движется в этом направлении: hacks.mozilla.org/2018/08/dweb-building-cooperation-and-trust-into-the-web-with-ipfs
          Также, есть браузеры, нацеленные на доступ к p2p-ресурсам: Breaker Browser, Brave Browser.


  1. bro-dev0
    10.12.2018 19:31

    Учитывая тенденции к утолщению клиентов мб выстрелит.


    1. ValdikSS Автор
      10.12.2018 21:14

      Причём здесь это?