· Nacho Coll · Guides  · 9 মিনিট পড়ুন

NFT মেটাডেটা স্টোরেজ: NFT নির্মাতাদের জন্য IPFS-এর সম্পূর্ণ গাইড

IPFS-এ NFT মেটাডেটা সংরক্ষণের ধাপে ধাপে গাইড। ERC-721 tokenURI প্যাটার্ন, Python এবং JavaScript উদাহরণ অন্তর্ভুক্ত।

IPFS-এ NFT মেটাডেটা সংরক্ষণের ধাপে ধাপে গাইড। ERC-721 tokenURI প্যাটার্ন, Python এবং JavaScript উদাহরণ অন্তর্ভুক্ত।

NFT তৈরি করতে শুধুমাত্র স্মার্ট কন্ট্রাক্ট স্থাপনের চেয়ে বেশি কিছু প্রয়োজন — আপনার মেটাডেটা এবং সম্পদের জন্য নির্ভরযোগ্য, বিকেন্দ্রীকৃত স্টোরেজ প্রয়োজন। এই বিস্তৃত গাইড আপনাকে Python এবং JavaScript ডেভেলপারদের জন্য সম্পূর্ণ কোড উদাহরণ সহ শিল্পের সেরা অনুশীলনগুলি ব্যবহার করে IPFS-এ NFT মেটাডেটা সংরক্ষণের মাধ্যমে ধাপে ধাপে নিয়ে যাবে।

IPFS Ninja

কেন NFT মেটাডেটা স্টোরেজের জন্য IPFS?

ঐতিহ্যবাহী ওয়েব হোস্টিং NFT প্রকল্পগুলির জন্য কেন্দ্রীকরণের ঝুঁকি তৈরি করে। যখন মেটাডেটা প্রচলিত সার্ভারে থাকে, যদি হোস্টিং পরিষেবা বন্ধ হয়ে যায় বা URL পরিবর্তন করে তবে NFT “নষ্ট” হয়ে যেতে পারে। IPFS (InterPlanetary File System) প্রদান করে এটি সমাধান করে:

  • অপরিবর্তনীয় কন্টেন্ট ঠিকানা: প্রতিটি ফাইল একটি অনন্য Content Identifier (CID) পায় যা কখনও পরিবর্তিত হয় না
  • বিকেন্দ্রীকৃত স্টোরেজ: কন্টেন্ট বিশ্বব্যাপী একাধিক নোডে বিদ্যমান
  • ক্রিপ্টোগ্রাফিক যাচাইকরণ: ফাইলের অখণ্ডতা কন্টেন্ট হ্যাশিংয়ের মাধ্যমে নিশ্চিত করা হয়
  • ভবিষ্যৎ-প্রমাণ URL: IPFS লিঙ্কগুলি অনির্দিষ্টকালের জন্য কাজ করে, দীর্ঘমেয়াদী মান রক্ষা করে

IPFS-এর মৌলিক বিষয়গুলির গভীরতর বোঝার জন্য, IPFS pinning কী সম্পর্কে আমাদের গাইডটি দেখুন।

ERC-721 মেটাডেটা স্ট্রাকচার বোঝা

ERC-721 স্ট্যান্ডার্ড NFT মেটাডেটা কীভাবে স্ট্রাকচার করা উচিত তা সংজ্ঞায়িত করে। আপনার স্মার্ট কন্ট্রাক্টের tokenURI ফাংশন এই প্যাটার্ন অনুসরণ করে JSON মেটাডেটার দিকে নির্দেশকারী একটি URL ফেরত দেয়:

{
  "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"
}

মেটাডেটার মূল ক্ষেত্রগুলি

  • name: ওয়ালেট এবং মার্কেটপ্লেসে প্রদর্শিত NFT-এর শিরোনাম
  • description: NFT সম্পর্কে বিস্তারিত তথ্য
  • image: মূল ভিজ্যুয়াল সম্পদের IPFS URL
  • attributes: ফিল্টারিং এবং বিরলতা গণনার জন্য বৈশিষ্ট্য-ভিত্তিক বৈশিষ্ট্য
  • external_url: অতিরিক্ত কন্টেন্ট বা আপনার প্রকল্পের ওয়েবসাইটের ঐচ্ছিক লিঙ্ক

ধাপে ধাপে IPFS NFT স্টোরেজ প্রক্রিয়া

ধাপ ১: আপনার সম্পদ এবং মেটাডেটা প্রস্তুত করুন

কিছু আপলোড করার আগে, আপনার ফাইলগুলি সংগঠিত করুন:

  1. মূল সম্পদ: ছবি, ভিডিও বা অন্যান্য প্রাথমিক কন্টেন্ট
  2. মেটাডেটা ফাইল: প্রতিটি NFT বর্ণনাকারী JSON ফাইল
  3. সংগ্রহ মেটাডেটা: ঐচ্ছিক সংগ্রহ-স্তরের তথ্য

