· Nacho Coll · Guides · 9 min di lettura
IPFS CID spiegato: cos'è e come funziona l'indirizzamento per contenuto
Spiegazione tecnica chiara dei Content Identifier (CID) di IPFS. Come funziona l'indirizzamento per contenuto, le versioni di CID e come creare il tuo primo CID.

Se hai mai lavorato con IPFS (InterPlanetary File System), probabilmente ti sei imbattuto in stringhe come QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG o bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi. Non si tratta di stringhe casuali — sono Content Identifier (CID), la spina dorsale del sistema di indirizzamento per contenuto di IPFS.
Capire i CID è fondamentale per chiunque costruisca su IPFS, che si tratti di caricare file, costruire applicazioni decentralizzate o implementare sistemi di distribuzione dei contenuti. Questa guida ti spiegherà tutto ciò che devi sapere sui CID di IPFS, come funziona l’indirizzamento per contenuto e come iniziare a usarli nei tuoi progetti.

Cos’è un CID di IPFS?
Un Content Identifier (CID) è un’impronta digitale unica che rappresenta un contenuto su IPFS. A differenza degli URL web tradizionali che puntano a una posizione (come https://example.com/file.pdf), i CID puntano al contenuto stesso, indipendentemente da dove sia memorizzato.
Immaginala così:
- Indirizzamento per posizione: «Vai in Via Principale 123 e chiedi il libro rosso»
- Indirizzamento per contenuto: «Trova il libro con ISBN 978-0-123456-78-9» (non importa quale biblioteca lo abbia)
I CID funzionano in modo simile — identificano i contenuti tramite il loro hash crittografico, rendendoli immutabili e verificabili. Se cambia anche un solo byte del file, il CID cambia completamente.
Perché l’indirizzamento per contenuto è importante
L’architettura web tradizionale si basa sull’indirizzamento per posizione. Quando visiti https://example.com/image.jpg, ti fidi che:
- Il proprietario del dominio non abbia cambiato il contenuto
- Il server sia online e accessibile
- Il contenuto non sia stato manomesso
Con l’indirizzamento per contenuto tramite CID:
- Immutabilità: Il CID garantisce che il contenuto non sia cambiato
- Decentralizzazione: Il contenuto può essere recuperato da qualsiasi nodo IPFS che lo possiede
- Verifica: Puoi verificare crittograficamente di aver ricevuto il contenuto corretto
- Efficienza: Contenuti identici vengono deduplicati automaticamente
Anatomia di un CID
Analizziamo un CID tipico per capirne i componenti:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
└─┬─┘└─────────────────┬─────────────────────────────────┘
│ │
│ └─ Hash del contenuto (codificato in Base32)
└─ Prefisso Multibase (indica la codifica)Un CID contiene diverse informazioni:
1. Prefisso Multibase
Il primo carattere indica come è codificato il CID:
Q= Codifica Base58 (CIDv0)b= Codifica Base32 (CIDv1)f= Base16/esadecimale (CIDv1)z= Base58 (CIDv1)
2. Versione del CID
- CIDv0: Inizia sempre con
Qm, usa SHA-256, limitato al codec DAG-PB - CIDv1: Più flessibile, supporta più funzioni hash e codec
3. Multicodec
Specifica come è strutturato il contenuto (DAG-PB, DAG-CBOR, byte grezzi, ecc.)
4. Multihash
L’hash crittografico effettivo del contenuto, che include:
- Identificatore della funzione hash (di solito SHA-256)
- Lunghezza dell’hash
- Il digest dell’hash
CIDv0 vs CIDv1: Capire le differenze
IPFS si è evoluto attraverso due versioni principali di CID, ognuna con caratteristiche distinte:
CIDv0: Il formato originale
I CID CIDv0 iniziano sempre con Qm e sono fatti così:
QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdGCaratteristiche:
- Solo codifica Base58
- Solo funzione hash SHA-256
- Solo codec DAG-PB (Protobuf)
- 46 caratteri di lunghezza
- Retrocompatibili con tutte le implementazioni IPFS
Quando usare CIDv0:
- Massima compatibilità con nodi IPFS più vecchi
- Lavorare con sistemi esistenti che si aspettano prefissi
Qm - Storage di file (caso d’uso più comune)
CIDv1: Lo standard moderno
I CID CIDv1 sono più flessibili e possono apparire così:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi # Base32
zb2rhj7crUKTQYRGCRATFaQ6YFLTde2YzdqbbhAASkL9uRDXn # Base58
f01551220d1e2c35... # Base16Caratteristiche:
- Formati di codifica multipli (Base32, Base58, Base16)
- Supporto per diverse funzioni hash (SHA-256, SHA-512, BLAKE2, ecc.)
- Codec multipli (Raw, DAG-CBOR, DAG-JSON, ecc.)
- Formato auto-descrittivo
- Insensibile al maiuscolo/minuscolo quando si usa Base32
Quando usare CIDv1:
- Costruire nuove applicazioni
- Avere bisogno di identificatori insensibili al case
- Lavorare con dati strutturati (JSON, CBOR)
- Usare funzioni hash alternative
Conversione tra versioni
Puoi convertire i CID tra versioni mantenendo lo stesso riferimento al contenuto:
// CIDv0
const cidv0 = "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG";
// Convert to CIDv1 Base32
const cidv1 = "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi";
// Both reference the same content!Come funziona l’indirizzamento per contenuto
L’indirizzamento per contenuto in IPFS segue un processo deterministico che garantisce che lo stesso contenuto produca sempre lo stesso CID:
1. Preparazione del contenuto
Quando aggiungi contenuto a IPFS, viene prima scomposto:
- File piccoli: Memorizzati come blocchi singoli
- File grandi: Suddivisi in chunk e organizzati in un Merkle DAG (Directed Acyclic Graph)
- Directory: Rappresentate come strutture DAG che collegano i file
2. Processo di hashing
Ogni pezzo di contenuto attraversa:
- Serializzazione: Il contenuto viene formattato secondo il suo codec
- Hashing: Una funzione hash crittografica elabora i dati serializzati
- Creazione del Multihash: L’hash viene incapsulato con informazioni su algoritmo e lunghezza
- Assemblaggio del CID: Versione, codec e multihash vengono combinati
3. Struttura Merkle DAG
IPFS organizza i contenuti in un Merkle DAG dove:
- Ogni nodo ha un CID
- I nodi padre fanno riferimento ai nodi figlio tramite CID
- I cambiamenti in qualsiasi nodo si propagano nell’albero
- Intere strutture possono essere verificate crittograficamente
Root CID: bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
├── file1.txt (QmHash1...)
├── file2.jpg (QmHash2...)
└── subdirectory/
├── file3.pdf (QmHash3...)
└── file4.mp4 (QmHash4...)Esempi pratici: Lavorare con i CID
Esploriamo come lavorare con i CID nella pratica usando l’API di IPFS Ninja:
Caricare contenuto e ottenere 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: bafkreifjxz6zwqh27k5xnr5qfbx4w6n5vuwwwdcngguwjewzj2e3xxfgviPinnare contenuto esistente tramite CID
Se hai già un CID, puoi pinnarlo per garantire che rimanga disponibile:
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');Accedere ai contenuti tramite CID
Una volta che hai un CID, puoi accedere al contenuto con diversi metodi:
// 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;
};Best practice per CID per sviluppatori
1. Valida sempre i CID
Prima di usare un CID nella tua applicazione, validane il formato:
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. Gestisci entrambe le versioni di CID
La tua applicazione dovrebbe funzionare sia con CIDv0 che con 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. Memorizza le mappature CID nella cache
Se generi CID frequentemente, considera di mettere in cache:
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. Usa descrizioni significative
Quando carichi contenuti, includi metadata descrittivi:
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'
}
})
});
};Casi d’uso comuni dei CID
1. Deploy di siti statici
Distribuisci interi siti web su IPFS e fai riferimento ad essi tramite 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 saperne di più sul deploy di siti web, dai un’occhiata alla nostra guida su come caricare file su IPFS.
2. Storage di metadata NFT
Memorizza i metadata NFT in modo immutabile usando i 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. Distribuzione di contenuti
Usa i CID per la distribuzione di contenuti decentralizzata:
// 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 };
};Capire il pinning IPFS con i CID
I CID sono temporanei per default — devono essere «pinnati» per rimanere disponibili. Scopri di più su questo concetto cruciale nella nostra guida completa su cos’è il pinning IPFS.
Quando scegli un servizio di pinning IPFS, considera di leggere il nostro confronto IPFS Ninja vs Pinata o esplora il nostro riepilogo dei migliori servizi di pinning IPFS disponibili oggi.
Crea il tuo primo CID in 30 secondi
Pronto a generare il tuo primo CID? Ecco un esempio rapido usando l’API di 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();Questo restituirà qualcosa di simile:
{
"cid": "bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
"sizeMB": 0.000017,
"uris": {
"ipfs": "ipfs://bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
"url": "https://ipfs.ninja/ipfs/bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw"
}
}Per esempi API più dettagliati, vedi il nostro tutorial dell’API di upload IPFS.
Conclusione
I CID sono il fondamento del sistema di indirizzamento per contenuto di IPFS, fornendo identificazione del contenuto immutabile, verificabile e decentralizzata. Capire come funzionano — dai dettagli tecnici di CIDv0 vs CIDv1 ai pattern pratici di implementazione — è essenziale per costruire applicazioni decentralizzate robuste.
Punti chiave:
- I CID identificano univocamente i contenuti, non le posizioni
- CIDv0 offre massima compatibilità, CIDv1 offre flessibilità
- L’indirizzamento per contenuto consente la verifica e la deduplicazione
- Una gestione corretta dei CID è cruciale per le applicazioni di produzione
Sia che tu stia memorizzando metadata NFT, distribuendo siti web decentralizzati o costruendo sistemi di distribuzione dei contenuti, i CID forniscono la base affidabile necessaria per applicazioni veramente decentralizzate.
Pronto a iniziare a pinnare? Crea un account gratuito — 50 file, 1 GB di storage, 2 GB di banda/mese. Senza carta di credito.
