· Nacho Coll · Guides · 10 min basahin
Pag-iimbak ng NFT Metadata: Ang Kumpletong Gabay sa IPFS para sa mga Tagagawa ng NFT
Hakbang-hakbang na gabay sa pag-iimbak ng NFT metadata sa IPFS. Kasama ang mga pattern ng ERC-721 tokenURI, mga halimbawa sa Python at JavaScript.

Ang paggawa ng mga NFT ay nangangailangan ng higit pa sa pag-deploy lamang ng smart contract — kailangan mo ng maaasahan at desentralisadong storage para sa iyong metadata at mga asset. Itong komprehensibong gabay ay maghahatid sa iyo ng hakbang-hakbang sa pag-iimbak ng NFT metadata sa IPFS gamit ang pinakamahusay na kasanayan sa industriya, na may kumpletong mga halimbawa ng code para sa mga developer ng Python at JavaScript.

Bakit IPFS para sa Pag-iimbak ng NFT Metadata?
Ang tradisyonal na web hosting ay lumilikha ng mga panganib sa sentralisasyon para sa mga proyekto ng NFT. Kapag ang metadata ay nasa mga karaniwang server, ang mga NFT ay maaaring maging “sira” kung ang serbisyo ng hosting ay bumaba o magbago ng mga URL. Niresolba ito ng IPFS (InterPlanetary File System) sa pamamagitan ng pagbibigay ng:
- Hindi nababagong content addressing: Ang bawat file ay nakakakuha ng natatanging Content Identifier (CID) na hindi nagbabago
- Desentralisadong storage: Umiiral ang nilalaman sa maraming node sa buong mundo
- Cryptographic verification: Ang integridad ng file ay tiniyak sa pamamagitan ng content hashing
- Mga URL na matatag sa hinaharap: Gumagana ang mga IPFS link nang walang katapusan, na nagpoprotekta sa pangmatagalang halaga
Para sa mas malalim na pag-unawa sa mga pundasyon ng IPFS, tingnan ang aming gabay tungkol sa ano ang IPFS pinning.
Pag-unawa sa Istruktura ng ERC-721 Metadata
Tinukoy ng pamantayang ERC-721 kung paano dapat estrukturahin ang NFT metadata. Ang tokenURI function ng iyong smart contract ay nagbabalik ng URL na tumuturo sa JSON metadata na sumusunod sa pattern na ito:
{
"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"
}Mga Pangunahing Field ng Metadata
- name: Ang pamagat ng NFT na ipinapakita sa mga wallet at marketplace
- description: Detalyadong impormasyon tungkol sa NFT
- image: IPFS URL sa pangunahing visual asset
- attributes: Mga katangian batay sa trait para sa pag-filter at pagkalkula ng rarity
- external_url: Opsyonal na link sa karagdagang nilalaman o website ng iyong proyekto
Hakbang-hakbang na Proseso ng Pag-iimbak ng NFT sa IPFS
Hakbang 1: Ihanda ang Iyong mga Asset at Metadata
Bago mag-upload ng anuman, ayusin ang iyong mga file:
- Pangunahing mga asset: Mga larawan, video, o iba pang pangunahing nilalaman
- Mga metadata file: Mga JSON file na naglalarawan ng bawat NFT
- Metadata ng koleksyon: Opsyonal na impormasyon sa antas ng koleksyon
Hakbang 2: I-upload ang mga Asset sa IPFS
Magsimula sa pag-upload ng iyong mga pangunahing NFT asset (mga larawan, video, atbp.) upang makuha ang kanilang mga IPFS CID. Magreripere ka sa mga CID na ito sa iyong mga JSON metadata file.
Narito kung paano mag-upload ng larawan gamit ang 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)Hakbang 3: Gumawa at Mag-upload ng Metadata JSON
Kapag mayroon ka nang mga asset CID, gumawa ng mga metadata JSON file at i-upload ang mga ito:
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
)Hakbang 4: Pagpapatupad sa JavaScript
Para sa mga web application o Node.js project, narito ang katumbas sa 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);
}
}Pagpapatupad ng tokenURI sa Iyong Smart Contract
Kapag na-upload na ang iyong metadata sa IPFS, ipatupad ang tokenURI function sa iyong ERC-721 contract:
// 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;
}
}Mga Batch na Operasyon para sa Malalaking Koleksyon
Para sa malalaking NFT collection, ang mga batch na operasyon ay nakakatipid ng oras at mga gastos sa 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)Pinakamahusay na Kasanayan para sa Pag-iimbak ng NFT Metadata
1. Gumamit ng mga Naglalarawang Pangalan ng File
Kapag nag-uupload sa IPFS, gumamit ng makabuluhang mga paglalarawan upang makatulong sa organisasyon:
payload = {
"content": base64_content,
"description": f"Collection: {collection_name} | Token: {token_id} | Type: {file_type}"
}2. Magpatupad ng Wastong Error Handling
Palaging matalinong harapin ang mga pagkabigo sa pag-upload:
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 backoff3. I-validate ang Istruktura ng Metadata
Tiyaking sumusunod ang iyong metadata sa mga pamantayan:
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 TruePagpili ng Tamang Serbisyo ng IPFS Pinning
Kapag pumipili ng IPFS pinning service para sa iyong NFT project, isaalang-alang:
- Pagiging mapagkakatiwalaan: Tiyak na uptime para sa pangmatagalang storage
- Pagganap: Mabilis na mga bilis ng pagkuha sa buong mundo
- Mga Presyo: Cost-effective para sa laki ng iyong koleksyon
- Mga Tampok: Mga kakayahan ng API, analytics, at mga tool para sa developer
Para sa detalyadong paghahambing ng mga pinning service, basahin ang aming paghahambing na IPFS Ninja vs Pinata at ang aming gabay sa pinakamahuhusay na IPFS pinning service.
Mga Advanced na Tampok: Mga Custom Gateway at Analytics
Nag-aalok ang IPFS Ninja ng karagdagang mga tampok para sa mga propesyonal na NFT project:
Pag-configure ng Custom Gateway
Gumawa ng may brand na mga IPFS gateway para sa iyong koleksyon:
// Access your NFT through a custom gateway
const customGateway = 'https://my-collection.gw.ipfs.ninja';
const nftUrl = `${customGateway}/ipfs/${metadataCid}`;Analytics ng Upload
Subaybayan ang paggamit ng NFT storage at mga pattern ng access sa pamamagitan ng dashboard analytics, na tumutulong sa iyo na maunawaan ang performance ng koleksyon at i-optimize ang mga gastos sa storage.
Pag-aayos ng mga Karaniwang Isyu
Hindi Naglo-load ang Metadata
- I-verify na ang mga IPFS URL ay gumagamit ng
ipfs://protocol - Tingnan kung valid ang metadata JSON
- Tiyaking pinapanatili ng pinning service ang nilalaman
Hindi Lumalabas ang mga Larawan
- Kumpirmahin na tama ang mga image CID sa metadata
- Subukan ang mga URL ng larawan sa mga IPFS gateway
- I-verify na compatible sa web ang mga format ng image file
Mga Error sa Pag-estimate ng Gas
- Tiyaking ang
tokenURIfunction ay nagbabalik ng valid na mga string - Tingnan ang mga circular reference sa metadata
- I-validate ang lahat ng IPFS CID bago mag-mint
Pagsubaybay at Pagpapanatili ng Iyong NFT Storage
Pagkatapos i-deploy ang iyong koleksyon:
- Regular na Pagsuri sa Kalusugan: I-verify na nananatiling naa-access ang metadata at mga larawan
- I-back up ang mga Mahahalagang CID: Panatilihin ang mga rekord ng lahat ng na-upload na content identifier
- Subaybayan ang Analytics: Subaybayan ang mga pattern ng access at paggamit ng storage
- Magplano para sa Scale: Isaalang-alang ang pag-upgrade ng iyong pinning service habang lumalaki ang iyong koleksyon
Para sa higit pang mga detalye sa programmatic na pamamahala ng mga upload, tingnan ang aming IPFS upload API tutorial.
Konklusyon
Tinitiyak ng pag-iimbak ng NFT metadata sa IPFS na mananatiling naa-access at mahalaga ang iyong mga digital asset sa mahabang panahon. Sa pamamagitan ng pagsunod sa gabay na ito, natutunan mong:
- I-istruktura ang ERC-721 compliant na metadata
- Mag-upload ng mga asset at metadata gamit ang Python at JavaScript
- Magpatupad ng mga wastong
tokenURIfunction - Pangasiwaan ang mga batch na operasyon para sa malalaking koleksyon
- Maglapat ng pinakamahusay na kasanayan para sa mga production deployment
Ang kombinasyon ng desentralisadong arkitektura ng IPFS at maaasahang pinning service ay lumilikha ng pundasyon para sa mga matagumpay na NFT project na tumatagal sa paglipas ng panahon.
Handa nang magsimula sa pinning? Gumawa ng libreng account — 50 files, 1 GB storage, 2 GB bandwidth/buwan. Hindi kailangan ng credit card.