ধাপ ২: IPFS-এ সম্পদ আপলোড করুন

আপনার মূল NFT সম্পদ (ছবি, ভিডিও, ইত্যাদি) আপলোড করে শুরু করুন তাদের IPFS CID পেতে। আপনি আপনার JSON মেটাডেটা ফাইলগুলিতে এই CID গুলি উল্লেখ করবেন।

এখানে Python ব্যবহার করে একটি ছবি আপলোড করার উপায়:

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)

ধাপ ৩: মেটাডেটা JSON তৈরি করুন এবং আপলোড করুন

একবার আপনার সম্পদ CID হয়ে গেলে, মেটাডেটা JSON ফাইলগুলি তৈরি করুন এবং সেগুলি আপলোড করুন:

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
)

ধাপ ৪: JavaScript ইমপ্লিমেন্টেশন

ওয়েব অ্যাপ্লিকেশন বা Node.js প্রকল্পগুলির জন্য, এখানে JavaScript সমতুল্য:

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);
    }
}

আপনার স্মার্ট কন্ট্রাক্টে tokenURI ইমপ্লিমেন্ট করা

একবার আপনার মেটাডেটা IPFS-এ আপলোড হয়ে গেলে, আপনার ERC-721 কন্ট্রাক্টে tokenURI ফাংশন ইমপ্লিমেন্ট করুন:

// 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;
    }
}

বড় সংগ্রহের জন্য ব্যাচ অপারেশন

বড় NFT সংগ্রহের জন্য, ব্যাচ অপারেশন সময় এবং gas খরচ সাশ্রয় করে:

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 মেটাডেটা স্টোরেজের জন্য সেরা অনুশীলন

১. বর্ণনামূলক ফাইল নাম ব্যবহার করুন

IPFS-এ আপলোড করার সময়, সংগঠনে সাহায্য করতে অর্থপূর্ণ বর্ণনা ব্যবহার করুন:

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

২. সঠিক ত্রুটি পরিচালনা ইমপ্লিমেন্ট করুন

সর্বদা মার্জিতভাবে আপলোড ব্যর্থতা পরিচালনা করুন:

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

৩. মেটাডেটা স্ট্রাকচার যাচাই করুন

নিশ্চিত করুন যে আপনার মেটাডেটা মানদণ্ড অনুসরণ করে:

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

সঠিক IPFS Pinning পরিষেবা নির্বাচন করা

আপনার NFT প্রকল্পের জন্য IPFS pinning পরিষেবা নির্বাচন করার সময়, বিবেচনা করুন:

  • নির্ভরযোগ্যতা: দীর্ঘমেয়াদী স্টোরেজের জন্য গ্যারান্টিযুক্ত আপটাইম
  • পারফরম্যান্স: বিশ্বব্যাপী দ্রুত পুনরুদ্ধার গতি
  • মূল্য: আপনার সংগ্রহের আকারের জন্য সাশ্রয়ী
  • বৈশিষ্ট্য: API ক্ষমতা, বিশ্লেষণ এবং ডেভেলপার সরঞ্জাম

pinning পরিষেবাগুলির বিস্তারিত তুলনার জন্য, আমাদের তুলনা IPFS Ninja vs Pinata এবং সেরা IPFS pinning পরিষেবা সম্পর্কে আমাদের গাইডটি পড়ুন।

উন্নত বৈশিষ্ট্য: কাস্টম গেটওয়ে এবং বিশ্লেষণ

IPFS Ninja পেশাদার NFT প্রকল্পগুলির জন্য অতিরিক্ত বৈশিষ্ট্য সরবরাহ করে:

কাস্টম গেটওয়ে কনফিগারেশন

আপনার সংগ্রহের জন্য ব্র্যান্ডেড IPFS গেটওয়ে তৈরি করুন:

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

আপলোড বিশ্লেষণ

ড্যাশবোর্ড বিশ্লেষণের মাধ্যমে আপনার NFT স্টোরেজ ব্যবহার এবং অ্যাক্সেস প্যাটার্ন নিরীক্ষণ করুন, যা আপনাকে সংগ্রহের পারফরম্যান্স বুঝতে এবং স্টোরেজ খরচ অপ্টিমাইজ করতে সহায়তা করে।

সাধারণ সমস্যা সমাধান

মেটাডেটা লোড হচ্ছে না

  • যাচাই করুন যে IPFS URL ipfs:// প্রোটোকল ব্যবহার করছে
  • মেটাডেটা JSON বৈধ কিনা পরীক্ষা করুন
  • নিশ্চিত করুন যে pinning পরিষেবা কন্টেন্ট রক্ষণাবেক্ষণ করছে

