IPFS CIDs 2026: Panduan Content Addressing
Panduan praktis CID IPFS: CIDv0 vs CIDv1, cara kerja content addressing, membuat CID dari Node.js dan Python, dan verifikasi integritas. Update 2026.
Nacho founded IPFS.NINJA to make content-addressed storage feel as simple as an S3 PUT — a single API call, a permanent CID, no wallets or peer discovery to reason about.

- Hasilkan CID yang dapat direproduksi dari byte file apa pun — konten yang sama selalu menghasilkan hash yang sama.
- Gunakan CIDv1 untuk unggahan baru: formatnya Base32, huruf kecil, dan berfungsi dengan subdomain gateway; CIDv0 tidak.
- Satu byte yang berubah pada file akan sepenuhnya mengubah CID-nya, membuat perubahan langsung terdeteksi.
- Content addressing berarti file diidentifikasi berdasarkan apa isinya, bukan di mana file itu di-hosting.
Jika Anda pernah bekerja dengan IPFS (InterPlanetary File System), Anda mungkin pernah menemui string seperti QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG atau bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi. Ini bukan omong kosong acak — ini adalah Content Identifiers (CIDs), tulang punggung sistem pengalamatan konten IPFS.
Memahami CID sangat penting bagi siapa pun yang membangun di IPFS, baik Anda mengunggah file, membangun aplikasi terdesentralisasi, atau mengimplementasikan sistem distribusi konten. Panduan ini akan menjelaskan semua yang perlu Anda ketahui tentang IPFS CID, cara kerja pengalamatan konten, dan cara mulai menggunakannya dalam proyek Anda.

