Настройка децентрализованного хранения данных
Децентрализованное хранилище нужно не всегда и не везде. NFT метаданные на централизованном сервере — это реальная проблема (если сервер ляжет, NFT потеряет изображение). Документы для DAO-голосования на IPFS — обоснованно. Пользовательские сессии на Filecoin — избыточно. Начнём с того, когда это реально нужно.
IPFS: стандарт для Web3 контента
IPFS (InterPlanetary File System) — content-addressed хранилище. Файлы идентифицируются по CID (Content Identifier) — хешу содержимого. Ключевое свойство: один и тот же файл имеет один и тот же CID везде. Это делает ссылки иммутабельными и верифицируемыми.
Проблема "pinning"
IPFS не гарантирует хранение. Файл существует пока кто-то его "пинит" (держит у себя). Если вы просто загрузили через ipfs add — через несколько дней garbage collector может удалить файл с вашей ноды, и если больше никто не пинит — файл исчезнет.
Решения:
Pinning services:
- Pinata — наиболее популярный, REST API, удобный dashboard, $0 до 1 GB
- web3.storage (от Protocol Labs) — бесплатный tier, хранение в Filecoin под капотом
- Infura IPFS — для команд уже использующих Infura
import { PinataSDK } from 'pinata'
const pinata = new PinataSDK({ pinataJwt: process.env.PINATA_JWT })
// Загрузка файла
const upload = await pinata.upload.file(file)
console.log(upload.IpfsHash) // CID: Qm... или bafy...
// Загрузка JSON метаданных (NFT стандарт)
const metadata = await pinata.upload.json({
name: "My NFT",
description: "...",
image: `ipfs://${imageCID}`
})
Self-hosted IPFS нода с Kubo:
ipfs init
ipfs daemon &
ipfs pin add QmYwAPJzv5CZsnA... # пинить конкретный CID
Для production — нода с достаточным диском + пинирование всего контента вашего приложения. Комбинация self-hosted + один pinning service как backup — разумный минимум.
IPFS Gateway
Браузеры не понимают ipfs:// нативно (Brave — исключение). Для пользователей нужен HTTP gateway:
-
https://ipfs.io/ipfs/{CID}— публичный, медленный -
https://gateway.pinata.cloud/ipfs/{CID}— быстрее для пинированного контента - Собственный gateway —
ipfs daemonумеет работать как gateway на порту 8080
Для NFT маркетплейсов — собственный gateway обязателен. Зависимость от ipfs.io нарушает decentralization.
Filecoin: гарантированное долгосрочное хранение
IPFS — протокол адресации. Filecoin — экономический слой поверх него. Провайдеры хранения (Storage Providers) получают FIL за хранение данных по верифицируемым deal-контрактам.
Напрямую работать с Filecoin сложно: нужны deals, минимальный размер хранения, специфичный API. На практике используют абстракции:
Lighthouse — простой API для хранения на Filecoin, работает как pinning service:
import lighthouse from '@lighthouse-web3/sdk'
const response = await lighthouse.upload('./path/to/file', API_KEY)
console.log(response.data.Hash) // CID
// Данные автоматически хранятся в Filecoin сделках
estuary (deprecated) / w3s (web3.storage) — аналогичный подход.
Filecoin оправдан для: долгосрочных архивов, данных DAO, compliance-чувствительных документов где нужна proof of storage.
Arweave: "заплати раз, храни вечно"
Arweave — принципиально другой подход. Разовый платёж покрывает хранение навсегда (математически: 200 лет с текущими размерами цепи). Используется Active Storage Model — AR токен.
Стоимость: ~$5–10 за GB (меняется с ценой AR). Для небольших NFT коллекций — очень привлекательно по сравнению с ежемесячными платежами.
Bundlr (теперь Irys) — абстракция над Arweave, мультивалютная оплата (ETH, SOL, MATIC вместо AR):
import Irys from '@irys/sdk'
const irys = new Irys({
network: 'mainnet',
token: 'ethereum',
key: process.env.PRIVATE_KEY
})
const response = await irys.uploadFile('./nft-image.png')
console.log(`https://arweave.net/${response.id}`)
Arweave — первый выбор для NFT изображений и постоянных on-chain данных. Solana NFT экосистема (Metaplex) исторически использует Arweave.
Storj и Sia: зашифрованное P2P хранение
Storj — enterprise-grade децентрализованное хранилище с S3-совместимым API. Данные шифруются и разделяются по нодам сети. Для приложений которым нужна замена S3 с privacy гарантиями:
import { S3Client } from '@aws-sdk/client-s3'
const client = new S3Client({
endpoint: 'https://gateway.storjshare.io',
credentials: { accessKeyId: KEY, secretAccessKey: SECRET },
region: 'us-east-1'
})
// Далее стандартный AWS S3 SDK
Выбор хранилища: матрица решений
| Use case | Решение | Причина |
|---|---|---|
| NFT изображения | Arweave / IPFS + Pinata | Постоянность, стандарт индустрии |
| NFT метаданные JSON | Arweave / IPFS | То же |
| DAO документы | IPFS + Filecoin | Верифицируемость + долгосрочность |
| Пользовательский контент (UGC) | IPFS + self-hosted gateway | Гибкость, контроль |
| Приватные зашифрованные данные | Storj | S3-совместимость, шифрование |
| Архивы, compliance | Filecoin | Proof of storage |
Что настраивается за 1–3 дня
Выбор и настройка хранилища под ваш use case, интеграция SDK в бэкенд или смарт-контракты (CID в контракте вместо HTTP URL), настройка IPFS gateway (self-hosted или через CDN), upload pipeline для NFT контента (изображение → CID → метаданные JSON → CID → mint), автоматическое пинирование новых файлов.







