· Nacho Coll · Guides  · 11 phút đọc

IPFS CID giải thích: nó là gì và cách hoạt động của địa chỉ hóa nội dung

Giải thích kỹ thuật rõ ràng về Content Identifiers (CIDs) trong IPFS. Cách hoạt động của địa chỉ hóa nội dung, các phiên bản CID và cách tạo CID đầu tiên của bạn.

Giải thích kỹ thuật rõ ràng về Content Identifiers (CIDs) trong IPFS. Cách hoạt động của địa chỉ hóa nội dung, các phiên bản CID và cách tạo CID đầu tiên của bạn.

Nếu bạn đã từng làm việc với IPFS (InterPlanetary File System), có lẽ bạn đã gặp các chuỗi như QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG hoặc bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi. Đây không phải là chuỗi vô nghĩa ngẫu nhiên — chúng là Content Identifiers (CIDs), xương sống của hệ thống địa chỉ hóa nội dung của IPFS.

Hiểu về CIDs rất quan trọng đối với bất kỳ ai xây dựng trên IPFS, cho dù bạn đang tải tệp lên, xây dựng ứng dụng phi tập trung, hay triển khai hệ thống phân phối nội dung. Hướng dẫn này sẽ phân tích mọi thứ bạn cần biết về IPFS CIDs, cách hoạt động của địa chỉ hóa nội dung, và cách bắt đầu sử dụng chúng trong các dự án của bạn.

IPFS Ninja

IPFS CID là gì?

