· Nacho Coll · Guides · 8 Min. Lesezeit
IPFS CID erklärt: Was es ist und wie Content-Addressing funktioniert
Klare technische Erklärung von IPFS Content Identifiers (CIDs). Wie Content-Addressing funktioniert, CID-Versionen und das Erstellen Ihres ersten CIDs.

Wer schon einmal mit IPFS (InterPlanetary File System) gearbeitet hat, ist mit hoher Wahrscheinlichkeit auf Zeichenketten wie QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG oder bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi gestoßen. Das ist kein zufälliges Kauderwelsch — es sind Content Identifiers (CIDs), das Rückgrat des Content-Addressing-Systems von IPFS.
CIDs zu verstehen ist entscheidend für alle, die auf IPFS aufbauen — ob Sie Dateien hochladen, dezentrale Anwendungen entwickeln oder Content-Delivery-Systeme implementieren. Dieser Leitfaden zerlegt alles, was Sie über IPFS-CIDs wissen müssen: wie Content-Addressing funktioniert und wie Sie es in Ihren Projekten einsetzen.

Was ist ein IPFS-CID?
Ein Content Identifier (CID) ist ein eindeutiger Fingerabdruck, der einen Inhalt in IPFS repräsentiert. Im Gegensatz zu klassischen Web-URLs, die auf einen Ort verweisen (etwa https://example.com/file.pdf), verweisen CIDs auf den Inhalt selbst — unabhängig davon, wo er gespeichert ist.
So lässt es sich vorstellen:
- Standortbasierte Adressierung: „Geh zur Hauptstraße 123 und frag nach dem roten Buch”
- Inhaltsbasierte Adressierung: „Finde das Buch mit ISBN 978-0-123456-78-9” (egal, in welcher Bibliothek es steht)
CIDs funktionieren analog — sie identifizieren Inhalte über deren kryptografischen Hash. Das macht den Inhalt unveränderlich und verifizierbar. Ändert sich auch nur ein einzelnes Byte in der Datei, ändert sich der CID komplett.
Warum Content-Addressing wichtig ist
Die klassische Webarchitektur stützt sich auf standortbasierte Adressierung. Wenn Sie https://example.com/image.jpg aufrufen, vertrauen Sie darauf, dass:
- Der Domain-Eigentümer den Inhalt nicht geändert hat
- Der Server online und erreichbar ist
- Der Inhalt nicht manipuliert wurde
Mit Content-Addressing über CIDs:
- Unveränderlichkeit: Der CID garantiert, dass sich der Inhalt nicht geändert hat
- Dezentralisierung: Inhalte können von jedem IPFS-Knoten abgerufen werden, der sie hat
- Verifikation: Sie können kryptografisch prüfen, ob Sie den richtigen Inhalt erhalten haben
- Effizienz: Identische Inhalte werden automatisch dedupliziert
Aufbau eines CIDs
Sezieren wir einen typischen CID, um seine Bestandteile zu verstehen:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
└─┬─┘└─────────────────┬─────────────────────────────────┘
│ │
│ └─ Content Hash (Base32 codiert)
└─ Multibase-Präfix (kennzeichnet die Codierung)Ein CID enthält mehrere Informationen:
1. Multibase-Präfix
Das erste Zeichen zeigt an, wie der CID codiert ist:
Q= Base58-Codierung (CIDv0)b= Base32-Codierung (CIDv1)f= Base16/Hexadezimal (CIDv1)z= Base58 (CIDv1)
2. CID-Version
- CIDv0: Beginnt immer mit
Qm, nutzt SHA-256, beschränkt auf den DAG-PB-Codec - CIDv1: Flexibler, unterstützt mehrere Hash-Funktionen und Codecs
3. Multicodec
Spezifiziert, wie der Inhalt strukturiert ist (DAG-PB, DAG-CBOR, Raw Bytes usw.)
4. Multihash
Der eigentliche kryptografische Hash des Inhalts, inklusive:
- Kennung der Hash-Funktion (meist SHA-256)
- Hash-Länge
- Der Hash-Digest
CIDv0 vs. CIDv1: Die Unterschiede verstehen
IPFS hat zwei wichtige CID-Versionen durchlaufen, jede mit eigenem Charakter:
CIDv0: Das Originalformat
CIDv0-CIDs beginnen immer mit Qm und sehen so aus:
QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdGEigenschaften:
- Ausschließlich Base58-Codierung
- Nur SHA-256-Hash-Funktion
- Nur DAG-PB (Protobuf)-Codec
- 46 Zeichen lang
- Abwärtskompatibel mit allen IPFS-Implementierungen
Wann CIDv0 nutzen:
- Maximale Kompatibilität mit älteren IPFS-Knoten
- Bei Bestandssystemen, die
Qm-Präfixe erwarten - Dateispeicherung (häufigster Anwendungsfall)
CIDv1: Der moderne Standard
CIDv1-CIDs sind flexibler und können so aussehen:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi # Base32
zb2rhj7crUKTQYRGCRATFaQ6YFLTde2YzdqbbhAASkL9uRDXn # Base58
f01551220d1e2c35... # Base16Eigenschaften:
- Mehrere Codierungsformate (Base32, Base58, Base16)
- Unterstützung für verschiedene Hash-Funktionen (SHA-256, SHA-512, BLAKE2 usw.)
- Mehrere Codecs (Raw, DAG-CBOR, DAG-JSON usw.)
- Selbstbeschreibendes Format
- Bei Base32 case-insensitive
Wann CIDv1 nutzen:
- Beim Aufbau neuer Anwendungen
- Bei Bedarf an case-insensitiven Identifikatoren
- Bei strukturierten Daten (JSON, CBOR)
- Bei Verwendung alternativer Hash-Funktionen
Versionen umwandeln
Sie können CIDs zwischen Versionen umwandeln und dabei dieselbe Inhaltsreferenz behalten:
// CIDv0
const cidv0 = "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG";
// Convert to CIDv1 Base32
const cidv1 = "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi";
// Both reference the same content!So funktioniert Content-Addressing
Content-Addressing in IPFS folgt einem deterministischen Prozess, der sicherstellt, dass derselbe Inhalt immer denselben CID erzeugt:
1. Inhaltsvorbereitung
Wenn Sie Inhalte zu IPFS hinzufügen, werden sie zunächst zerlegt:
- Kleine Dateien: Als einzelne Blöcke gespeichert
- Große Dateien: In Chunks aufgeteilt und in einem Merkle-DAG (Directed Acyclic Graph) organisiert
- Verzeichnisse: Als DAG-Strukturen mit Verknüpfungen zu Dateien dargestellt
2. Hashing-Prozess
Jedes Stück Inhalt durchläuft:
- Serialisierung: Inhalt wird gemäß seinem Codec formatiert
- Hashing: Kryptografische Hash-Funktion verarbeitet die serialisierten Daten
- Multihash-Erstellung: Hash wird mit Algorithmus- und Längeninformation umhüllt
- CID-Zusammensetzung: Version, Codec und Multihash werden kombiniert
3. Merkle-DAG-Struktur
IPFS organisiert Inhalte in einem Merkle-DAG, in dem:
- Jeder Knoten einen CID hat
- Übergeordnete Knoten auf Kind-Knoten via CID verweisen
- Änderungen an Knoten den Baum nach oben propagieren
- Ganze Strukturen kryptografisch verifizierbar sind
Root CID: bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
├── file1.txt (QmHash1...)
├── file2.jpg (QmHash2...)
└── subdirectory/
├── file3.pdf (QmHash3...)
└── file4.mp4 (QmHash4...)Praktische Beispiele: Arbeit mit CIDs
Sehen wir uns an, wie man CIDs in der Praxis mit der API von IPFS Ninja nutzt:
Inhalte hochladen und einen CID erhalten
// 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: bafkreifjxz6zwqh27k5xnr5qfbx4w6n5vuwwwdcngguwjewzj2e3xxfgviBestehende Inhalte per CID pinnen
Wenn Sie bereits einen CID haben, können Sie diesen pinnen, damit der Inhalt verfügbar bleibt:
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');Inhalte via CID abrufen
Sobald Sie einen CID haben, können Sie den Inhalt über verschiedene Wege abrufen:
// 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-Best-Practices für Entwickler
1. CIDs immer validieren
Bevor Sie einen CID in Ihrer Anwendung verwenden, validieren Sie das 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. Beide CID-Versionen unterstützen
Ihre Anwendung sollte sowohl mit CIDv0 als auch mit CIDv1 arbeiten:
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-Zuordnungen cachen
Wenn Sie häufig CIDs erzeugen, empfiehlt sich 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. Aussagekräftige Beschreibungen verwenden
Wenn Sie Inhalte hochladen, hinterlegen Sie aussagekräftige Metadaten:
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'
}
})
});
};Gängige CID-Anwendungsfälle
1. Deployment statischer Websites
Stellen Sie komplette Websites auf IPFS bereit und referenzieren Sie sie 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;
};Mehr zum Website-Deployment finden Sie in unserem Leitfaden zum Hochladen von Dateien auf IPFS.
2. NFT-Metadaten speichern
Speichern Sie NFT-Metadaten unveränderlich via 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. Content-Distribution
Nutzen Sie CIDs für verteilte Content-Auslieferung:
// 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 };
};IPFS-Pinning mit CIDs verstehen
CIDs sind standardmäßig vorübergehend — sie müssen „gepinnt” werden, um verfügbar zu bleiben. Mehr zu diesem entscheidenden Konzept in unserem umfassenden Leitfaden zu Was ist IPFS-Pinning.
Bei der Wahl eines IPFS-Pinning-Dienstes lohnt sich auch unser Vergleich IPFS Ninja vs Pinata sowie unsere Übersicht der besten IPFS-Pinning-Dienste, die heute verfügbar sind.
Ihren ersten CID in 30 Sekunden erstellen
Bereit, Ihren ersten CID zu erzeugen? Hier ein Schnellbeispiel mit der API von 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();Das liefert in etwa Folgendes:
{
"cid": "bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
"sizeMB": 0.000017,
"uris": {
"ipfs": "ipfs://bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
"url": "https://ipfs.ninja/ipfs/bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw"
}
}Für ausführlichere API-Beispiele sehen Sie sich unser IPFS-Upload-API-Tutorial an.
Fazit
CIDs sind das Fundament des Content-Addressing-Systems von IPFS und bieten unveränderliche, verifizierbare und dezentrale Inhaltsidentifikation. Zu verstehen, wie sie funktionieren — von den technischen Details zu CIDv0 vs. CIDv1 bis zu praktischen Implementierungsmustern — ist essenziell für robuste dezentrale Anwendungen.
Wichtige Erkenntnisse:
- CIDs identifizieren Inhalte eindeutig, nicht Standorte
- CIDv0 bietet maximale Kompatibilität, CIDv1 mehr Flexibilität
- Content-Addressing ermöglicht Verifikation und Deduplikation
- Sauberer CID-Umgang ist entscheidend für produktive Anwendungen
Ob Sie NFT-Metadaten speichern, dezentrale Websites deployen oder Content-Distribution-Systeme bauen — CIDs liefern das verlässliche Fundament, das Sie für wirklich dezentrale Anwendungen brauchen.
Bereit zum Pinnen? Kostenlosen Account erstellen — 50 Dateien, 1 GB Speicher, 2 GB Bandbreite/Monat. Keine Kreditkarte erforderlich.