IPFS & Decentralized Storage — Web3

IPFS & Decentralized Storage IPFS (InterPlanetary File System) adalah protocol peer-to-peer untuk menyimpan dan berbagi file secara terdesentralisasi. Berbeda…

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:

Alternatif Storage

Yang akan kamu pelajari