Content Identifier (CID) là một dấu vân tay duy nhất đại diện cho một mẩu nội dung trên IPFS. Không giống như các URL web truyền thống trỏ đến một vị trí (như https://example.com/file.pdf), CIDs trỏ đến chính nội dung, bất kể nó được lưu trữ ở đâu.

Hãy nghĩ về nó theo cách này:

  • Địa chỉ hóa dựa trên vị trí: “Đi đến số 123 Đường Chính và yêu cầu cuốn sách đỏ”
  • Địa chỉ hóa dựa trên nội dung: “Tìm cuốn sách với ISBN 978-0-123456-78-9” (thư viện nào có nó không quan trọng)

CIDs hoạt động tương tự — chúng xác định nội dung dựa trên hash mật mã của nó, làm cho nội dung bất biếncó thể xác minh được. Nếu một byte duy nhất thay đổi trong tệp, CID thay đổi hoàn toàn.

Tại sao địa chỉ hóa nội dung lại quan trọng

Kiến trúc web truyền thống dựa vào địa chỉ hóa dựa trên vị trí. Khi bạn truy cập https://example.com/image.jpg, bạn tin tưởng rằng:

  1. Chủ sở hữu tên miền không thay đổi nội dung
  2. Máy chủ đang trực tuyến và có thể truy cập được
  3. Nội dung chưa bị giả mạo

Với địa chỉ hóa nội dung bằng CIDs:

  1. Tính bất biến: CID đảm bảo nội dung không thay đổi
  2. Phi tập trung: Nội dung có thể được lấy từ bất kỳ nút IPFS nào có nó
  3. Xác minh: Bạn có thể xác minh bằng mật mã rằng bạn đã nhận được nội dung đúng
  4. Hiệu quả: Nội dung giống hệt nhau tự động được loại bỏ trùng lặp

Cấu trúc của một CID

Hãy phân tích một CID điển hình để hiểu các thành phần của nó:

bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
└─┬─┘└─────────────────┬─────────────────────────────────┘
  │                   │
  │                   └─ Hash nội dung (mã hóa Base32)
  └─ Tiền tố Multibase (chỉ ra mã hóa)

Một CID chứa nhiều phần thông tin:

1. Tiền tố Multibase

Ký tự đầu tiên cho biết CID được mã hóa như thế nào:

  • Q = Mã hóa Base58 (CIDv0)
  • b = Mã hóa Base32 (CIDv1)
  • f = Base16/thập lục phân (CIDv1)
  • z = Base58 (CIDv1)

2. Phiên bản CID

  • CIDv0: Luôn bắt đầu bằng Qm, sử dụng SHA-256, giới hạn ở codec DAG-PB
  • CIDv1: Linh hoạt hơn, hỗ trợ nhiều chức năng hash và codec

3. Multicodec

Chỉ định cách nội dung được cấu trúc (DAG-PB, DAG-CBOR, byte thô, v.v.)

4. Multihash

Hash mật mã thực tế của nội dung, bao gồm:

  • Định danh chức năng hash (thường là SHA-256)
  • Độ dài hash
  • Hash digest

CIDv0 vs CIDv1: Hiểu sự khác biệt

IPFS đã phát triển qua hai phiên bản CID chính, mỗi phiên bản có những đặc điểm riêng biệt:

CIDv0: Định dạng ban đầu

CIDs CIDv0 luôn bắt đầu bằng Qm và trông như thế này:

QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG

Đặc điểm:

  • Chỉ mã hóa Base58
  • Chỉ chức năng hash SHA-256
  • Chỉ codec DAG-PB (Protobuf)
  • Độ dài 46 ký tự
  • Tương thích ngược với tất cả các triển khai IPFS

Khi nào sử dụng CIDv0:

  • Khả năng tương thích tối đa với các nút IPFS cũ hơn
  • Làm việc với các hệ thống hiện có mong đợi tiền tố Qm
  • Lưu trữ tệp (trường hợp sử dụng phổ biến nhất)

CIDv1: Tiêu chuẩn hiện đại

CIDs CIDv1 linh hoạt hơn và có thể trông như sau:

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

Đặc điểm:

  • Nhiều định dạng mã hóa (Base32, Base58, Base16)
  • Hỗ trợ các chức năng hash khác nhau (SHA-256, SHA-512, BLAKE2, v.v.)
  • Nhiều codec (Raw, DAG-CBOR, DAG-JSON, v.v.)
  • Định dạng tự mô tả
  • Không phân biệt chữ hoa chữ thường khi sử dụng Base32

Khi nào sử dụng CIDv1:

  • Xây dựng ứng dụng mới
  • Cần định danh không phân biệt chữ hoa chữ thường
  • Làm việc với dữ liệu có cấu trúc (JSON, CBOR)
  • Sử dụng các chức năng hash thay thế

Chuyển đổi giữa các phiên bản

Bạn có thể chuyển đổi CIDs giữa các phiên bản trong khi vẫn duy trì cùng tham chiếu nội dung:

// CIDv0
const cidv0 = "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG";

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

// Both reference the same content!

Cách hoạt động của địa chỉ hóa nội dung

Địa chỉ hóa nội dung trong IPFS tuân theo một quy trình xác định đảm bảo cùng một nội dung luôn tạo ra cùng một CID:

1. Chuẩn bị nội dung

Khi bạn thêm nội dung vào IPFS, nó được phân tách trước:

  • Tệp nhỏ: Được lưu trữ dưới dạng các khối đơn
  • Tệp lớn: Được chia thành các phần và được tổ chức trong Merkle DAG (Đồ thị không tuần hoàn có hướng)
  • Thư mục: Được biểu diễn dưới dạng cấu trúc DAG liên kết với các tệp

2. Quá trình hashing

Mỗi phần nội dung trải qua:

  1. Tuần tự hóa: Nội dung được định dạng theo codec của nó
  2. Hashing: Chức năng hash mật mã xử lý dữ liệu đã tuần tự hóa
  3. Tạo Multihash: Hash được gói với thông tin thuật toán và độ dài
  4. Lắp ráp CID: Phiên bản, codec, và multihash được kết hợp

3. Cấu trúc Merkle DAG

IPFS tổ chức nội dung trong một Merkle DAG nơi:

  • Mỗi nút có một CID
  • Các nút cha tham chiếu các nút con qua CID
  • Thay đổi trong bất kỳ nút nào lan truyền lên cây
  • Toàn bộ cấu trúc có thể được xác minh bằng mật mã
Root CID: bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
├── file1.txt (QmHash1...)
├── file2.jpg (QmHash2...)
└── subdirectory/
    ├── file3.pdf (QmHash3...)
    └── file4.mp4 (QmHash4...)

Ví dụ thực tế: Làm việc với CIDs

Hãy khám phá cách làm việc với CIDs trong thực tế bằng API IPFS Ninja:

Tải nội dung lên và lấy 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 nội dung hiện có bằng CID

Nếu bạn đã có CID, bạn có thể pin nó để đảm bảo tính khả dụng:

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

Truy cập nội dung qua CID

Khi bạn đã có CID, bạn có thể truy cập nội dung qua nhiều phương thức:

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

Thực hành tốt nhất với CID cho các nhà phát triển

1. Luôn xác thực CIDs

Trước khi sử dụng CID trong ứng dụng của bạn, xác thực định dạng của nó:

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. Xử lý cả hai phiên bản CID

Ứng dụng của bạn nên hoạt động với cả CIDv0 và 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 ánh xạ CID

Nếu bạn tạo CIDs thường xuyên, hãy xem xét bộ nhớ đệm:

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. Sử dụng mô tả có ý nghĩa

Khi tải nội dung lên, bao gồm metadata mô tả:

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

Các trường hợp sử dụng CID phổ biến

1. Triển khai trang web tĩnh

Triển khai toàn bộ trang web lên IPFS và tham chiếu bằng 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;
};

