· Nacho Coll · Guides  · 8 dk okuma

NFT Meta Veri Depolama: NFT Yaratıcıları için Eksiksiz IPFS Kılavuzu

NFT meta verilerini IPFS üzerinde depolamak için adım adım kılavuz. ERC-721 tokenURI desenleri, Python ve JavaScript örnekleri içerir.

NFT meta verilerini IPFS üzerinde depolamak için adım adım kılavuz. ERC-721 tokenURI desenleri, Python ve JavaScript örnekleri içerir.

NFT oluşturmak yalnızca akıllı sözleşme dağıtımından çok daha fazlasını gerektirir — meta verileriniz ve varlıklarınız için güvenilir, merkeziyetsiz depolama gerekir. Bu kapsamlı kılavuz, endüstri en iyi uygulamalarını kullanarak NFT meta verilerini IPFS’te depolamaya, Python ve JavaScript geliştiriciler için tam kod örnekleriyle birlikte adım adım rehberlik eder.

IPFS Ninja

NFT Meta Veri Depolama için Neden IPFS?

Geleneksel web barındırma, NFT projeleri için merkezileşme riski oluşturur. Meta veriler geleneksel sunucularda bulunduğunda, barındırma hizmeti çökerse veya URL’leri değiştirirse NFT’ler “bozulabilir”. IPFS (InterPlanetary File System) bunu şu özellikleri sağlayarak çözer:

  • Değişmez içerik adreslemesi: Her dosya, asla değişmeyen benzersiz bir Content Identifier (CID) alır
  • Merkeziyetsiz depolama: İçerik dünya çapında birden fazla düğümde bulunur
  • Kriptografik doğrulama: Dosya bütünlüğü içerik karması yoluyla garanti edilir
  • Geleceğe yönelik URL’ler: IPFS bağlantıları süresiz çalışır, uzun vadeli değeri korur

IPFS temellerinin daha derin bir anlayışı için IPFS pinning nedir kılavuzumuzu inceleyin.

ERC-721 Meta Veri Yapısını Anlama

ERC-721 standardı, NFT meta verilerinin nasıl yapılandırılması gerektiğini tanımlar. Akıllı sözleşmenizin tokenURI fonksiyonu, aşağıdaki desene uygun JSON meta verilerine işaret eden bir URL döndürür:

{
  "name": "My Amazing NFT #1",
  "description": "A unique digital artwork showcasing...",
  "image": "ipfs://QmYourImageCIDHere",
  "attributes": [
    {
      "trait_type": "Background",
      "value": "Blue"
    },
    {
      "trait_type": "Rarity",
      "value": "Common"
    }
  ],
  "external_url": "https://yourproject.com/token/1"
}

Anahtar Meta Veri Alanları

  • name: Cüzdanlarda ve pazaryerlerinde gösterilen NFT’nin başlığı
  • description: NFT hakkında ayrıntılı bilgi
  • image: Ana görsel varlığa IPFS URL’si
  • attributes: Filtreleme ve nadirlik hesaplamaları için özellik tabanlı özellikler
  • external_url: Ek içeriklere veya proje web sitenize isteğe bağlı bağlantı

Adım Adım IPFS NFT Depolama Süreci

Adım 1: Varlıklarınızı ve Meta Verilerinizi Hazırlayın

Herhangi bir şey yüklemeden önce dosyalarınızı düzenleyin:

  1. Ana varlıklar: Görseller, videolar veya diğer birincil içerikler
  2. Meta veri dosyaları: Her NFT’yi açıklayan JSON dosyaları
  3. Koleksiyon meta verileri: İsteğe bağlı koleksiyon düzeyinde bilgiler

Adım 2: Varlıkları IPFS’e Yükleyin

Ana NFT varlıklarınızı (görseller, videolar vb.) yükleyerek IPFS CID’lerini alın. Bu CID’lere meta veri JSON dosyalarınızda referans vereceksiniz.

İşte Python kullanarak bir görsel yüklemenin yolu:

import requests
import base64
import json

def upload_image_to_ipfs(image_path, api_key):
    """Upload an image file to IPFS and return its CID"""
    
    # Read and encode image
    with open(image_path, 'rb') as f:
        image_data = base64.b64encode(f.read()).decode('utf-8')
    
    # Prepare upload payload
    payload = {
        "content": image_data,
        "description": f"NFT Asset: {image_path}"
    }
    
    headers = {
        "Content-Type": "application/json",
        "X-Api-Key": api_key
    }
    
    # Upload to IPFS.NINJA
    response = requests.post(
        "https://api.ipfs.ninja/upload/new",
        headers=headers,
        json=payload
    )
    
    if response.status_code == 200:
        result = response.json()
        print(f"✅ Image uploaded successfully!")
        print(f"CID: {result['cid']}")
        print(f"IPFS URL: {result['uris']['ipfs']}")
        print(f"Gateway URL: {result['uris']['url']}")
        return result['cid']
    else:
        print(f"❌ Upload failed: {response.text}")
        return None

