· Nacho Coll · Guides · 8 min čitanja
IPFS CID objašnjen: što je to i kako funkcionira sadržajno adresiranje
Jasno tehničko objašnjenje IPFS Content Identifiera (CIDs). Kako funkcionira sadržajno adresiranje, CID verzije i kako stvoriti svoj prvi CID.

Ako ste ikada radili s IPFS-om (InterPlanetary File System), vjerojatno ste naišli na nizove poput QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG ili bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi. Ovo nisu nasumične besmislice — to su Content Identifieri (CIDs), okosnica sustava sadržajnog adresiranja IPFS-a.
Razumijevanje CIDs-a ključno je za svakoga tko gradi na IPFS-u, bilo da prenosite datoteke, gradite decentralizirane aplikacije ili implementirate sustave distribucije sadržaja. Ovaj vodič razložit će sve što trebate znati o IPFS CIDs-ima, kako funkcionira sadržajno adresiranje i kako početi koristiti ih u svojim projektima.

Što je IPFS CID?
Content Identifier (CID) je jedinstveni otisak prsta koji predstavlja komad sadržaja na IPFS-u. Za razliku od tradicionalnih web URL-ova koji pokazuju na lokaciju (poput https://example.com/file.pdf), CIDs pokazuju na sam sadržaj, bez obzira gdje je pohranjen.
Razmislite o tome ovako:
- Adresiranje temeljeno na lokaciji: „Idite na Glavnu ulicu 123 i tražite crvenu knjigu”
- Adresiranje temeljeno na sadržaju: „Pronađite knjigu s ISBN-om 978-0-123456-78-9” (nije važno koja knjižnica je ima)
CIDs rade slično — identificiraju sadržaj na temelju njegove kriptografske hash vrijednosti, čineći sadržaj nepromjenjivim i provjerljivim. Ako se promijeni samo jedan bajt u datoteci, CID se potpuno mijenja.
Zašto je sadržajno adresiranje važno
Tradicionalna web arhitektura oslanja se na adresiranje temeljeno na lokaciji. Kada posjetite https://example.com/image.jpg, vjerujete da:
- Vlasnik domene nije promijenio sadržaj
- Poslužitelj je online i dostupan
- Sadržaj nije bio manipuliran
Sa sadržajnim adresiranjem koristeći CIDs:
- Nepromjenjivost: CID jamči da se sadržaj nije promijenio
- Decentralizacija: Sadržaj se može dohvatiti s bilo kojeg IPFS čvora koji ga ima
- Provjera: Možete kriptografski provjeriti da ste primili točan sadržaj
- Učinkovitost: Identičan sadržaj se automatski deduplicira
Anatomija CID-a
Razložimo tipični CID kako bismo razumjeli njegove komponente:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
└─┬─┘└─────────────────┬─────────────────────────────────┘
│ │
│ └─ Hash sadržaja (Base32 kodiran)
└─ Multibase prefiks (označava kodiranje)CID sadrži nekoliko informacija:
1. Multibase prefiks
Prvi znak označava kako je CID kodiran:
Q= Base58 kodiranje (CIDv0)b= Base32 kodiranje (CIDv1)f= Base16/heksadecimalno (CIDv1)z= Base58 (CIDv1)
2. CID verzija
- CIDv0: Uvijek počinje s
Qm, koristi SHA-256, ograničen na DAG-PB codec - CIDv1: Fleksibilniji, podržava više hash funkcija i codeca
3. Multicodec
Određuje kako je sadržaj strukturiran (DAG-PB, DAG-CBOR, sirovi bajtovi itd.)
4. Multihash
Stvarna kriptografska hash vrijednost sadržaja, uključujući:
- Identifikator hash funkcije (obično SHA-256)
- Duljinu hash-a
- Hash digest
CIDv0 vs CIDv1: Razumijevanje razlika
IPFS je evoluirao kroz dvije glavne verzije CID-a, svaka s različitim karakteristikama:
CIDv0: Izvorni format
CIDv0 CIDs uvijek počinju s Qm i izgledaju ovako:
QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdGKarakteristike:
- Samo Base58 kodiranje
- Samo SHA-256 hash funkcija
- Samo DAG-PB (Protobuf) codec
- 46 znakova duljine
- Unatrag kompatibilan sa svim IPFS implementacijama
Kada koristiti CIDv0:
- Maksimalna kompatibilnost sa starijim IPFS čvorovima
- Rad s postojećim sustavima koji očekuju
Qmprefikse - Pohrana datoteka (najčešći slučaj uporabe)
CIDv1: Moderni standard
CIDv1 CIDs su fleksibilniji i mogu izgledati ovako:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi # Base32
zb2rhj7crUKTQYRGCRATFaQ6YFLTde2YzdqbbhAASkL9uRDXn # Base58
f01551220d1e2c35... # Base16Karakteristike:
- Više formata kodiranja (Base32, Base58, Base16)
- Podrška za različite hash funkcije (SHA-256, SHA-512, BLAKE2 itd.)
- Više codeca (Raw, DAG-CBOR, DAG-JSON itd.)
- Samoopisni format
- Neosjetljiv na velika/mala slova pri Base32 uporabi
Kada koristiti CIDv1:
- Izgradnja novih aplikacija
- Potreba za identifikatorima neosjetljivim na velika slova
- Rad sa strukturiranim podacima (JSON, CBOR)
- Korištenje alternativnih hash funkcija
Konverzija između verzija
Možete konvertirati CIDs između verzija dok održavate istu referencu sadržaja:
// CIDv0
const cidv0 = "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG";
// Convert to CIDv1 Base32
const cidv1 = "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi";
// Both reference the same content!Kako funkcionira sadržajno adresiranje
Sadržajno adresiranje u IPFS-u slijedi deterministički proces koji osigurava da isti sadržaj uvijek proizvodi isti CID:
1. Priprema sadržaja
Kada dodate sadržaj u IPFS, prvo se razlaže:
- Male datoteke: Pohranjene kao pojedinačni blokovi
- Velike datoteke: Podijeljene u dijelove i organizirane u Merkle DAG (usmjereni aciklički graf)
- Direktoriji: Predstavljeni kao DAG strukture koje povezuju s datotekama
2. Proces hashinga
Svaki dio sadržaja prolazi kroz:
- Serijalizaciju: Sadržaj se formatira prema svojem codecu
- Hashing: Kriptografska hash funkcija obrađuje serijalizirane podatke
- Multihash stvaranje: Hash se omata informacijama o algoritmu i duljini
- CID sklapanje: Verzija, codec i multihash se kombiniraju
3. Merkle DAG struktura
IPFS organizira sadržaj u Merkle DAG gdje:
- Svaki čvor ima CID
- Roditeljski čvorovi referenciraju dječje čvorove putem CID-a
- Promjene u bilo kojem čvoru se propagiraju kroz stablo
- Cijele strukture se mogu kriptografski provjeriti
Root CID: bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
├── file1.txt (QmHash1...)
├── file2.jpg (QmHash2...)
└── subdirectory/
├── file3.pdf (QmHash3...)
└── file4.mp4 (QmHash4...)Praktični primjeri: Rad s CIDs-ima
Istražimo kako raditi s CIDs-ima u praksi koristeći IPFS Ninja API:
Učitavanje sadržaja i dobivanje CID-a
// 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: bafkreifjxz6zwqh27k5xnr5qfbx4w6n5vuwwwdcngguwjewzj2e3xxfgviPinanje postojećeg sadržaja po CID-u
Ako već imate CID, možete ga pinati kako biste osigurali dostupnost:
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');Pristup sadržaju putem CID-a
Jednom kada imate CID, možete pristupiti sadržaju putem različitih metoda:
// 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;
};Najbolje prakse CID-a za razvijatelje
1. Uvijek validirajte CIDs
Prije korištenja CID-a u vašoj aplikaciji, validirajte njegov format:
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. Rukujte obje verzije CID-a
Vaša aplikacija trebala bi raditi s CIDv0 i 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. Spremajte CID mapiranja u predmemoriju
Ako često generirate CIDs, razmotrite 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. Koristite smislene opise
Pri učitavanju sadržaja, uključite opisne metapodatke:
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'
}
})
});
};Uobičajeni slučajevi uporabe CID-a
1. Implementacija statičkih web stranica
Implementirajte cijele web stranice na IPFS i referencirajte ih putem CID-a:
// 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;
};Za više informacija o implementaciji web stranica, pogledajte naš vodič o tome kako učitati datoteke na IPFS.
2. Pohrana NFT metapodataka
Pohranjujte NFT metapodatke nepromjenjivo koristeći CIDs:
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. Distribucija sadržaja
Koristite CIDs za distribuiranu isporuku sadržaja:
// 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 };
};Razumijevanje IPFS pinninga s CIDs-ima
CIDs su prema zadanim postavkama privremeni — moraju se „pinati” kako bi ostali dostupni. Saznajte više o ovom ključnom konceptu u našem sveobuhvatnom vodiču o tome što je IPFS pinning.
Pri odabiru IPFS pinning usluge, razmotrite čitanje naše usporedbe IPFS Ninja vs Pinata ili istražite naš pregled najboljih IPFS pinning usluga dostupnih danas.
Stvorite svoj prvi CID za 30 sekundi
Spremni stvoriti svoj prvi CID? Evo brzog primjera koristeći IPFS Ninja API:
# 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();Ovo će vratiti nešto poput:
{
"cid": "bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
"sizeMB": 0.000017,
"uris": {
"ipfs": "ipfs://bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
"url": "https://ipfs.ninja/ipfs/bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw"
}
}Za detaljnije primjere API-ja, pogledajte naš tutorial IPFS upload API.
Zaključak
CIDs su temelj sustava sadržajnog adresiranja IPFS-a, pružajući nepromjenjivu, provjerljivu i decentraliziranu identifikaciju sadržaja. Razumijevanje kako funkcioniraju — od tehničkih detalja CIDv0 vs CIDv1 do praktičnih obrazaca implementacije — je ključno za izgradnju robusnih decentraliziranih aplikacija.
Ključni zaključci:
- CIDs jedinstveno identificiraju sadržaj, ne lokacije
- CIDv0 pruža maksimalnu kompatibilnost, CIDv1 nudi fleksibilnost
- Sadržajno adresiranje omogućuje provjeru i deduplikaciju
- Pravilno rukovanje CID-om je ključno za produkcijske aplikacije
Bilo da pohranjujete NFT metapodatke, implementirate decentralizirane web stranice ili gradite sustave distribucije sadržaja, CIDs pružaju pouzdanu osnovu koja vam je potrebna za istinski decentralizirane aplikacije.
Spremni započeti pinanje? Stvorite besplatni račun — 50 datoteka, 1 GB pohrane, 2 GB propusnosti/mjesec. Bez kreditne kartice.
