Інтеграція з Pinata для IPFS: завантаження та керування файлами

Уявіть: ви випускаєте колекцію з 10 000 NFT. Метадані — JSON із зображеннями — лежать на сервері, але при піку трафіку сайт падає, IPFS-шлюзи перевантажені. Ви переходите на IPFS, але без піннінгу файли зникають. Pinata — managed pinning service, який гарантує доступність. Однак інтеграція потребує

Напрямки блокчейн-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1450
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1004
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1270
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1011

Уявіть: ви випускаєте колекцію з 10 000 NFT. Метадані — JSON із зображеннями — лежать на сервері, але при піку трафіку сайт падає, IPFS-шлюзи перевантажені. Ви переходите на IPFS, але без піннінгу файли зникають. Pinata — managed pinning service, який гарантує доступність. Однак інтеграція потребує розуміння API, керування CID та резервування. Ми підключаємо Pinata за 2-3 дні, забезпечуючи uptime 99.9% для ваших метаданих.

IPFS використовує контентну адресацію: хеш файлу — його адреса. Але якщо жоден вузол не зберігає файл, він недоступний. Pinata вирішує цю проблему, підтримуючи файли на своїх серверах і надаючи API для завантаження, керування та видалення. Ми реалізували понад 20 таких інтеграцій для NFT-проектів, DeFi-додатків та децентралізованих сховищ, обробляючи до 100 000 файлів на проект.

Референс: IPFS — протокол, що лежить в основі.

Основні проблеми, які вирішує інтеграція

Доступність метаданих — ключова проблема. Без піннінгу NFT-метадані можуть зникнути, що порушує стандарти ERC-721/1155. Pinata гарантує uptime 99.9% для запіннених файлів. Швидкість завантаження через dedicated gateway у 3-5 разів вища за публічний gateway.pinata.cloud. Керування колекціями: за допомогою pinataMetadata.keyvalues легко знаходити файли за проектом або типом — це спрощує обслуговування кількох колекцій одночасно.

Як завантажувати файли на IPFS через Pinata?

Завантаження файлів через Pinata API

const PINATA_JWT = process.env.PINATA_JWT!; // из dashboard.pinata.cloud // Загрузка файла async function uploadFile(fileBuffer: Buffer, filename: string): Promise<string> { const formData = new FormData(); formData.append('file', new Blob([fileBuffer]), filename); formData.append('pinataMetadata', JSON.stringify({ name: filename })); formData.append('pinataOptions', JSON.stringify({ cidVersion: 1 })); const response = await fetch('https://api.pinata.cloud/pinning/pinFileToIPFS', { method: 'POST', headers: { Authorization: `Bearer ${PINATA_JWT}` }, body: formData, }); const data = await response.json(); return data.IpfsHash; // CIDv1 хеш } // Загрузка JSON (для NFT metadata) async function uploadJson(metadata: object, name: string): Promise<string> { const response = await fetch('https://api.pinata.cloud/pinning/pinJSONToIPFS', { method: 'POST', headers: { Authorization: `Bearer ${PINATA_JWT}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ pinataContent: metadata, pinataMetadata: { name }, pinataOptions: { cidVersion: 1 }, }), }); const data = await response.json(); return data.IpfsHash; } 

NFT metadata workflow

Стандартний ERC-721/ERC-1155 workflow:

// 1. Загружаем изображение const imageCid = await uploadFile(imageBuffer, 'nft-image.png'); // 2. Формируем metadata по ERC-721 Metadata Standard const metadata = { name: 'My NFT #1', description: 'Description here', image: `ipfs://${imageCid}`, // ipfs:// URI, не https:// attributes: [ { trait_type: 'Background', value: 'Blue' }, { trait_type: 'Rarity', value: 'Rare' }, ], }; // 3. Загружаем metadata const metadataCid = await uploadJson(metadata, 'nft-1-metadata.json'); // 4. tokenURI = ipfs://{metadataCid} // В контракте: tokenURI(tokenId) возвращает ipfs://{metadataCid} 

Використовуйте ipfs:// URI в контракті, не https://gateway.pinata.cloud/ipfs/. Gateway може змінюватися або бути недоступним — ipfs:// URI працює з будь-яким gateway.

Чому варто використовувати dedicated gateway?

Dedicated gateway (платна опція) значно швидший за публічний: він використовує кешування та білі списки. Для NFT маркетплейсів, де користувачі завантажують зображення, це критично — знижує навантаження та прискорює відображення. Офіційна документація Pinata рекомендує dedicated gateway для production-проектів.

Як тегувати файли для керування?