# Example usage
API_KEY = "bws_1234567890abcdef1234567890abcdef"  # Replace with your actual key
image_cid = upload_image_to_ipfs("my-nft-artwork.png", API_KEY)

Adım 3: Meta Veri JSON’ını Oluşturun ve Yükleyin

Varlık CID’lerinizi aldıktan sonra meta veri JSON dosyalarını oluşturun ve yükleyin:

def create_and_upload_metadata(name, description, image_cid, attributes, api_key):
    """Create NFT metadata JSON and upload to IPFS"""
    
    # Create metadata object
    metadata = {
        "name": name,
        "description": description,
        "image": f"ipfs://{image_cid}",
        "attributes": attributes
    }
    
    # Convert to JSON string and encode
    metadata_json = json.dumps(metadata, indent=2)
    metadata_b64 = base64.b64encode(metadata_json.encode('utf-8')).decode('utf-8')
    
    # Upload metadata
    payload = {
        "content": metadata_b64,
        "description": f"NFT Metadata: {name}",
        "metadata": {
            "contentType": "application/json",
            "nftTokenId": name.split('#')[1] if '#' in name else "1"
        }
    }
    
    headers = {
        "Content-Type": "application/json",
        "X-Api-Key": api_key
    }
    
    response = requests.post(
        "https://api.ipfs.ninja/upload/new",
        headers=headers,
        json=payload
    )
    
    if response.status_code == 200:
        result = response.json()
        print(f"✅ Metadata uploaded successfully!")
        print(f"Metadata CID: {result['cid']}")
        return result['cid']
    else:
        print(f"❌ Metadata upload failed: {response.text}")
        return None

# Example usage
attributes = [
    {"trait_type": "Background", "value": "Cosmic Blue"},
    {"trait_type": "Eyes", "value": "Laser"},
    {"trait_type": "Rarity", "value": "Epic"}
]

metadata_cid = create_and_upload_metadata(
    name="Cosmic Warrior #001",
    description="A fierce warrior from the distant galaxies, wielding the power of stars.",
    image_cid=image_cid,
    attributes=attributes,
    api_key=API_KEY
)

Adım 4: JavaScript Uygulaması

Web uygulamaları veya Node.js projeleri için JavaScript eşdeğeri:

class NFTStorage {
    constructor(apiKey) {
        this.apiKey = apiKey;
        this.baseUrl = 'https://api.ipfs.ninja';
    }
    
    async uploadFile(fileContent, description) {
        const payload = {
            content: fileContent, // base64 encoded
            description: description
        };
        
        const response = await fetch(`${this.baseUrl}/upload/new`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'X-Api-Key': this.apiKey
            },
            body: JSON.stringify(payload)
        });
        
        if (!response.ok) {
            throw new Error(`Upload failed: ${response.statusText}`);
        }
        
        return await response.json();
    }
    
    async uploadImageFromFile(file) {
        return new Promise((resolve, reject) => {
            const reader = new FileReader();
            reader.onload = async (e) => {
                try {
                    const base64Content = e.target.result.split(',')[1]; // Remove data:image/...;base64, prefix
                    const result = await this.uploadFile(base64Content, `NFT Image: ${file.name}`);
                    resolve(result.cid);
                } catch (error) {
                    reject(error);
                }
            };
            reader.readAsDataURL(file);
        });
    }
    
    async uploadMetadata(name, description, imageCid, attributes = []) {
        const metadata = {
            name,
            description,
            image: `ipfs://${imageCid}`,
            attributes
        };
        
        const metadataJson = JSON.stringify(metadata, null, 2);
        const base64Metadata = btoa(metadataJson);
        
        const result = await this.uploadFile(base64Metadata, `NFT Metadata: ${name}`);
        return result.cid;
    }
}

// Usage example
const storage = new NFTStorage('bws_1234567890abcdef1234567890abcdef'); // Replace with your key

// Upload process
async function createNFT() {
    try {
        // Assuming you have a file input element
        const fileInput = document.getElementById('nft-image');
        const imageFile = fileInput.files[0];
        
        console.log('Uploading image...');
        const imageCid = await storage.uploadImageFromFile(imageFile);
        console.log(`Image uploaded: ${imageCid}`);
        
        console.log('Uploading metadata...');
        const metadataCid = await storage.uploadMetadata(
            'Galaxy Explorer #042',
            'A mysterious explorer traversing the cosmic void.',
            imageCid,
            [
                { trait_type: 'Class', value: 'Explorer' },
                { trait_type: 'Galaxy', value: 'Andromeda' },
                { trait_type: 'Rarity', value: 'Legendary' }
            ]
        );
        
        console.log(`Metadata uploaded: ${metadataCid}`);
        console.log(`Token URI: ipfs://${metadataCid}`);
        
    } catch (error) {
        console.error('Upload failed:', error);
    }
}

