· Nacho Coll · Guides  · 8 minit bacaan

IPFS CID dijelaskan: apa itu dan bagaimana pengalamatan kandungan berfungsi

Penjelasan teknikal yang jelas tentang IPFS Content Identifiers (CIDs). Bagaimana pengalamatan kandungan berfungsi, versi CID dan cara membuat CID pertama anda.

Penjelasan teknikal yang jelas tentang IPFS Content Identifiers (CIDs). Bagaimana pengalamatan kandungan berfungsi, versi CID dan cara membuat CID pertama anda.

Jika anda pernah bekerja dengan IPFS (InterPlanetary File System), anda mungkin pernah menemui rentetan seperti QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG atau bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi. Ini bukan kekarutan rawak — ini adalah Content Identifiers (CIDs), tulang belakang sistem pengalamatan kandungan IPFS.

Memahami CIDs adalah penting untuk sesiapa yang membina di atas IPFS, sama ada anda memuat naik fail, membina aplikasi terpencar, atau melaksanakan sistem pengedaran kandungan. Panduan ini akan menerangkan semua yang anda perlu tahu tentang IPFS CIDs, bagaimana pengalamatan kandungan berfungsi, dan bagaimana untuk mula menggunakannya dalam projek anda.

IPFS Ninja

Apakah IPFS CID?

