IPFS & Decentralized Storage
IPFS (InterPlanetary File System) adalah protocol peer-to-peer untuk menyimpan dan berbagi file secara terdesentralisasi. Berbeda dari HTTP (location-addressed), IPFS menggunakan content-addressing.
Content Addressing vs Location Addressing
// HTTP (location-addressed):
// https://example.com/images/cat.png
// → Menunjuk ke LOKASI file. File bisa berubah, server bisa down.
// IPFS (content-addressed):
// ipfs://QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco
// → Hash dari KONTEN file. Jika konten sama, hash sama.
// → File tidak bisa diubah (immutable)
// → Siapa pun bisa host, selama kontennya sama
CID (Content Identifier)
Setiap file di IPFS punya CID — hash unik berdasarkan kontennya:
// CID v0 (Base58): QmXoypizjW3WknFiJnKLwHCnL...
// CID v1 (Base32): bafybeigdyrzt5sfp7udm7hu76uh7y26nf3...
// CID dihitung dari konten:
// file "Hello World" → QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u
// Ubah 1 karakter → CID COMPLETELY berbeda
Pinning
IPFS nodes hanya menyimpan file yang mereka "pin". Tanpa pinning, file bisa di-garbage collect.
// Pinning services populer:
// - Pinata (gratis tier)
// - Infura IPFS
// - Web3.Storage
// - nft.storage (khusus NFT metadata)
// Upload via Pinata API
const uploadToIPFS = async (file) => {
const formData = new FormData();
formData.append("file", file);
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 `ipfs://${data.IpfsHash}`;
// ipfs://QmXxx...
};
Upload NFT Metadata
// Step 1: Upload gambar ke IPFS
const imageHash = await uploadToIPFS(imageFile);
// ipfs://QmImageHash...
// Step 2: Buat metadata JSON
const metadata = {
name: "My NFT #1",
description: "Description here",
image: imageHash, // IPFS URI gambar
attributes: [
{ trait_type: "Rarity", value: "Rare" },
],
};
// Step 3: Upload metadata JSON ke IPFS
const metadataHash = await uploadToIPFS(
new Blob([JSON.stringify(metadata)], { type: "application/json" })
);
// ipfs://QmMetadataHash...
// Step 4: Gunakan metadataHash sebagai tokenURI saat mint
IPFS Gateway
Browser belum native support ipfs://. Gunakan gateway untuk akses via HTTP:
https://ipfs.io/ipfs/{CID}https://gateway.pinata.cloud/ipfs/{CID}https://{CID}.ipfs.dweb.link
Alternatif Storage
- Arweave — Permanent storage (bayar sekali, simpan selamanya)
- Filecoin — Incentivized IPFS (storage marketplace)
- Ceramic — Mutable data streams (user profiles, social)