Akıllı Sözleşmenizde tokenURI Uygulaması

Meta verileriniz IPFS’e yüklendikten sonra, ERC-721 sözleşmenizde tokenURI fonksiyonunu uygulayın:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract MyNFTCollection is ERC721, Ownable {
    mapping(uint256 => string) private _tokenURIs;
    string private _baseTokenURI;
    
    constructor(string memory name, string memory symbol) ERC721(name, symbol) {}
    
    function setTokenURI(uint256 tokenId, string memory uri) external onlyOwner {
        require(_exists(tokenId), "Token does not exist");
        _tokenURIs[tokenId] = uri;
    }
    
    function setBaseURI(string memory baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }
    
    function tokenURI(uint256 tokenId) public view virtual override returns (string) {
        require(_exists(tokenId), "Token does not exist");
        
        string memory _tokenURI = _tokenURIs[tokenId];
        
        // Return specific token URI if set
        if (bytes(_tokenURI).length > 0) {
            return _tokenURI;
        }
        
        // Fall back to base URI + token ID pattern
        if (bytes(_baseTokenURI).length > 0) {
            return string(abi.encodePacked(_baseTokenURI, tokenId.toString()));
        }
        
        return "";
    }
    
    function mintWithURI(address to, uint256 tokenId, string memory uri) external onlyOwner {
        _mint(to, tokenId);
        _tokenURIs[tokenId] = uri;
    }
}

Büyük Koleksiyonlar için Toplu İşlemler

Büyük NFT koleksiyonları için toplu işlemler zamandan ve gas maliyetinden tasarruf sağlar:

def batch_upload_collection(collection_data, api_key):
    """Upload an entire NFT collection in batches"""
    
    print(f"Starting batch upload of {len(collection_data)} NFTs...")
    results = []
    
    for i, nft_data in enumerate(collection_data):
        print(f"Processing NFT {i+1}/{len(collection_data)}: {nft_data['name']}")
        
        try:
            # Upload image
            image_cid = upload_image_to_ipfs(nft_data['image_path'], api_key)
            
            if image_cid:
                # Upload metadata
                metadata_cid = create_and_upload_metadata(
                    name=nft_data['name'],
                    description=nft_data['description'],
                    image_cid=image_cid,
                    attributes=nft_data['attributes'],
                    api_key=api_key
                )
                
                if metadata_cid:
                    results.append({
                        'token_id': i + 1,
                        'name': nft_data['name'],
                        'image_cid': image_cid,
                        'metadata_cid': metadata_cid,
                        'token_uri': f"ipfs://{metadata_cid}"
                    })
                    
        except Exception as e:
            print(f"❌ Error processing {nft_data['name']}: {e}")
    
    print(f"✅ Batch upload complete! {len(results)} NFTs processed successfully.")
    return results

# Example collection data
collection_data = [
    {
        'name': 'Cosmic Warrior #001',
        'description': 'A fierce warrior from distant galaxies.',
        'image_path': 'images/warrior_001.png',
        'attributes': [
            {'trait_type': 'Class', 'value': 'Warrior'},
            {'trait_type': 'Rarity', 'value': 'Epic'}
        ]
    },
    # Add more NFTs...
]

results = batch_upload_collection(collection_data, API_KEY)

NFT Meta Veri Depolama için En İyi Uygulamalar

1. Açıklayıcı Dosya İsimleri Kullanın

IPFS’e yüklerken organizasyona yardımcı olmak için anlamlı açıklamalar kullanın:

payload = {
    "content": base64_content,
    "description": f"Collection: {collection_name} | Token: {token_id} | Type: {file_type}"
}

2. Uygun Hata İşleme Uygulayın

Yükleme hatalarını her zaman zarif bir şekilde ele alın:

import time

def upload_with_retry(upload_function, max_retries=3, delay=2):
    """Upload with exponential backoff retry logic"""
    
    for attempt in range(max_retries):
        try:
            return upload_function()
        except Exception as e:
            if attempt == max_retries - 1:
                raise e
            print(f"Attempt {attempt + 1} failed: {e}. Retrying in {delay} seconds...")
            time.sleep(delay)
            delay *= 2  # Exponential backoff

3. Meta Veri Yapısını Doğrulayın

Meta verilerinizin standartlara uyduğundan emin olun:

