· Nacho Coll · Guides · 9 min de lectura
IPFS CID explicat: què és i com funciona l'adreçament de contingut
Explicació tècnica clara dels IPFS Content Identifiers (CIDs). Com funciona l'adreçament de contingut, versions de CID i com crear el teu primer CID.

Si alguna vegada has treballat amb IPFS (InterPlanetary File System), probablement t’has trobat amb cadenes com QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG o bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi. No són galimatieso aleatori — són Content Identifiers (CIDs), la columna vertebral del sistema d’adreçament de contingut d’IPFS.
Entendre els CIDs és crucial per a qualsevol que construeixi sobre IPFS, tant si pugues fitxers, com si construeixes aplicacions descentralitzades o implementes sistemes de distribució de contingut. Aquesta guia desglossarà tot el que necessites saber sobre els CIDs d’IPFS, com funciona l’adreçament de contingut i com començar a utilitzar-los en els teus projectes.

Què és un IPFS CID?
Un Content Identifier (CID) és una empremta digital única que representa un fragment de contingut a IPFS. A diferència de les URL web tradicionals que apunten a una ubicació (com https://example.com/file.pdf), els CIDs apunten al contingut mateix, independentment d’on estigui emmagatzemat.
Pensa-ho així:
- Adreçament basat en la ubicació: «Vés al carrer Major 123 i demana el llibre vermell»
- Adreçament basat en el contingut: «Troba el llibre amb ISBN 978-0-123456-78-9» (no importa quina biblioteca el tingui)
Els CIDs funcionen de manera similar — identifiquen contingut basat en el seu hash criptogràfic, fent el contingut immutable i verificable. Si canvia un sol byte al fitxer, el CID canvia completament.
Per què importa l’adreçament de contingut
L’arquitectura web tradicional es basa en l’adreçament basat en la ubicació. Quan visites https://example.com/image.jpg, confies en que:
- El propietari del domini no ha canviat el contingut
- El servidor està en línia i accessible
- El contingut no ha estat manipulat
Amb l’adreçament de contingut utilitzant CIDs:
- Immutabilitat: El CID garanteix que el contingut no ha canviat
- Descentralització: El contingut es pot recuperar des de qualsevol node IPFS que el tingui
- Verificació: Pots verificar criptogràficament que has rebut el contingut correcte
- Eficiència: El contingut idèntic es deduplica automàticament
Anatomia d’un CID
Desglossem un CID típic per entendre els seus components:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
└─┬─┘└─────────────────┬─────────────────────────────────┘
│ │
│ └─ Hash del contingut (Base32 codificat)
└─ Prefix Multibase (indica codificació)Un CID conté diverses peces d’informació:
1. Prefix Multibase
El primer caràcter indica com està codificat el CID:
Q= Codificació Base58 (CIDv0)b= Codificació Base32 (CIDv1)f= Base16/hexadecimal (CIDv1)z= Base58 (CIDv1)
2. Versió CID
- CIDv0: Sempre comença amb
Qm, utilitza SHA-256, limitat al codec DAG-PB - CIDv1: Més flexible, suporta múltiples funcions de hash i codecs
3. Multicodec
Especifica com s’estructura el contingut (DAG-PB, DAG-CBOR, bytes en cru, etc.)
4. Multihash
El hash criptogràfic real del contingut, inclòs:
- Identificador de la funció de hash (generalment SHA-256)
- Longitud del hash
- El digest del hash
CIDv0 vs CIDv1: Entenent les diferències
IPFS ha evolucionat a través de dues versions principals de CID, cadascuna amb característiques distintives:
CIDv0: El format original
Els CIDs CIDv0 sempre comencen amb Qm i tenen aquest aspecte:
QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdGCaracterístiques:
- Només codificació Base58
- Només funció de hash SHA-256
- Només codec DAG-PB (Protobuf)
- 46 caràcters de longitud
- Compatible amb totes les implementacions IPFS
Quan utilitzar CIDv0:
- Màxima compatibilitat amb nodes IPFS més antics
- Treballar amb sistemes existents que esperen prefixos
Qm - Emmagatzematge de fitxers (cas d’ús més comú)
CIDv1: L’estàndard modern
Els CIDs CIDv1 són més flexibles i poden semblar així:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi # Base32
zb2rhj7crUKTQYRGCRATFaQ6YFLTde2YzdqbbhAASkL9uRDXn # Base58
f01551220d1e2c35... # Base16Característiques:
- Múltiples formats de codificació (Base32, Base58, Base16)
- Suport per a diferents funcions de hash (SHA-256, SHA-512, BLAKE2, etc.)
- Múltiples codecs (Raw, DAG-CBOR, DAG-JSON, etc.)
- Format autodescriptiu
- Insensible a majúscules en utilitzar Base32
Quan utilitzar CIDv1:
- Construir noves aplicacions
- Necessitar identificadors insensibles a majúscules
- Treballar amb dades estructurades (JSON, CBOR)
- Utilitzar funcions de hash alternatives
Convertir entre versions
Pots convertir CIDs entre versions mantenint la mateixa referència de contingut:
// CIDv0
const cidv0 = "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG";
// Convert to CIDv1 Base32
const cidv1 = "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi";
// Both reference the same content!Com funciona l’adreçament de contingut
L’adreçament de contingut a IPFS segueix un procés determinista que assegura que el mateix contingut sempre produeix el mateix CID:
1. Preparació del contingut
Quan afegeixes contingut a IPFS, primer es descompon:
- Fitxers petits: Emmagatzemats com a blocs únics
- Fitxers grans: Dividits en trossos i organitzats en un Merkle DAG (graf acíclic dirigit)
- Directoris: Representats com a estructures DAG que enllacen amb fitxers
2. Procés de hashing
Cada fragment de contingut passa per:
- Serialització: El contingut es formata segons el seu codec
- Hashing: Una funció de hash criptogràfica processa les dades serialitzades
- Creació de Multihash: El hash s’envolca amb informació d’algoritme i longitud
- Acoblament del CID: La versió, el codec i el multihash es combinen
3. Estructura Merkle DAG
IPFS organitza el contingut en un Merkle DAG on:
- Cada node té un CID
- Els nodes pares fan referència als nodes fills via CID
- Els canvis en qualsevol node es propaguen per l’arbre
- Estructures senceres es poden verificar criptogràficament
Root CID: bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
├── file1.txt (QmHash1...)
├── file2.jpg (QmHash2...)
└── subdirectory/
├── file3.pdf (QmHash3...)
└── file4.mp4 (QmHash4...)Exemples pràctics: Treballant amb CIDs
Explorem com treballar amb CIDs a la pràctica utilitzant l’API d’IPFS Ninja:
Pujar contingut i obtenir un 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: bafkreifjxz6zwqh27k5xnr5qfbx4w6n5vuwwwdcngguwjewzj2e3xxfgviFixar contingut existent per CID
Si ja tens un CID, pots fixar-lo per garantir la disponibilitat:
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');Accedir al contingut via CID
Un cop tens un CID, pots accedir al contingut mitjançant diferents mètodes:
// 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;
};Bones pràctiques de CID per a desenvolupadors
1. Valida sempre els CIDs
Abans d’utilitzar un CID a la teva aplicació, valida el seu 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. Gestiona ambdues versions de CID
La teva aplicació hauria de funcionar tant amb CIDv0 com amb 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. Memoritza els mapatges de CID
Si generes CIDs freqüentment, considera la memòria cau:
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. Utilitza descripcions significatives
En pujar contingut, inclou metadades descriptives:
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'
}
})
});
};Casos d’ús comuns de CID
1. Desplegament de llocs web estàtics
Desplega llocs web sencers a IPFS i referencia-los per 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;
};Per saber més sobre el desplegament de llocs web, mira la nostra guia sobre com pujar fitxers a IPFS.
2. Emmagatzematge de metadades NFT
Emmagatzema metadades NFT de manera immutable utilitzant 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. Distribució de contingut
Utilitza CIDs per a la lliurament distribuït de contingut:
// 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 };
};Entenent el pinning d’IPFS amb CIDs
Els CIDs són temporals per defecte — han de ser «fixats» per romandre disponibles. Aprèn més sobre aquest concepte crucial a la nostra guia completa sobre què és el pinning d’IPFS.
En triar un servei de pinning d’IPFS, considera llegir la nostra comparació IPFS Ninja vs Pinata o explora el nostre recull dels millors serveis de pinning d’IPFS disponibles avui.
Crea el teu primer CID en 30 segons
Preparat per generar el teu primer CID? Aquí tens un exemple ràpid utilitzant l’API d’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();Això retornarà alguna cosa com:
{
"cid": "bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
"sizeMB": 0.000017,
"uris": {
"ipfs": "ipfs://bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
"url": "https://ipfs.ninja/ipfs/bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw"
}
}Per a exemples d’API més detallats, mira el nostre tutorial d’API d’upload IPFS.
Conclusió
Els CIDs són el fonament del sistema d’adreçament de contingut d’IPFS, proporcionant identificació de contingut immutable, verificable i descentralitzada. Entendre com funcionen — des dels detalls tècnics de CIDv0 vs CIDv1 fins als patrons pràctics d’implementació — és essencial per construir aplicacions descentralitzades robustes.
Punts clau:
- Els CIDs identifiquen el contingut de manera única, no ubicacions
- CIDv0 proporciona compatibilitat màxima, CIDv1 ofereix flexibilitat
- L’adreçament de contingut permet la verificació i la deduplicació
- La gestió adequada de CID és crucial per a aplicacions de producció
Tant si estàs emmagatzemant metadades NFT, desplegant llocs web descentralitzats, o construint sistemes de distribució de contingut, els CIDs proporcionen la base fiable que necessites per a aplicacions realment descentralitzades.
Preparat per començar a fer pinning? Crea un compte gratuït — 50 fitxers, 1 GB d’emmagatzematge, 2 GB d’ample de banda/mes. Sense targeta de crèdit.
