IPFS

IPFS (InterPlanetary File System) — P2P-протокол для хранения и распространения контента. Основные идеи: content-addressing (файл идентифицируется хешем содержимого, а не адресом), распределённость (кто угодно может быть узлом), иммутабельность (файл под своим CID никогда не изменится). Создан Protocol Labs, представлен в 2015.

Content Identifier (CID)

QmPChd2hVbrJ6bfo3WBcTW4iZnpHm8TEzWkLHmLpXhF68A       # CIDv0, base58, SHA-256
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi  # CIDv1, base32

CID = хеш содержимого + метаданные (алгоритм, версия). Один и тот же файл всегда даёт один CID. Изменил один байт — CID полностью другой.

Как работает получение

  1. Клиент хочет CID Qm....
  2. Спрашивает DHT: «кто хостит этот CID?». Ответ — список providers (peer ID).
  3. Подключается к providers через libp2p.
  4. Скачивает блоки через Bitswap — протокол обмена блоками (похож на BitTorrent).
  5. Проверяет что хеш скачанного = CID. Если да — сохраняет локально.
  6. Теперь сам становится провайдером — другие могут скачать с него.

Merkle-DAG

Большой файл разбивается на блоки (обычно 256 КБ), каждый со своим CID. Корневой блок содержит список CID детей — так строится Merkle-DAG (directed acyclic graph). Если блок X ссылается на Y, то CID X зависит от CID Y — любое изменение поднимается наверх.

Директории — тоже DAG: {name: 'foo.txt' → CID_foo, name: 'bar.txt' → CID_bar}.

Gateways

Чтобы обычные браузеры могли читать IPFS без установки клиента — HTTP-gateway:

https://ipfs.io/ipfs/QmPChd2hVbrJ6bfo3WBcTW4iZnpHm8TEzWkLHmLpXhF68A
https://cloudflare-ipfs.com/ipfs/QmPCh...
https://dweb.link/ipfs/QmPCh...

Gateway — обычный HTTP-сервер, который сам качает из IPFS-сети и отдаёт клиенту. Brave-браузер имеет встроенный IPFS-клиент.

IPNS — мутабельные ссылки

Проблема: CID иммутабельно, а сайты обновляются. IPNS — «указатель на CID», обновляемый владельцем ключа:

ipns://k51qzi5uqu5dib8t...   # публичный ключ = адрес

Владелец публикует: "ключ k51... сейчас указывает на Qm..."
Клиенты резолвят через DHT.

Медленно (DHT-lookup). Альтернатива — DNSLink: TXT-запись в DNS.

DNSLink

_dnslink.example.com. TXT "dnslink=/ipfs/Qm..."

Тогда работает ipfs://example.com — быстро (обычный DNS).

Pinning

По умолчанию скачанное живёт временно, потом сборка мусора удаляет. Чтобы гарантировать что файл останется — pin его. Или заплатить pinning-сервису:

Установка

$ curl -L https://dist.ipfs.tech/kubo/latest/kubo_v0.29.0_linux-amd64.tar.gz | tar xz
$ cd kubo && sudo ./install.sh
$ ipfs init
$ ipfs daemon

# в другом терминале
$ echo "hello" | ipfs add
added QmPChd2hVbrJ6bfo3WBcTW4iZnpHm8TEzWkLHmLpXhF68A  QmPCh...
$ ipfs cat QmPCh...
hello

Плюсы и минусы

ПлюсМинус
ЦензуроустойчивостьНельзя удалить если хоть один pinНельзя удалить если утекло
ДедупликацияОдинаковые файлы = один CID
Каноничность ссылокОдна ссылка = одно содержимое навсегдаОбновлять только через IPNS
СкоростьМожет быть быстрее HTTP при популярном контентеDHT-lookup медленный (секунды)
ПриватностьВсе запросы видны в DHT, деанонимизация

Использование

См. также