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 полностью другой.
Как работает получение
- Клиент хочет CID
Qm.... - Спрашивает DHT: «кто хостит этот CID?». Ответ — список providers (peer ID).
- Подключается к providers через libp2p.
- Скачивает блоки через Bitswap — протокол обмена блоками (похож на BitTorrent).
- Проверяет что хеш скачанного = CID. Если да — сохраняет локально.
- Теперь сам становится провайдером — другие могут скачать с него.
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-сервису:
- Pinata, web3.storage, Filebase — коммерческие.
- Filecoin — блокчейн, где майнеры платятся крипто-токенами за долгосрочное хранение.
- Filbase, 4EVERLAND.
Установка
$ 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, деанонимизация |
Использование
- NFT-метаданные. OpenSea, Foundation хранят JSON и картинки на IPFS.
- Веб-сайты. ENS-домены + IPFS дают censorship-resistant хостинг.
- Wikipedia — Turkish Wikipedia дублировалась в IPFS во время блокировки в Турции.
- Archive.org — экспериментирует с IPFS-зеркалом.