ছবি প্রদর্শিত হচ্ছে না

  • নিশ্চিত করুন যে মেটাডেটায় ছবি CID সঠিক
  • IPFS গেটওয়েতে ছবি URL পরীক্ষা করুন
  • যাচাই করুন যে ছবি ফাইল ফরম্যাট ওয়েব-সামঞ্জস্যপূর্ণ

Gas অনুমান ত্রুটি

  • নিশ্চিত করুন যে tokenURI ফাংশন বৈধ স্ট্রিং ফেরত দেয়
  • মেটাডেটায় বৃত্তাকার রেফারেন্সের জন্য চেক করুন
  • minting এর আগে সমস্ত IPFS CID যাচাই করুন

আপনার NFT স্টোরেজ নিরীক্ষণ এবং রক্ষণাবেক্ষণ

আপনার সংগ্রহ স্থাপনের পরে:

  1. নিয়মিত স্বাস্থ্য পরীক্ষা: যাচাই করুন যে মেটাডেটা এবং ছবি অ্যাক্সেসযোগ্য থাকে
  2. গুরুত্বপূর্ণ CID ব্যাকআপ করুন: সমস্ত আপলোড করা কন্টেন্ট সনাক্তকারীর রেকর্ড রাখুন
  3. বিশ্লেষণ নিরীক্ষণ করুন: অ্যাক্সেস প্যাটার্ন এবং স্টোরেজ ব্যবহার ট্র্যাক করুন
  4. স্কেলের জন্য পরিকল্পনা করুন: আপনার সংগ্রহ বাড়ার সাথে সাথে আপনার pinning পরিষেবা আপগ্রেড করার বিষয়ে বিবেচনা করুন

প্রোগ্রাম্যাটিকভাবে আপলোড পরিচালনার বিষয়ে আরও বিশদ জানতে, আমাদের IPFS upload API টিউটোরিয়াল দেখুন।

উপসংহার

IPFS-এ NFT মেটাডেটা সংরক্ষণ করা নিশ্চিত করে যে আপনার ডিজিটাল সম্পদগুলি দীর্ঘমেয়াদী অ্যাক্সেসযোগ্য এবং মূল্যবান থাকে। এই গাইড অনুসরণ করে, আপনি শিখেছেন:

  • ERC-721 অনুগত মেটাডেটা স্ট্রাকচার করা
  • Python এবং JavaScript ব্যবহার করে সম্পদ এবং মেটাডেটা আপলোড করা
  • সঠিক tokenURI ফাংশন ইমপ্লিমেন্ট করা
  • বড় সংগ্রহের জন্য ব্যাচ অপারেশন পরিচালনা করা
  • উৎপাদন স্থাপনার জন্য সেরা অনুশীলনগুলি প্রয়োগ করা

IPFS-এর বিকেন্দ্রীকৃত স্থাপত্য এবং নির্ভরযোগ্য pinning পরিষেবাগুলির সংমিশ্রণ সফল NFT প্রকল্পগুলির জন্য ভিত্তি তৈরি করে যা সময়ের পরীক্ষায় উত্তীর্ণ হয়।

pinning দিয়ে শুরু করতে প্রস্তুত? একটি বিনামূল্যের অ্যাকাউন্ট তৈরি করুন — ৫০টি ফাইল, ১ GB স্টোরেজ, ২ GB ব্যান্ডউইথ/মাস। কোনও ক্রেডিট কার্ডের প্রয়োজন নেই।

ব্লগে ফিরুন

সম্পর্কিত নিবন্ধ

সব নিবন্ধ দেখুন »
IPFS CID ব্যাখ্যা: এটি কী এবং কন্টেন্ট অ্যাড্রেসিং কীভাবে কাজ করে

IPFS CID ব্যাখ্যা: এটি কী এবং কন্টেন্ট অ্যাড্রেসিং কীভাবে কাজ করে

IPFS কন্টেন্ট আইডেন্টিফায়ার (CIDs) এর স্পষ্ট প্রযুক্তিগত ব্যাখ্যা। কন্টেন্ট অ্যাড্রেসিং কীভাবে কাজ করে, CID সংস্করণ এবং আপনার প্রথম CID তৈরি করার উপায়।

IPFS পিনিং কী? ২০২৬ সালে আপনার যা জানা দরকার

IPFS পিনিং কী? ২০২৬ সালে আপনার যা জানা দরকার

জানুন IPFS পিনিং কী, কেন পিনিং ছাড়া ফাইল হারিয়ে যায়, রিমোট পিনিং পরিষেবা কিভাবে কাজ করে, এবং কিভাবে আপনার প্রথম ফাইল পিন করবেন। উদাহরণসহ সম্পূর্ণ গাইড।