Để tìm hiểu thêm về triển khai trang web, hãy xem hướng dẫn của chúng tôi về cách tải tệp lên IPFS.

2. Lưu trữ metadata NFT

Lưu trữ metadata NFT không thay đổi bằng 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. Phân phối nội dung

Sử dụng CIDs cho phân phối nội dung phân tán:

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

Hiểu về IPFS pinning với CIDs

CIDs theo mặc định là tạm thời — chúng phải được “pin” để vẫn khả dụng. Tìm hiểu thêm về khái niệm quan trọng này trong hướng dẫn toàn diện của chúng tôi về IPFS pinning là gì.

Khi chọn dịch vụ IPFS pinning, hãy xem so sánh IPFS Ninja vs Pinata của chúng tôi hoặc khám phá tổng hợp các dịch vụ pinning IPFS tốt nhất hiện có hôm nay.

Tạo CID đầu tiên của bạn trong 30 giây

Sẵn sàng tạo CID đầu tiên của bạn? Đây là một ví dụ nhanh sử dụng 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();

Điều này sẽ trả về một cái gì đó như:

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

Để biết các ví dụ API chi tiết hơn, hãy xem hướng dẫn API tải lên IPFS của chúng tôi.

Kết luận

CIDs là nền tảng của hệ thống địa chỉ hóa nội dung của IPFS, cung cấp nhận dạng nội dung bất biến, có thể xác minh và phi tập trung. Hiểu cách chúng hoạt động — từ các chi tiết kỹ thuật của CIDv0 vs CIDv1 đến các mẫu triển khai thực tế — là cần thiết để xây dựng các ứng dụng phi tập trung mạnh mẽ.

Những điểm chính:

  • CIDs xác định nội dung một cách duy nhất, không phải vị trí
  • CIDv0 cung cấp khả năng tương thích tối đa, CIDv1 cung cấp tính linh hoạt
  • Địa chỉ hóa nội dung cho phép xác minh và loại bỏ trùng lặp
  • Xử lý CID đúng cách rất quan trọng đối với các ứng dụng sản xuất

Cho dù bạn đang lưu trữ metadata NFT, triển khai các trang web phi tập trung, hay xây dựng các hệ thống phân phối nội dung, CIDs cung cấp nền tảng đáng tin cậy bạn cần cho các ứng dụng thực sự phi tập trung.

Sẵn sàng bắt đầu pin? Tạo tài khoản miễn phí — 50 tệp, 1 GB lưu trữ, 2 GB băng thông/tháng. Không cần thẻ tín dụng.

Quay lại Blog

Bài viết liên quan

Xem tất cả bài viết »