· Nacho Coll · Guides · 8 dk okuma
IPFS CID açıklandı: nedir ve içerik adresleme nasıl çalışır
IPFS İçerik Tanımlayıcılarının (CIDs) net teknik açıklaması. İçerik adresleme nasıl çalışır, CID sürümleri ve ilk CID'nizi nasıl oluşturursunuz.

Eğer IPFS (InterPlanetary File System) ile çalıştıysanız, muhtemelen QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG veya bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi gibi dizelerle karşılaşmışsınızdır. Bunlar rastgele karakter dizileri değildir — bunlar IPFS’in içerik adresleme sisteminin omurgası olan İçerik Tanımlayıcılarıdır (CIDs).
CID’leri anlamak, ister dosya yüklüyor, ister merkeziyetsiz uygulamalar geliştiriyor, ister içerik dağıtım sistemleri uyguluyor olun, IPFS üzerine inşa eden herkes için çok önemlidir. Bu kılavuz, IPFS CID’leri hakkında bilmeniz gereken her şeyi, içerik adreslemenin nasıl çalıştığını ve projelerinizde bunları kullanmaya nasıl başlayacağınızı açıklayacak.

IPFS CID nedir?
İçerik Tanımlayıcı (CID), IPFS üzerindeki bir içerik parçasını temsil eden benzersiz bir parmak izidir. Bir konuma işaret eden geleneksel web URL’lerinin aksine (https://example.com/file.pdf gibi), CID’ler nerede depolandığına bakılmaksızın içeriğin kendisine işaret eder.
Şöyle düşünün:
- Konum bazlı adresleme: “Ana Cadde 123’e gidin ve kırmızı kitabı isteyin”
- İçerik bazlı adresleme: “ISBN 978-0-123456-78-9’a sahip kitabı bulun” (hangi kütüphanenin elinde olduğu önemli değil)
CID’ler benzer şekilde çalışır — içeriği kriptografik karma değerine göre tanımlar, içeriği değişmez ve doğrulanabilir hale getirir. Dosyada tek bir bayt değişirse, CID tamamen değişir.
İçerik adresleme neden önemlidir
Geleneksel web mimarisi konum bazlı adreslemeye dayanır. https://example.com/image.jpg adresini ziyaret ettiğinizde, şunlara güvenirsiniz:
- Alan adı sahibinin içeriği değiştirmediği
- Sunucunun çevrimiçi ve erişilebilir olduğu
- İçeriğin tahrif edilmediği
CID’lerle içerik adresleme kullanılırken:
- Değişmezlik: CID, içeriğin değişmediğini garanti eder
- Merkeziyetsizlik: İçerik, onu barındıran herhangi bir IPFS düğümünden alınabilir
- Doğrulama: Doğru içeriği aldığınızı kriptografik olarak doğrulayabilirsiniz
- Verimlilik: Aynı içerik otomatik olarak tekilleştirilir
Bir CID’nin anatomisi
Bileşenlerini anlamak için tipik bir CID’yi parçalayalım:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
└─┬─┘└─────────────────┬─────────────────────────────────┘
│ │
│ └─ İçerik Karması (Base32 kodlu)
└─ Multibase Öneki (kodlamayı belirtir)Bir CID birkaç bilgi parçası içerir:
1. Multibase Öneki
İlk karakter, CID’nin nasıl kodlandığını gösterir:
Q= Base58 kodlama (CIDv0)b= Base32 kodlama (CIDv1)f= Base16/onaltılık (CIDv1)z= Base58 (CIDv1)
2. CID Sürümü
- CIDv0: Her zaman
Qmile başlar, SHA-256 kullanır, DAG-PB codec ile sınırlıdır - CIDv1: Daha esnek, birden fazla karma işlevini ve codec’i destekler
3. Multicodec
İçeriğin nasıl yapılandırıldığını belirtir (DAG-PB, DAG-CBOR, ham baytlar, vb.)
4. Multihash
İçeriğin gerçek kriptografik karma değeri, şunları içerir:
- Karma işlevi tanımlayıcısı (genellikle SHA-256)
- Karma uzunluğu
- Karma özeti
CIDv0 vs CIDv1: Farkları anlamak
IPFS, her biri farklı özelliklere sahip iki ana CID sürümünden geçti:
CIDv0: Orijinal format
CIDv0 CID’leri her zaman Qm ile başlar ve şöyle görünür:
QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdGÖzellikler:
- Yalnızca Base58 kodlama
- Yalnızca SHA-256 karma işlevi
- Yalnızca DAG-PB (Protobuf) codec
- 46 karakter uzunluğunda
- Tüm IPFS uygulamalarıyla geriye dönük uyumlu
CIDv0 ne zaman kullanılır:
- Eski IPFS düğümleriyle maksimum uyumluluk
Qmöneklerini bekleyen mevcut sistemlerle çalışma- Dosya depolama (en yaygın kullanım durumu)
CIDv1: Modern standart
CIDv1 CID’leri daha esnektir ve şöyle görünebilir:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi # Base32
zb2rhj7crUKTQYRGCRATFaQ6YFLTde2YzdqbbhAASkL9uRDXn # Base58
f01551220d1e2c35... # Base16Özellikler:
- Birden fazla kodlama formatı (Base32, Base58, Base16)
- Farklı karma işlevleri için destek (SHA-256, SHA-512, BLAKE2, vb.)
- Birden fazla codec (Raw, DAG-CBOR, DAG-JSON, vb.)
- Kendini tanımlayan format
- Base32 kullanırken büyük/küçük harfe duyarsız
CIDv1 ne zaman kullanılır:
- Yeni uygulamalar geliştirirken
- Büyük/küçük harfe duyarsız tanımlayıcılara ihtiyaç duyduğunuzda
- Yapılandırılmış verilerle çalışırken (JSON, CBOR)
- Alternatif karma işlevleri kullanırken
Sürümler arasında dönüşüm
Aynı içerik referansını koruyarak CID’leri sürümler arasında dönüştürebilirsiniz:
// CIDv0
const cidv0 = "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG";
// Convert to CIDv1 Base32
const cidv1 = "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi";
// Both reference the same content!İçerik adresleme nasıl çalışır
IPFS’deki içerik adresleme, aynı içeriğin her zaman aynı CID’yi üretmesini sağlayan deterministik bir süreç izler:
1. İçerik hazırlığı
IPFS’e içerik eklediğinizde, önce parçalara ayrılır:
- Küçük dosyalar: Tek bloklar olarak saklanır
- Büyük dosyalar: Parçalara bölünür ve Merkle DAG (Yönlendirilmiş Asiklik Grafik) içinde organize edilir
- Dizinler: Dosyalara bağlanan DAG yapıları olarak temsil edilir
2. Karma süreci
Her içerik parçası şunlardan geçer:
- Serileştirme: İçerik codec’ine göre biçimlendirilir
- Karma: Kriptografik karma işlevi serileştirilmiş veriyi işler
- Multihash oluşturma: Karma, algoritma ve uzunluk bilgisiyle sarılır
- CID birleştirme: Sürüm, codec ve multihash birleştirilir
3. Merkle DAG yapısı
IPFS içeriği bir Merkle DAG’da organize eder, burada:
- Her düğümün bir CID’si vardır
- Ebeveyn düğümler CID ile alt düğümlere referans verir
- Herhangi bir düğümdeki değişiklikler ağaç boyunca yayılır
- Tüm yapılar kriptografik olarak doğrulanabilir
Root CID: bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
├── file1.txt (QmHash1...)
├── file2.jpg (QmHash2...)
└── subdirectory/
├── file3.pdf (QmHash3...)
└── file4.mp4 (QmHash4...)Pratik örnekler: CID’lerle çalışma
IPFS Ninja API kullanarak CID’lerle pratikte nasıl çalışılacağını keşfedelim:
İçerik yükleme ve CID alma
// 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: bafkreifjxz6zwqh27k5xnr5qfbx4w6n5vuwwwdcngguwjewzj2e3xxfgviCID ile mevcut içeriği sabitleme
Zaten bir CID’niz varsa, kullanılabilirliği garanti etmek için onu sabitleyebilirsiniz:
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');CID üzerinden içeriğe erişim
Bir CID’niz olduğunda, içeriğe çeşitli yöntemlerle erişebilirsiniz:
// 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;
};Geliştiriciler için CID en iyi uygulamaları
1. CID’leri her zaman doğrulayın
Bir CID’yi uygulamanızda kullanmadan önce formatını doğrulayın:
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. Her iki CID sürümünü de işleyin
Uygulamanız hem CIDv0 hem de CIDv1 ile çalışmalıdır:
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. CID eşlemelerini önbelleğe alın
Sık sık CID oluşturuyorsanız, önbelleğe almayı düşünün:
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. Anlamlı açıklamalar kullanın
İçerik yüklerken, açıklayıcı metadata ekleyin:
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'
}
})
});
};Yaygın CID kullanım durumları
1. Statik web sitesi dağıtımı
Tüm web sitelerini IPFS’e dağıtın ve CID ile referans verin:
// 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;
};Web sitesi dağıtımı hakkında daha fazla bilgi için, IPFS’e dosya nasıl yüklenir kılavuzumuza göz atın.
2. NFT metadata depolama
NFT metadata’yı CID’ler kullanarak değişmez şekilde saklayın:
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. İçerik dağıtımı
Dağıtık içerik teslimatı için CID’leri kullanın:
// 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 };
};CID’lerle IPFS sabitlemeyi anlamak
CID’ler varsayılan olarak geçicidir — kullanılabilir kalmaları için “sabitlenmeleri” gerekir. Bu önemli kavram hakkında daha fazla bilgi için, IPFS sabitlemenin ne olduğu hakkındaki kapsamlı kılavuzumuza bakın.
Bir IPFS sabitleme hizmeti seçerken, IPFS Ninja vs Pinata karşılaştırmamızı okumayı düşünün veya bugün mevcut olan en iyi IPFS sabitleme hizmetlerinin özetimizi keşfedin.
30 saniyede ilk CID’nizi oluşturun
İlk CID’nizi oluşturmaya hazır mısınız? IPFS Ninja API kullanarak hızlı bir örnek:
# 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();Bu şöyle bir şey döndürecek:
{
"cid": "bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
"sizeMB": 0.000017,
"uris": {
"ipfs": "ipfs://bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
"url": "https://ipfs.ninja/ipfs/bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw"
}
}Daha ayrıntılı API örnekleri için, IPFS yükleme API eğitici belgemize bakın.
Sonuç
CID’ler, IPFS’in içerik adresleme sisteminin temelidir ve değişmez, doğrulanabilir ve merkeziyetsiz içerik tanımlaması sağlar. Nasıl çalıştıklarını anlamak — CIDv0 vs CIDv1’in teknik detaylarından pratik uygulama desenlerine kadar — sağlam merkeziyetsiz uygulamalar geliştirmek için çok önemlidir.
Temel çıkarımlar:
- CID’ler içeriği benzersiz olarak tanımlar, konumları değil
- CIDv0 maksimum uyumluluk sağlar, CIDv1 esneklik sunar
- İçerik adresleme doğrulama ve tekilleştirmeyi sağlar
- Doğru CID işleme, üretim uygulamaları için çok önemlidir
İster NFT metadata saklıyor, ister merkeziyetsiz web siteleri dağıtıyor, ister içerik dağıtım sistemleri geliştiriyor olun, CID’ler gerçek anlamda merkeziyetsiz uygulamalar için ihtiyacınız olan güvenilir temeli sağlar.
Sabitlemeye başlamaya hazır mısınız? Ücretsiz hesap oluşturun — 50 dosya, 1 GB depolama, 2 GB bant genişliği/ay. Kredi kartı gerekmez.