При завантаженні передавайте pinataMetadata.keyvalues. Наприклад: { project: 'my-nft-collection', type: 'image' }. Потім через API pinList можна фільтрувати за цими ключами. Це зручно при роботі з кількома проектами. Ми використовуємо такий підхід для проектів з десятками тисяч файлів — мітки дозволяють швидко знайти та оновити потрібні елементи.

Метод Тип даних Швидкість Приклад використання
pinFileToIPFS Бінарні файли (зображення, відео) Середня Завантаження NFT-зображень
pinJSONToIPFS JSON-об'єкти Висока Метадані NFT
pinByHash Існуючий CID Миттєво Перенесення даних з інших сервісів

Чому важливо дублювати CID?

Pinata — централізований сервіс. Для довготривалої надійності дублюйте критичні CID у Filecoin через NFT.Storage або web3.storage, або тримайте власну IPFS ноду з ipfs pin add {cid}.

# Власна IPFS нода як додаткове сховище ipfs pin add bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi 

CID однаковий скрізь — якщо файл є хоча б у однієї ноди в мережі, він досяжний. Два pinning-провайдери = подвійна надійність. Ми рекомендуємо таку схему для проектів з високими вимогами до доступності.

Провайдер Тип Доступність Особливості
Pinata Managed pinning service Висока Швидкий dedicated gateway, API, груповий пін
NFT.Storage Filecoin Децентралізована Безкоштовно (обмеження за об'ємом)
Власна нода IPFS node Повний контроль Потребує адміністрування

Процес роботи

  1. Аналіз вимог: визначаємо об'єм файлів, структуру метаданих, необхідні функції (груповий пін, резервування).
  2. Проектування: обираємо тариф Pinata, налаштовуємо JWT та dedicated gateway.
  3. Інтеграція API: пишемо скрипти завантаження, пакетної обробки, керування ключами.
  4. Тестування: симулюємо завантаження 100+ файлів, перевіряємо доступність та швидкість.
  5. Деплой та документація: передаємо код, навчаємо команду.

Строки: від 2 до 5 робочих днів залежно від складності. Вартість розраховується індивідуально. Отримайте консультацію — оцінимо об'єм вашого проекту.

Що входить у роботу

  • Налаштування Pinata JWT та dedicated gateway
  • Інтеграція API завантаження файлів (pinFileToIPFS, pinJSONToIPFS)
  • Скрипти для пакетного завантаження та керування метаданими
  • Реалізація ERC-721/1155 з ipfs:// URI
  • Документація коду, навчання команди по роботі з Pinata
  • Гарантія підтримки протягом місяця після здачі

Замовте інтеграцію під ключ з резервуванням — ми допоможемо обрати оптимальну схему піннінгу.

Pinata SDK (v2)

import { PinataSDK } from 'pinata'; const pinata = new PinataSDK({ pinataJwt: process.env.PINATA_JWT!, pinataGateway: process.env.PINATA_GATEWAY!, // yourname.mypinata.cloud }); // Загрузка из URL const upload = await pinata.upload.url('https://example.com/image.png'); console.log(upload.cid); // Получение файла через dedicated gateway const url = await pinata.gateways.convert(`ipfs://${cid}`); // → https://yourname.mypinata.cloud/ipfs/{cid} 

Dedicated gateway (платна опція) значно швидший за публічний gateway.pinata.cloud — важливо для NFT маркетплейсів, де зображення завантажуються користувачами.

Груповий пін та керування колекціями

// Список запіннених файлів з фільтрацією async function listPins(keyValues?: Record<string, string>) { const params = new URLSearchParams({ status: 'pinned', pageLimit: '100', ...(keyValues ? { 'metadata[keyvalues]': JSON.stringify(keyValues) } : {}), }); const response = await fetch( `https://api.pinata.cloud/data/pinList?${params}`, { headers: { Authorization: `Bearer ${PINATA_JWT}` } } ); return response.json(); } // Анпін файлу (звільняє сховище) async function unpinFile(cid: string) { await fetch(`https://api.pinata.cloud/pinning/unpin/${cid}`, { method: 'DELETE', headers: { Authorization: `Bearer ${PINATA_JWT}` }, }); } 

Використовуйте pinataMetadata.keyvalues для тегування файлів за проектом або колекцією — потім зручно фільтрувати та керувати зберіганням.

Локальне резервування

Для довготривалої надійності дублюйте критичні CID в інші сервіси. Це гарантує доступність навіть при недоступності Pinata. Замовте інтеграцію під ключ з резервуванням — забезпечте збереження ваших даних.