IPFS CIDs 2026: Slik fungerer innholdsadressering

Praktisk guide til IPFS-CIDs: CIDv0 vs CIDv1, innholdsadressering, generering av CIDs i Node.js og Python, og verifisering av integritet. Oppdatert 2026.

Nacho Collav Oppdatert: 9 min lesing
Praktisk guide til IPFS-CIDs: CIDv0 vs CIDv1, innholdsadressering, generering av CIDs i Node.js og Python, og verifisering av integritet. Oppdatert 2026.
Oppsummering
  • Generer en reproduserbar CID fra en hvilken som helst fils bytes — samme innhold gir alltid samme hash.
  • Bruk CIDv1 for nye opplastinger: den er Base32, med små bokstaver, og fungerer med subdomene-gateways; CIDv0 gjør det ikke.
  • En eneste endret byte i en fil endrer CID-en fullstendig, noe som gjør tukling umiddelbart oppdagbart.
  • Innholdsadressering betyr at filer identifiseres av hva de er, ikke hvor de er hostet.

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.

IPFS Ninja

Generer en CID på 5 linjer (Python)#

import hashlib, base58

def cidv0(content: bytes) -> str:
    sha256 = hashlib.sha256(content).digest()
    return base58.b58encode(b"\x12\x20" + sha256).decode()

print(cidv0(b"hello world"))
# QmaozNR7DZHQK1ZcU9p7QdrshMvXqWK6gpvBw3cWE69N3T

Den CID-en kan reproduseres av hvem som helst — kjør samme kode med de samme bytene hvor som helst i verden, og du får den samme strengen. Det er innholdsadressering.

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:

  1. Domeneieren ikke har endret innholdet
  2. Serveren er online og tilgjengelig
  3. Innholdet ikke er blitt manipulert

Med innholdsadressering ved bruk av CIDs:

  1. Uforanderlighet: CID-en garanterer at innholdet ikke er endret
  2. Desentralisering: Innhold kan hentes fra hvilken som helst IPFS-node som har det
  3. Verifisering: Du kan kryptografisk verifisere at du mottok riktig innhold
  4. 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:

QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG

Egenskaper:

  • 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...                                      # Base16

Egenskaper:

  • 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:

  1. Serialisering: Innhold formateres i henhold til sin codec
  2. Hashing: Kryptografisk hashfunksjon behandler den serialiserte dataen
  3. Multihash-opprettelse: Hash pakkes med algoritme- og lengdeinformasjon
  4. 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: bafkreifjxz6zwqh27k5xnr5qfbx4w6n5vuwwwdcngguwjewzj2e3xxfgvi

Pin 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.

Nacho Coll

Om forfatteren

Founder & Engineer at IPFS.NINJA

Nacho founded IPFS.NINJA to make content-addressed storage feel as simple as an S3 PUT — a single API call, a permanent CID, no wallets or peer discovery to reason about. Writes about IPFS internals, decentralized storage patterns, and the pinning-service landscape from the operator side of the wire.

Tilbake til Bloggen

Relaterte artikler