· Nacho Coll · Guides · 8 min lesing
IPFS CID forklart: hva det er og hvordan innholdsadressering fungerer
Klar teknisk forklaring av IPFS Content Identifiers (CIDs). Hvordan innholdsadressering fungerer, CID-versjoner og hvordan du oppretter din første CID.

Hvis du noen gang har jobbet med IPFS (InterPlanetary File System), har du sannsynligvis sett strenger som QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG eller bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi. Dette er ikke tilfeldig vrøvl — det er Content Identifiers (CIDs), ryggraden i IPFS’ innholdsadresseringssystem.
Å forstå CIDs er avgjørende for alle som bygger på IPFS, enten du laster opp filer, bygger desentraliserte applikasjoner eller implementerer innholdsdistribusjonssystemer. Denne guiden vil dekke alt du trenger å vite om IPFS CIDs, hvordan innholdsadressering fungerer, og hvordan du kommer i gang med å bruke dem i prosjektene dine.

Hva er en IPFS CID?
En Content Identifier (CID) er et unikt fingeravtrykk som representerer et innholdsstykke på IPFS. I motsetning til tradisjonelle web-URL-er som peker til en plassering (som https://example.com/file.pdf), peker CIDs til selve innholdet, uansett hvor det er lagret.
Tenk på det slik:
- Plasseringsbasert adressering: “Gå til Hovedgaten 123 og spør om den røde boken”
- Innholdsbasert adressering: “Finn boken med ISBN 978-0-123456-78-9” (hvilket bibliotek som har den, spiller ingen rolle)
CIDs fungerer på lignende måte — de identifiserer innhold basert på dets kryptografiske hash, og gjør innholdet uforanderlig og verifiserbart. Hvis en eneste byte endres i filen, endres CID-en helt.
Hvorfor innholdsadressering er viktig
Tradisjonell webarkitektur er avhengig av plasseringsbasert adressering. Når du besøker https://example.com/image.jpg, stoler du på at:
- Domeneieren ikke har endret innholdet
- Serveren er online og tilgjengelig
- Innholdet ikke er blitt manipulert
Med innholdsadressering ved bruk av CIDs:
- Uforanderlighet: CID-en garanterer at innholdet ikke er endret
- Desentralisering: Innhold kan hentes fra hvilken som helst IPFS-node som har det
- Verifisering: Du kan kryptografisk verifisere at du mottok riktig innhold
- Effektivitet: Identisk innhold dedupliseres automatisk
Anatomien til en CID
La oss bryte ned en typisk CID for å forstå komponentene:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
└─┬─┘└─────────────────┬─────────────────────────────────┘
│ │
│ └─ Innholdshash (Base32-kodet)
└─ Multibase-prefiks (angir koding)En CID inneholder flere informasjonsbiter:
1. Multibase-prefiks
Det første tegnet angir hvordan CID-en er kodet:
Q= Base58-koding (CIDv0)b= Base32-koding (CIDv1)f= Base16/heksadesimal (CIDv1)z= Base58 (CIDv1)
2. CID-versjon
- CIDv0: Starter alltid med
Qm, bruker SHA-256, begrenset til DAG-PB codec - CIDv1: Mer fleksibel, støtter flere hash-funksjoner og codecs
3. Multicodec
Spesifiserer hvordan innhold er strukturert (DAG-PB, DAG-CBOR, rå bytes, osv.)
4. Multihash
Den faktiske kryptografiske hashen av innholdet, inkludert:
- Hashfunksjons-identifikator (vanligvis SHA-256)
- Hash-lengde
- Hash-digesten
CIDv0 vs CIDv1: Forstå forskjellene
IPFS har utviklet seg gjennom to store CID-versjoner, hver med distinkte egenskaper:
CIDv0: Det originale formatet
CIDv0 CIDs starter alltid med Qm og ser slik ut:
QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdGEgenskaper:
- Kun Base58-koding
- Kun SHA-256 hashfunksjon
- Kun DAG-PB (Protobuf) codec
- 46 tegn lang
- Bakoverkompatibel med alle IPFS-implementasjoner
Når man skal bruke CIDv0:
- Maksimal kompatibilitet med eldre IPFS-noder
- Arbeid med eksisterende systemer som forventer
Qm-prefiks - Fillagring (vanligste bruksområde)
CIDv1: Den moderne standarden
CIDv1 CIDs er mer fleksible og kan se slik ut:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi # Base32
zb2rhj7crUKTQYRGCRATFaQ6YFLTde2YzdqbbhAASkL9uRDXn # Base58
f01551220d1e2c35... # Base16Egenskaper:
- Flere kodingsformater (Base32, Base58, Base16)
- Støtte for ulike hashfunksjoner (SHA-256, SHA-512, BLAKE2, osv.)
- Flere codecs (Raw, DAG-CBOR, DAG-JSON, osv.)
- Selvbeskrivende format
- Ikke skiftforskjellig ved Base32-bruk
Når man skal bruke CIDv1:
- Bygge nye applikasjoner
- Trenger skiftforskjellige identifikatorer
- Arbeid med strukturert data (JSON, CBOR)
- Bruk alternative hashfunksjoner
Konvertering mellom versjoner
Du kan konvertere CIDs mellom versjoner samtidig som du opprettholder samme innholdsreferanse:
// CIDv0
const cidv0 = "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG";
// Convert to CIDv1 Base32
const cidv1 = "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi";
// Both reference the same content!Hvordan innholdsadressering fungerer
Innholdsadressering i IPFS følger en deterministisk prosess som sikrer at det samme innholdet alltid produserer samme CID:
1. Innholdsforberedelse
Når du legger til innhold i IPFS, blir det først brutt ned:
- Små filer: Lagres som enkle blokker
- Store filer: Deles opp i biter og organiseres i en Merkle DAG (Directed Acyclic Graph)
- Kataloger: Representeres som DAG-strukturer som lenker til filer
2. Hashing-prosessen
Hvert innholdsstykke gjennomgår:
- Serialisering: Innhold formateres i henhold til sin codec
- Hashing: Kryptografisk hashfunksjon behandler den serialiserte dataen
- Multihash-opprettelse: Hash pakkes med algoritme- og lengdeinformasjon
- CID-sammensetning: Versjon, codec og multihash kombineres
3. Merkle DAG-struktur
IPFS organiserer innhold i en Merkle DAG hvor:
- Hver node har en CID
- Foreldrenoder refererer til barnenoder via CID
- Endringer i en node sprer seg oppover treet
- Hele strukturer kan kryptografisk verifiseres
Root CID: bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
├── file1.txt (QmHash1...)
├── file2.jpg (QmHash2...)
└── subdirectory/
├── file3.pdf (QmHash3...)
└── file4.mp4 (QmHash4...)Praktiske eksempler: Arbeid med CIDs
La oss utforske hvordan man jobber med CIDs i praksis ved hjelp av IPFS Ninja API:
Last opp innhold og få en 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 eksisterende innhold med CID
Hvis du allerede har en CID, kan du pinne den for å sikre tilgjengelighet:
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');Tilgang til innhold via CID
Når du har en CID, kan du få tilgang til innholdet via ulike metoder:
// 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;
};CID-beste praksis for utviklere
1. Valider alltid CIDs
Før du bruker en CID i applikasjonen din, valider formatet:
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. Håndter begge CID-versjoner
Applikasjonen din bør fungere med både CIDv0 og 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 CID-mappinger
Hvis du genererer CIDs ofte, vurder 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. Bruk meningsfulle beskrivelser
Når du laster opp innhold, inkluder beskrivende metadata:
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'
}
})
});
};Vanlige CID-bruksområder
1. Statisk nettstedutrulling
Rull ut hele nettsteder til IPFS og referer dem med 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;
};For å lære mer om nettstedutrulling, sjekk ut guiden vår om hvordan laste opp filer til IPFS.
2. NFT-metadatalagring
Lagre NFT-metadata uforanderlig ved bruk av 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. Innholdsdistribusjon
Bruk CIDs for distribuert innholdslevering:
// 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 };
};Forstå IPFS-pinning med CIDs
CIDs er midlertidige som standard — de må “pinnes” for å forbli tilgjengelige. Lær mer om dette avgjørende konseptet i vår omfattende guide om hva IPFS-pinning er.
Når du velger en IPFS-pinningstjeneste, vurder å lese vår IPFS Ninja vs Pinata sammenligning eller utforsk vår oversikt over de beste IPFS-pinningstjenestene som er tilgjengelige i dag.
Opprett din første CID på 30 sekunder
Klar til å generere din første CID? Her er et raskt eksempel ved bruk av 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();Dette vil returnere noe som:
{
"cid": "bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
"sizeMB": 0.000017,
"uris": {
"ipfs": "ipfs://bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
"url": "https://ipfs.ninja/ipfs/bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw"
}
}For mer detaljerte API-eksempler, se vår IPFS opplastings-API-tutorial.
Konklusjon
CIDs er fundamentet for IPFS’ innholdsadresseringssystem, og gir uforanderlig, verifiserbar og desentralisert innholdsidentifikasjon. Å forstå hvordan de fungerer — fra de tekniske detaljene i CIDv0 vs CIDv1 til praktiske implementeringsmønstre — er essensielt for å bygge robuste desentraliserte applikasjoner.
Viktige punkter:
- CIDs identifiserer innhold unikt, ikke plasseringer
- CIDv0 gir maksimal kompatibilitet, CIDv1 tilbyr fleksibilitet
- Innholdsadressering muliggjør verifikasjon og deduplisering
- Korrekt CID-håndtering er avgjørende for produksjonsapplikasjoner
Enten du lagrer NFT-metadata, ruller ut desentraliserte nettsteder eller bygger innholdsdistribusjonssystemer, gir CIDs det pålitelige fundamentet du trenger for virkelig desentraliserte applikasjoner.
Klar til å begynne å pinne? Opprett en gratis konto — 50 filer, 1 GB lagring, 2 GB båndbredde/måned. Ingen kredittkort kreves.