def validate_metadata(metadata):
    """Validate NFT metadata structure"""
    required_fields = ['name', 'description', 'image']
    
    for field in required_fields:
        if field not in metadata:
            raise ValueError(f"Missing required field: {field}")
    
    if not metadata['image'].startswith('ipfs://'):
        raise ValueError("Image must be an IPFS URL")
    
    if 'attributes' in metadata:
        for attr in metadata['attributes']:
            if 'trait_type' not in attr or 'value' not in attr:
                raise ValueError("Invalid attribute structure")
    
    return True

Doğru IPFS Pinning Servisini Seçme

NFT projeniz için bir IPFS pinning servisi seçerken şunları göz önünde bulundurun:

  • Güvenilirlik: Uzun vadeli depolama için garanti edilen çalışma süresi
  • Performans: Dünya çapında hızlı alma hızları
  • Fiyatlandırma: Koleksiyon boyutunuza uygun maliyetli
  • Özellikler: API yetenekleri, analitik ve geliştirici araçları

Pinning servislerinin ayrıntılı bir karşılaştırması için IPFS Ninja vs Pinata karşılaştırmamızı ve en iyi IPFS pinning servisleri kılavuzumuzu okuyun.

Gelişmiş Özellikler: Özel Ağ Geçitleri ve Analitik

IPFS Ninja, profesyonel NFT projeleri için ek özellikler sunar:

Özel Ağ Geçidi Yapılandırması

Koleksiyonunuz için markalı IPFS ağ geçitleri oluşturun:

// Access your NFT through a custom gateway
const customGateway = 'https://my-collection.gw.ipfs.ninja';
const nftUrl = `${customGateway}/ipfs/${metadataCid}`;

Yükleme Analitiği

Pano analizleri aracılığıyla NFT depolama kullanımınızı ve erişim modellerinizi izleyin; bu, koleksiyon performansını anlamanıza ve depolama maliyetlerini optimize etmenize yardımcı olur.

Yaygın Sorunları Giderme

Meta Veriler Yüklenmiyor

  • IPFS URL’lerinin ipfs:// protokolünü kullandığını doğrulayın
  • Meta veri JSON’ının geçerli olduğunu kontrol edin
  • Pinning servisinin içeriği koruduğundan emin olun

Görseller Görüntülenmiyor

  • Görsel CID’lerinin meta verilerde doğru olduğunu onaylayın
  • Görsel URL’lerini IPFS ağ geçitlerinde test edin
  • Görsel dosya formatlarının web ile uyumlu olduğunu doğrulayın

Gas Tahmin Hataları

  • tokenURI fonksiyonunun geçerli dizeler döndürdüğünden emin olun
  • Meta verilerde döngüsel referansları kontrol edin
  • Mint öncesinde tüm IPFS CID’leri doğrulayın

NFT Depolamanızı İzleme ve Sürdürme

Koleksiyonunuzu dağıttıktan sonra:

  1. Düzenli Sağlık Kontrolleri: Meta verilerin ve görsellerin erişilebilir kaldığını doğrulayın
  2. Önemli CID’leri Yedekleyin: Yüklenen tüm içerik tanımlayıcılarının kayıtlarını tutun
  3. Analitiği İzleyin: Erişim modellerini ve depolama kullanımını takip edin
  4. Ölçek için Plan Yapın: Koleksiyonunuz büyüdükçe pinning servisinizi yükseltmeyi düşünün

Yüklemeleri programatik olarak yönetme hakkında daha fazla ayrıntı için IPFS yükleme API eğitimimizi inceleyin.

Sonuç

NFT meta verilerini IPFS’te depolamak, dijital varlıklarınızın uzun vadede erişilebilir ve değerli kalmasını sağlar. Bu kılavuzu izleyerek şunları öğrendiniz:

  • ERC-721 uyumlu meta verileri yapılandırma
  • Python ve JavaScript kullanarak varlıkları ve meta verileri yükleme
  • Uygun tokenURI fonksiyonlarını uygulama
  • Büyük koleksiyonlar için toplu işlemleri yönetme
  • Üretim dağıtımları için en iyi uygulamaları uygulama

IPFS’nin merkeziyetsiz mimarisi ve güvenilir pinning servislerinin birleşimi, zamanın testine dayanan başarılı NFT projelerinin temelini oluşturur.

Pinning başlamaya hazır mısınız? Ücretsiz bir hesap oluşturun — 50 dosya, 1 GB depolama, ayda 2 GB bant genişliği. Kredi kartı gerekmez.

Blog'a Dön

İlgili Yazılar

Tüm Yazıları Gör »
IPFS Pinleme Nedir? 2026'da Bilmeniz Gereken Her Şey

IPFS Pinleme Nedir? 2026'da Bilmeniz Gereken Her Şey

IPFS pinlemenin ne olduğunu, dosyaların pinleme olmadan neden kaybolduğunu, uzak pinleme servislerinin nasıl çalıştığını ve ilk dosyanızı nasıl pinleyeceğinizi öğrenin. Örneklerle eksiksiz kılavuz.