Buat CID dalam 5 Baris (Python)#
import hashlib, base58
def cidv0(content: bytes) -> str:
sha256 = hashlib.sha256(content).digest()
return base58.b58encode(b"\x12\x20" + sha256).decode()
print(cidv0(b"hello world"))
# QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpvBw3cWE69N3TCID tersebut dapat direproduksi oleh siapa saja — jalankan ulang dengan byte yang sama di mana pun di dunia, dan Anda akan mendapatkan string yang sama. Itulah content addressing.
Setara di Node.js:
import { sha256 } from 'multiformats/hashes/sha2';
import { CID } from 'multiformats/cid';
const bytes = new TextEncoder().encode('hello world');
const hash = await sha256.digest(bytes);
const cid = CID.create(1, 0x55, hash); // version 1, raw codec
console.log(cid.toString());
// bafkreif7l7mvyofhyo6fgs6mjf5gguvm5jcahzgvfb3o7t5lmhz3...Apa itu IPFS CID?#
Content Identifier (CID) adalah sidik jari unik yang merepresentasikan sepotong konten di IPFS. Tidak seperti URL web tradisional yang menunjuk ke lokasi (seperti https://example.com/file.pdf), CID menunjuk ke konten itu sendiri, terlepas dari di mana ia disimpan.
Anggap saja seperti ini:
- Pengalamatan berbasis lokasi: “Pergi ke Jalan Utama 123 dan minta buku merah”
- Pengalamatan berbasis konten: “Temukan buku dengan ISBN 978-0-123456-78-9” (perpustakaan mana pun yang memilikinya tidak masalah)
CID bekerja serupa — mereka mengidentifikasi konten berdasarkan hash kriptografisnya, membuat konten tidak dapat diubah dan dapat diverifikasi. Jika satu byte berubah dalam file, CID berubah sepenuhnya.
Mengapa pengalamatan konten penting#
Arsitektur web tradisional mengandalkan pengalamatan berbasis lokasi. Saat Anda mengunjungi https://example.com/image.jpg, Anda mempercayai bahwa:
- Pemilik domain belum mengubah konten
- Server online dan dapat diakses
- Konten belum dirusak
Dengan pengalamatan konten menggunakan CID:
- Tidak dapat diubah: CID menjamin konten tidak berubah
- Desentralisasi: Konten dapat diambil dari node IPFS mana pun yang memilikinya
- Verifikasi: Anda dapat memverifikasi secara kriptografis bahwa Anda menerima konten yang benar
- Efisiensi: Konten yang identik secara otomatis dihilangkan duplikasinya
Anatomi CID#
Mari kita bedah CID tipikal untuk memahami komponennya:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
└─┬─┘└─────────────────┬─────────────────────────────────┘
│ │
│ └─ Hash Konten (dikodekan Base32)
└─ Awalan Multibase (menunjukkan pengkodean)CID berisi beberapa informasi:
1. Awalan Multibase#
Karakter pertama menunjukkan bagaimana CID dikodekan:
Q= Pengkodean Base58 (CIDv0)b= Pengkodean Base32 (CIDv1)f= Base16/heksadesimal (CIDv1)z= Base58 (CIDv1)
2. Versi CID#
- CIDv0: Selalu dimulai dengan
Qm, menggunakan SHA-256, terbatas pada codec DAG-PB - CIDv1: Lebih fleksibel, mendukung berbagai fungsi hash dan codec
3. Multicodec#
Menentukan bagaimana konten terstruktur (DAG-PB, DAG-CBOR, byte mentah, dll.)
4. Multihash#
Hash kriptografis aktual dari konten, termasuk:
- Pengenal fungsi hash (biasanya SHA-256)
- Panjang hash
- Hash digest
CIDv0 vs CIDv1: Memahami perbedaannya#
IPFS telah berevolusi melalui dua versi CID utama, masing-masing dengan karakteristik berbeda:
CIDv0: Format asli#
CID CIDv0 selalu dimulai dengan Qm dan terlihat seperti ini:
QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdGKarakteristik:
- Hanya pengkodean Base58
- Hanya fungsi hash SHA-256
- Hanya codec DAG-PB (Protobuf)
- Panjang 46 karakter
- Kompatibel ke belakang dengan semua implementasi IPFS
Kapan menggunakan CIDv0:
- Kompatibilitas maksimum dengan node IPFS lama
- Bekerja dengan sistem yang ada yang mengharapkan awalan
Qm - Penyimpanan file (kasus penggunaan paling umum)
CIDv1: Standar modern#
CID CIDv1 lebih fleksibel dan dapat terlihat seperti ini:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi # Base32
zb2rhj7crUKTQYRGCRATFaQ6YFLTde2YzdqbbhAASkL9uRDXn # Base58
f01551220d1e2c35... # Base16Karakteristik:
- Beberapa format pengkodean (Base32, Base58, Base16)
- Dukungan untuk berbagai fungsi hash (SHA-256, SHA-512, BLAKE2, dll.)
- Beberapa codec (Raw, DAG-CBOR, DAG-JSON, dll.)
- Format yang menjelaskan dirinya sendiri
- Tidak peka huruf besar/kecil saat menggunakan Base32
Kapan menggunakan CIDv1:
- Membangun aplikasi baru
- Membutuhkan pengenal yang tidak peka huruf besar/kecil
- Bekerja dengan data terstruktur (JSON, CBOR)
- Menggunakan fungsi hash alternatif
Mengkonversi antar versi#
Anda dapat mengkonversi CID antar versi sambil mempertahankan referensi konten yang sama:
// CIDv0
const cidv0 = "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG";
// Convert to CIDv1 Base32
const cidv1 = "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi";
// Both reference the same content!Cara kerja pengalamatan konten#
Pengalamatan konten di IPFS mengikuti proses deterministik yang memastikan konten yang sama selalu menghasilkan CID yang sama:
1. Persiapan konten#
Saat Anda menambahkan konten ke IPFS, itu pertama-tama dipecah:
- File kecil: Disimpan sebagai blok tunggal
- File besar: Dibagi menjadi potongan-potongan dan diorganisir dalam Merkle DAG (Directed Acyclic Graph)
- Direktori: Direpresentasikan sebagai struktur DAG yang menghubungkan ke file
2. Proses hashing#
Setiap potongan konten melalui:
- Serialisasi: Konten diformat menurut codec-nya
- Hashing: Fungsi hash kriptografis memproses data yang diserialisasi
- Pembuatan Multihash: Hash dibungkus dengan informasi algoritma dan panjang
- Perakitan CID: Versi, codec, dan multihash digabungkan
3. Struktur Merkle DAG#
IPFS mengorganisir konten dalam Merkle DAG di mana:
- Setiap node memiliki CID
- Node induk merujuk ke node anak melalui CID
- Perubahan dalam node mana pun menyebar ke seluruh pohon
- Seluruh struktur dapat diverifikasi secara kriptografis
Root CID: bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
├── file1.txt (QmHash1...)
├── file2.jpg (QmHash2...)
└── subdirectory/
├── file3.pdf (QmHash3...)
└── file4.mp4 (QmHash4...)Contoh praktis: Bekerja dengan CID#
Mari kita jelajahi cara bekerja dengan CID dalam praktik menggunakan API IPFS Ninja:
Mengunggah konten dan mendapatkan CID#
// Upload a file and get its CID
const uploadFile = async (content, filename) => {
const response = await fetch('https://api.ipfs.ninja/upload/new', {
method: 'POST',
headers: {
'X-Api-Key': 'bws_1234567890abcdef1234567890abcdef12345678',
'Content-Type': 'application/json'
},
body: JSON.stringify({
content: btoa(content), // Base64 encode binary content
description: `Upload of ${filename}`
})
});
const result = await response.json();
console.log('CID:', result.cid);
console.log('IPFS URL:', result.uris.ipfs);
console.log('HTTP URL:', result.uris.url);
return result.cid;
};
// Example usage
uploadFile('Hello, IPFS!', 'greeting.txt');
// Returns: bafkreifjxz6zwqh27k5xnr5qfbx4w6n5vuwwwdcngguwjewzj2e3xxfgviPin konten yang ada berdasarkan CID#
Jika Anda sudah memiliki CID, Anda dapat mem-pin-nya untuk memastikan ketersediaan:
const pinByCID = async (cid) => {
const response = await fetch('https://api.ipfs.ninja/pin', {
method: 'POST',
headers: {
'X-Api-Key': 'bws_1234567890abcdef1234567890abcdef12345678',
'Content-Type': 'application/json'
},
body: JSON.stringify({
cid: cid,
description: 'Pinned via API'
})
});
const result = await response.json();
console.log('Pinned CID:', result.cid);
return result;
};
// Pin the "Hello World" of IPFS
pinByCID('QmWATWQ7fVPP2EFGu71UkfnqhYXDYH566qy47CnJDgvs8u');Mengakses konten melalui CID#
Setelah Anda memiliki CID, Anda dapat mengakses konten melalui berbagai metode:
// Direct IPFS gateway access
const ipfsUrl = `https://ipfs.ninja/ipfs/${cid}`;
// Custom gateway (if configured)
const customGatewayUrl = `https://my-app.gw.ipfs.ninja/ipfs/${cid}`;
// Fetch content programmatically
const fetchContent = async (cid) => {
const response = await fetch(`https://ipfs.ninja/ipfs/${cid}`);
const content = await response.text();
return content;
};Praktik terbaik CID untuk pengembang#
1. Selalu validasi CID#
Sebelum menggunakan CID dalam aplikasi Anda, validasi formatnya:
const isValidCID = (cid) => {
// Basic validation patterns
const cidv0Pattern = /^Qm[1-9A-HJ-NP-Za-km-z]{44}$/;
const cidv1Pattern = /^[bf][a-z2-7]{58}$/;
return cidv0Pattern.test(cid) || cidv1Pattern.test(cid);
};2. Tangani kedua versi CID#
Aplikasi Anda harus bekerja dengan CIDv0 dan CIDv1:
const normalizeCID = (cid) => {
if (cid.startsWith('Qm')) {
// CIDv0 - can convert to CIDv1 if needed
return cid;
} else if (cid.startsWith('b') || cid.startsWith('f') || cid.startsWith('z')) {
// CIDv1
return cid;
} else {
throw new Error('Invalid CID format');
}
};3. Cache pemetaan CID#
Jika Anda sering menghasilkan CID, pertimbangkan untuk melakukan caching:
const cidCache = new Map();
const getCachedCID = (content) => {
const contentHash = btoa(content);
if (cidCache.has(contentHash)) {
return cidCache.get(contentHash);
}
// Upload and cache result
return uploadFile(content).then(cid => {
cidCache.set(contentHash, cid);
return cid;
});
};4. Gunakan deskripsi yang bermakna#
Saat mengunggah konten, sertakan metadata deskriptif:
const uploadWithMetadata = async (content, metadata) => {
return fetch('https://api.ipfs.ninja/upload/new', {
method: 'POST',
headers: {
'X-Api-Key': 'bws_1234567890abcdef1234567890abcdef12345678',
'Content-Type': 'application/json'
},
body: JSON.stringify({
content: btoa(content),
description: metadata.name || 'Uploaded file',
metadata: {
filename: metadata.filename,
contentType: metadata.contentType,
uploadedAt: new Date().toISOString(),
version: metadata.version || '1.0'
}
})
});
};Kasus penggunaan CID umum#
1. Penerapan situs web statis#
Terapkan seluruh situs web ke IPFS dan referensikan berdasarkan CID:
// Upload website directory structure
const deployWebsite = async (files) => {
const uploads = await Promise.all(
files.map(file => uploadFile(file.content, file.path))
);
// Root CID references entire site
const rootCID = uploads.find(u => u.path === 'index.html').cid;
console.log(`Website deployed: https://ipfs.ninja/ipfs/${rootCID}`);
return rootCID;
};Untuk mempelajari lebih lanjut tentang penerapan situs web, lihat panduan kami tentang cara mengunggah file ke IPFS.
2. Penyimpanan metadata NFT#
Simpan metadata NFT secara tidak berubah menggunakan CID:
const nftMetadata = {
name: "My Awesome NFT",
description: "A unique digital collectible",
image: "ipfs://bafkreibc5sgo2plmjkq2tzmhrn54bk3crhnqekiy7u66fqvqm37pu2e5gw",
attributes: [
{ trait_type: "Color", value: "Blue" },
{ trait_type: "Rarity", value: "Epic" }
]
};
const metadataCID = await uploadFile(
JSON.stringify(nftMetadata, null, 2),
'metadata.json'
);
// Use in smart contract
console.log(`Token URI: ipfs://${metadataCID}`);3. Distribusi konten#
Gunakan CID untuk pengiriman konten terdistribusi:
// Upload once, access everywhere
const distributeContent = async (content) => {
const cid = await uploadFile(content, 'content.txt');
// Content available via multiple gateways
const gateways = [
`https://ipfs.ninja/ipfs/${cid}`,
`https://ipfs.io/ipfs/${cid}`,
`https://cloudflare-ipfs.com/ipfs/${cid}`
];
return { cid, gateways };
};Memahami pinning IPFS dengan CID#
CID bersifat sementara secara default — mereka harus “di-pin” untuk tetap tersedia. Pelajari lebih lanjut tentang konsep krusial ini di panduan komprehensif kami tentang apa itu pinning IPFS.
Saat memilih layanan pinning IPFS, pertimbangkan untuk membaca perbandingan IPFS Ninja vs Pinata kami atau jelajahi ringkasan layanan pinning IPFS terbaik yang tersedia hari ini.
Buat CID pertama Anda dalam 30 detik#
Siap menghasilkan CID pertama Anda? Berikut contoh cepat menggunakan API IPFS Ninja:
# Using curl (replace with your actual API key)
curl -X POST https://api.ipfs.ninja/upload/new \
-H "X-Api-Key: bws_YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"content": "SGVsbG8sIElQRlMgV29ybGQh",
"description": "My first IPFS upload"
}'// Using JavaScript
const createFirstCID = async () => {
const response = await fetch('https://api.ipfs.ninja/upload/new', {
method: 'POST',
headers: {
'X-Api-Key': 'bws_YOUR_API_KEY_HERE',
'Content-Type': 'application/json'
},
body: JSON.stringify({
content: btoa('Hello, IPFS World!'), // Base64: "SGVsbG8sIElQRlMgV29ybGQh"
description: 'My first IPFS upload'
})
});
const result = await response.json();
console.log('🎉 Your first CID:', result.cid);
console.log('🌐 Access it at:', result.uris.url);
return result;
};
createFirstCID();Ini akan mengembalikan sesuatu seperti:
{
"cid": "bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
"sizeMB": 0.000017,
"uris": {
"ipfs": "ipfs://bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
"url": "https://ipfs.ninja/ipfs/bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw"
}
}Untuk contoh API yang lebih detail, lihat tutorial API unggah IPFS kami.
Kesimpulan#
CID adalah fondasi dari sistem pengalamatan konten IPFS, menyediakan identifikasi konten yang tidak dapat diubah, dapat diverifikasi, dan terdesentralisasi. Memahami cara kerjanya — dari detail teknis CIDv0 vs CIDv1 hingga pola implementasi praktis — sangat penting untuk membangun aplikasi terdesentralisasi yang kuat.
Poin-poin utama:
- CID mengidentifikasi konten secara unik, bukan lokasi
- CIDv0 menyediakan kompatibilitas maksimum, CIDv1 menawarkan fleksibilitas
- Pengalamatan konten memungkinkan verifikasi dan deduplikasi
- Penanganan CID yang tepat sangat penting untuk aplikasi produksi
Baik Anda menyimpan metadata NFT, menerapkan situs web terdesentralisasi, atau membangun sistem distribusi konten, CID memberikan fondasi andal yang Anda butuhkan untuk aplikasi yang benar-benar terdesentralisasi.
Siap mulai mem-pin? Buat akun gratis — 50 file, 1 GB penyimpanan, 2 GB bandwidth/bulan. Tanpa kartu kredit.
Tentang artikel ini
Artikel ini dibantu AI, ditinjau oleh manusia, dan diverifikasi langsung di platform IPFS.NINJA sebelum diterbitkan. Pelajari cara kami menggunakan AI dalam konten kami .

Tentang penulis
Nacho Coll
Founder & Engineer at IPFS.NINJA
Nacho founded IPFS.NINJA to make content-addressed storage feel as simple as an S3 PUT — a single API call, a permanent CID, no wallets or peer discovery to reason about. Writes about IPFS internals, decentralized storage patterns, and the pinning-service landscape from the operator side of the wire.