Sebuah Content Identifier (CID) adalah cap jari unik yang mewakili sekeping kandungan di IPFS. Tidak seperti URL web tradisional yang menunjuk ke lokasi (seperti https://example.com/file.pdf), CIDs menunjuk ke kandungan itu sendiri, tidak kira di mana ia disimpan.

Fikirkan begini:

  • Pengalamatan berasaskan lokasi: “Pergi ke Jalan Utama 123 dan minta buku merah”
  • Pengalamatan berasaskan kandungan: “Cari buku dengan ISBN 978-0-123456-78-9” (tak kira perpustakaan mana yang ada)

CIDs berfungsi dengan cara yang sama — ia mengenal pasti kandungan berdasarkan hash kriptografinya, menjadikan kandungan tidak boleh diubah dan boleh disahkan. Jika satu bait tunggal berubah dalam fail, CID berubah sepenuhnya.

Mengapa pengalamatan kandungan penting

Senibina web tradisional bergantung pada pengalamatan berasaskan lokasi. Apabila anda melawat https://example.com/image.jpg, anda mempercayai bahawa:

  1. Pemilik domain tidak mengubah kandungan
  2. Pelayan dalam talian dan boleh diakses
  3. Kandungan tidak diusik

Dengan pengalamatan kandungan menggunakan CIDs:

  1. Tidak Berubah: CID menjamin bahawa kandungan tidak berubah
  2. Pemencaran: Kandungan boleh diambil dari mana-mana nod IPFS yang memilikinya
  3. Pengesahan: Anda boleh mengesahkan secara kriptografi bahawa anda menerima kandungan yang betul
  4. Kecekapan: Kandungan yang sama secara automatik diduplikasi

Anatomi CID

Mari kita pecahkan CID biasa untuk memahami komponennya:

bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
└─┬─┘└─────────────────┬─────────────────────────────────┘
  │                   │
  │                   └─ Hash Kandungan (dikodkan Base32)
  └─ Awalan Multibase (menunjukkan pengkodan)

CID mengandungi beberapa maklumat:

1. Awalan Multibase

Aksara pertama menunjukkan bagaimana CID dikodkan:

  • Q = Pengkodan Base58 (CIDv0)
  • b = Pengkodan Base32 (CIDv1)
  • f = Base16/heksadesimal (CIDv1)
  • z = Base58 (CIDv1)

2. Versi CID

  • CIDv0: Sentiasa bermula dengan Qm, menggunakan SHA-256, terhad kepada codec DAG-PB
  • CIDv1: Lebih fleksibel, menyokong pelbagai fungsi hash dan codec

3. Multicodec

Menentukan bagaimana kandungan distrukturkan (DAG-PB, DAG-CBOR, bait mentah, dsb.)

4. Multihash

Hash kriptografi sebenar kandungan, termasuk:

  • Pengecam fungsi hash (biasanya SHA-256)
  • Panjang hash
  • Hash digest

CIDv0 vs CIDv1: Memahami perbezaan

IPFS telah berkembang melalui dua versi CID utama, setiap satu dengan ciri-ciri yang berbeza:

CIDv0: Format asal

CIDv0 CIDs sentiasa bermula dengan Qm dan kelihatan seperti ini:

QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG

Ciri-ciri:

  • Hanya pengkodan Base58
  • Hanya fungsi hash SHA-256
  • Hanya codec DAG-PB (Protobuf)
  • 46 aksara panjang
  • Serasi ke belakang dengan semua pelaksanaan IPFS

Bila menggunakan CIDv0:

  • Keserasian maksimum dengan nod IPFS yang lebih lama
  • Bekerja dengan sistem sedia ada yang menjangkakan awalan Qm
  • Penyimpanan fail (kes penggunaan paling biasa)

CIDv1: Standard moden

CIDv1 CIDs lebih fleksibel dan boleh kelihatan seperti ini:

bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi  # Base32
zb2rhj7crUKTQYRGCRATFaQ6YFLTde2YzdqbbhAASkL9uRDXn      # Base58
f01551220d1e2c35...                                      # Base16

Ciri-ciri:

  • Pelbagai format pengkodan (Base32, Base58, Base16)
  • Sokongan untuk pelbagai fungsi hash (SHA-256, SHA-512, BLAKE2, dsb.)
  • Pelbagai codec (Raw, DAG-CBOR, DAG-JSON, dsb.)
  • Format yang menerangkan diri sendiri
  • Tidak peka huruf besar/kecil semasa menggunakan Base32

Bila menggunakan CIDv1:

  • Membina aplikasi baru
  • Perlu pengecam yang tidak peka huruf
  • Bekerja dengan data berstruktur (JSON, CBOR)
  • Menggunakan fungsi hash alternatif

Penukaran antara versi

Anda boleh menukar CIDs antara versi sambil mengekalkan rujukan kandungan yang sama:

// CIDv0
const cidv0 = "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG";

// Convert to CIDv1 Base32
const cidv1 = "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi";

// Both reference the same content!

Bagaimana pengalamatan kandungan berfungsi

Pengalamatan kandungan dalam IPFS mengikut proses deterministik yang memastikan kandungan yang sama sentiasa menghasilkan CID yang sama:

1. Penyediaan kandungan

Apabila anda menambah kandungan kepada IPFS, ia dipecahkan terlebih dahulu:

  • Fail kecil: Disimpan sebagai blok tunggal
  • Fail besar: Dipecahkan kepada bahagian dan disusun dalam Merkle DAG (graf akiklik terarah)
  • Direktori: Diwakili sebagai struktur DAG yang menyambung ke fail

2. Proses hashing

Setiap bahagian kandungan melalui:

  1. Serialisasi: Kandungan diformat mengikut codecnya
  2. Hashing: Fungsi hash kriptografi memproses data yang diserilizasi
  3. Penciptaan Multihash: Hash dibungkus dengan maklumat algoritma dan panjang
  4. Pemasangan CID: Versi, codec, dan multihash digabungkan

3. Struktur Merkle DAG

IPFS menyusun kandungan dalam Merkle DAG di mana:

  • Setiap nod mempunyai CID
  • Nod induk merujuk kepada nod anak melalui CID
  • Perubahan dalam mana-mana nod menyebar ke atas dalam pokok
  • Keseluruhan struktur boleh disahkan secara kriptografi
Root CID: bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
├── file1.txt (QmHash1...)
├── file2.jpg (QmHash2...)
└── subdirectory/
    ├── file3.pdf (QmHash3...)
    └── file4.mp4 (QmHash4...)

Contoh praktikal: Bekerja dengan CIDs

Mari kita teroka bagaimana untuk bekerja dengan CIDs dalam amalan menggunakan API IPFS Ninja:

Memuat naik kandungan dan mendapatkan 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

Menyemat kandungan sedia ada mengikut CID

Jika anda sudah mempunyai CID, anda boleh menyematnya untuk memastikan ketersediaan:

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');

Mengakses kandungan melalui CID

Sebaik sahaja anda mempunyai CID, anda boleh mengakses kandungan melalui pelbagai kaedah:

// 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;
};

