Налаштування зберігання метаданих NFT на IPFS
IPFS — content-addressed хранилище: адреса файлу (CID) — це хеш його вмісту. Змінити файл за тією ж адресою неможливо — це фундаментальне властивість робить IPFS правильним вибором для NFT метаданих. Якщо контракт зберігає ipfs://QmXxx... у tokenURI — арт та метаданні привязані до конкретного вмісту навіки.
Структура метаданих та пиннінг
Що й як загружаємо
Стандартний набір для NFT-коллекції:
-
images/— PNG/WebP файли токенів, 1000x1000px мінімум -
metadata/— JSON файли, по одному на токен - Опційно: анімації (MP4/WebM), 3D моделі (GLB)
Кожен JSON метаданих містить поле image з IPFS URI зображення. Загружаємо в два етапи: спочатку загружаємо папку з зображеннями, отримуємо CID директорії, потім генеруємо JSON з цим CID у полях image, загружаємо папку JSON. Так IPFS CID метаданих фіксований та містить посилання на фіксовані зображення — повна цепочка immutability.
Пиннінг: чому він критичний
IPFS за замовчуванням видаляє файли через garbage collection, якщо на них немає active pin. Без пиннінгу файли існують лише поки кхтось активно їх запитує. Для NFT це неприйнятно.
Pinata — найпоширеніший сервіс. API для програмного пиннінгу, виділені gateway URLs, підтримка IPFS + Arweave. Є безплатний tier для тестування.
NFT.Storage (тепер nft.storage/storacha) — безплатне зберігання NFT даних через Filecoin. Надійне довгострокове зберігання, але менш гнучко в API.
Web3.Storage — Filecoin-backed зберігання з HTTP gateway. Альтернатива для тих, хто хоче redundancy через Filecoin deals.
Для серйозних коллекцій рекомендуємо double-pin: Pinata + Arweave. Arweave — permanent storage з одноразовою оплатою, дані зберігаються навіки через endowment механізм. Вартість — ~$5-15 за GB. Для коллекції на 10 000 токенів з 5 MB зображеннями — ~$300 за вічне зберігання.
Практична налаштування
Скрипт загрузки через Pinata API (Node.js):
import { PinataSDK } from "pinata";
const pinata = new PinataSDK({ pinataJwt: process.env.PINATA_JWT });
// Upload images folder
const imagesUpload = await pinata.upload.folder("./images");
const imagesCID = imagesUpload.IpfsHash;
// Generate and upload metadata
const metadata = tokens.map((id) => ({
name: `Collection #${id}`,
image: `ipfs://${imagesCID}/${id}.png`,
attributes: traits[id]
}));
const metaUpload = await pinata.upload.folder(metadata, { name: "metadata" });
CID з metaUpload.IpfsHash — це те, що йде в baseURI контракту.
Перевірка доступності
Після загрузки перевіряємо доступність через публічні IPFS gateway (cloudflare-ipfs.com, ipfs.io). Важливо: не захардкодуйте конкретний gateway в контракті — тільки ipfs://CID/. Маркетплейси (OpenSea, Blur) самі резолвять IPFS URI через свої gateway.
Ориєнтири по термінах
Налаштування пиннінгу та загрузка метаданих для готової коллекції — 1 робочий день. Включає: upload зображень, генерацію JSON, пиннінг на Pinata + backup Arweave, перевірку доступності через gateway, передачу CID для контракту.