Amalan terbaik CID untuk pembangun

1. Sentiasa sahkan CIDs

Sebelum menggunakan CID dalam aplikasi anda, sahkan formatnya:

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. Kendalikan kedua-dua versi CID

Aplikasi anda harus berfungsi dengan kedua-dua CIDv0 dan 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 pemetaan CID

Jika anda kerap menjana CIDs, pertimbangkan 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. Gunakan penerangan yang bermakna

Apabila memuat naik kandungan, sertakan metadata deskriptif:

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'
      }
    })
  });
};

Kes penggunaan CID biasa

1. Penyebaran laman web statik

Sebarkan keseluruhan laman web ke IPFS dan rujuk mereka melalui 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;
};

Untuk mengetahui lebih lanjut mengenai penyebaran laman web, lihat panduan kami tentang cara memuat naik fail ke IPFS.

2. Penyimpanan metadata NFT

Simpan metadata NFT secara tidak boleh diubah menggunakan 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. Pengedaran kandungan

Gunakan CIDs untuk penghantaran kandungan teragih:

// 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 };
};

Memahami pinning IPFS dengan CIDs

CIDs adalah sementara secara lalai — mereka mesti “disematkan” untuk kekal tersedia. Ketahui lebih lanjut mengenai konsep penting ini dalam panduan komprehensif kami tentang apakah pinning IPFS.

Apabila memilih perkhidmatan pinning IPFS, pertimbangkan membaca perbandingan kami IPFS Ninja vs Pinata atau terokai ringkasan kami tentang perkhidmatan pinning IPFS terbaik yang tersedia hari ini.

Cipta CID pertama anda dalam 30 saat

Bersedia menjana CID pertama anda? Berikut adalah contoh pantas menggunakan API 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();

Ini akan mengembalikan sesuatu seperti:

{
  "cid": "bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
  "sizeMB": 0.000017,
  "uris": {
    "ipfs": "ipfs://bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw",
    "url": "https://ipfs.ninja/ipfs/bafkreif2pall7dybz7vecqka3zo24irdwabf7rbiiweuhau7a2hjlqvfjw"
  }
}

Untuk contoh API yang lebih terperinci, lihat tutorial API muat naik IPFS kami.

Kesimpulan

CIDs adalah asas sistem pengalamatan kandungan IPFS, menyediakan pengenalan kandungan yang tidak boleh diubah, boleh disahkan, dan terpencar. Memahami bagaimana ia berfungsi — dari butiran teknikal CIDv0 vs CIDv1 hingga corak pelaksanaan praktikal — adalah penting untuk membina aplikasi terpencar yang kukuh.

Pengajaran utama:

  • CIDs mengenal pasti kandungan secara unik, bukan lokasi
  • CIDv0 memberikan keserasian maksimum, CIDv1 menawarkan fleksibiliti
  • Pengalamatan kandungan membolehkan pengesahan dan deduplication
  • Pengendalian CID yang betul adalah penting untuk aplikasi pengeluaran

Sama ada anda menyimpan metadata NFT, menyebarkan laman web terpencar, atau membina sistem pengedaran kandungan, CIDs menyediakan asas yang boleh dipercayai yang anda perlukan untuk aplikasi yang benar-benar terpencar.

Bersedia mula pinning? Buat akaun percuma — 50 fail, 1 GB storan, 2 GB lebar jalur/bulan. Tanpa kad kredit.

Kembali ke Blog

Artikel Berkaitan

Lihat Semua Artikel »