· Nacho Coll · Guides  · 9 λεπτά ανάγνωσης

IPFS CID εξηγημένο: τι είναι και πώς λειτουργεί η διευθυνσιοδότηση περιεχομένου

Σαφής τεχνική εξήγηση των IPFS Content Identifiers (CIDs). Πώς λειτουργεί η διευθυνσιοδότηση περιεχομένου, εκδόσεις CID και πώς να δημιουργήσετε το πρώτο σας CID.

Σαφής τεχνική εξήγηση των IPFS Content Identifiers (CIDs). Πώς λειτουργεί η διευθυνσιοδότηση περιεχομένου, εκδόσεις CID και πώς να δημιουργήσετε το πρώτο σας CID.

Αν έχετε δουλέψει ποτέ με το IPFS (InterPlanetary File System), πιθανότατα έχετε συναντήσει συμβολοσειρές όπως QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG ή bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi. Αυτά δεν είναι τυχαία ανοησίες — είναι Content Identifiers (CIDs), η ραχοκοκαλιά του συστήματος διευθυνσιοδότησης περιεχομένου του IPFS.

Η κατανόηση των CIDs είναι κρίσιμη για όποιον χτίζει πάνω στο IPFS, είτε ανεβάζετε αρχεία, χτίζετε αποκεντρωμένες εφαρμογές, ή υλοποιείτε συστήματα διανομής περιεχομένου. Αυτός ο οδηγός θα αναλύσει όλα όσα χρειάζεται να γνωρίζετε για τα IPFS CIDs, πώς λειτουργεί η διευθυνσιοδότηση περιεχομένου, και πώς να ξεκινήσετε να τα χρησιμοποιείτε στα έργα σας.

IPFS Ninja

Τι είναι ένα IPFS CID;

Ένα Content Identifier (CID) είναι ένα μοναδικό δακτυλικό αποτύπωμα που αντιπροσωπεύει ένα κομμάτι περιεχομένου στο IPFS. Σε αντίθεση με τα παραδοσιακά URL ιστού που δείχνουν σε μια τοποθεσία (όπως https://example.com/file.pdf), τα CIDs δείχνουν στο ίδιο το περιεχόμενο, ανεξάρτητα από το πού αποθηκεύεται.

Σκεφτείτε το έτσι:

  • Διευθυνσιοδότηση βασισμένη στην τοποθεσία: «Πηγαίνετε στην Κεντρική Οδό 123 και ζητήστε το κόκκινο βιβλίο»
  • Διευθυνσιοδότηση βασισμένη στο περιεχόμενο: «Βρείτε το βιβλίο με ISBN 978-0-123456-78-9» (δεν έχει σημασία ποια βιβλιοθήκη το έχει)

Τα CIDs λειτουργούν παρόμοια — αναγνωρίζουν το περιεχόμενο βάσει του κρυπτογραφικού hash του, καθιστώντας το περιεχόμενο αμετάβλητο και επαληθεύσιμο. Αν αλλάξει ακόμα και ένα μόνο byte στο αρχείο, το CID αλλάζει εντελώς.

Γιατί έχει σημασία η διευθυνσιοδότηση περιεχομένου

Η παραδοσιακή αρχιτεκτονική του ιστού στηρίζεται στη διευθυνσιοδότηση βάσει τοποθεσίας. Όταν επισκέπτεστε το https://example.com/image.jpg, εμπιστεύεστε ότι:

  1. Ο ιδιοκτήτης του τομέα δεν έχει αλλάξει το περιεχόμενο
  2. Ο διακομιστής είναι online και προσβάσιμος
  3. Το περιεχόμενο δεν έχει παραποιηθεί

Με τη διευθυνσιοδότηση περιεχομένου χρησιμοποιώντας CIDs:

  1. Αμεταβλητότητα: Το CID εγγυάται ότι το περιεχόμενο δεν έχει αλλάξει
  2. Αποκέντρωση: Το περιεχόμενο μπορεί να ανακτηθεί από οποιοδήποτε IPFS κόμβο που το έχει
  3. Επαλήθευση: Μπορείτε να επαληθεύσετε κρυπτογραφικά ότι λάβατε το σωστό περιεχόμενο
  4. Αποδοτικότητα: Το ίδιο περιεχόμενο αποπολλαπλασιάζεται αυτόματα

Ανατομία ενός CID

Ας αναλύσουμε ένα τυπικό CID για να κατανοήσουμε τα συστατικά του:

bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
└─┬─┘└─────────────────┬─────────────────────────────────┘
  │                   │
  │                   └─ Hash περιεχομένου (Base32 κωδικοποιημένο)
  └─ Multibase πρόθεμα (υποδεικνύει κωδικοποίηση)

Ένα CID περιέχει πολλά κομμάτια πληροφορίας:

1. Multibase πρόθεμα

Ο πρώτος χαρακτήρας υποδεικνύει πώς είναι κωδικοποιημένο το CID:

  • Q = Κωδικοποίηση Base58 (CIDv0)
  • b = Κωδικοποίηση Base32 (CIDv1)
  • f = Base16/δεκαεξαδικό (CIDv1)
  • z = Base58 (CIDv1)

2. Έκδοση CID

  • CIDv0: Ξεκινά πάντα με Qm, χρησιμοποιεί SHA-256, περιορισμένο σε codec DAG-PB
  • CIDv1: Πιο ευέλικτο, υποστηρίζει πολλαπλές συναρτήσεις hash και codecs

3. Multicodec

Καθορίζει πώς δομείται το περιεχόμενο (DAG-PB, DAG-CBOR, ωμά bytes, κλπ.)

4. Multihash

Το πραγματικό κρυπτογραφικό hash του περιεχομένου, συμπεριλαμβανομένου:

  • Αναγνωριστικό συνάρτησης hash (συνήθως SHA-256)
  • Μήκος hash
  • Hash digest

CIDv0 vs CIDv1: Κατανόηση των διαφορών

Το IPFS έχει εξελιχθεί μέσα από δύο κύριες εκδόσεις CID, η καθεμία με διακριτά χαρακτηριστικά:

CIDv0: Η αρχική μορφή

Τα CIDv0 CIDs ξεκινούν πάντα με Qm και μοιάζουν έτσι:

QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG

Χαρακτηριστικά:

  • Μόνο κωδικοποίηση Base58
  • Μόνο συνάρτηση hash SHA-256
  • Μόνο codec DAG-PB (Protobuf)
  • Μήκος 46 χαρακτήρων
  • Συμβατά προς τα πίσω με όλες τις υλοποιήσεις IPFS

Πότε να χρησιμοποιήσετε CIDv0:

  • Μέγιστη συμβατότητα με παλαιότερους κόμβους IPFS
  • Εργασία με υπάρχοντα συστήματα που αναμένουν προθέματα Qm
  • Αποθήκευση αρχείων (το πιο κοινό use case)

CIDv1: Το σύγχρονο πρότυπο

Τα CIDv1 CIDs είναι πιο ευέλικτα και μπορεί να μοιάζουν έτσι:

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

Χαρακτηριστικά:

  • Πολλαπλές μορφές κωδικοποίησης (Base32, Base58, Base16)
  • Υποστήριξη για διαφορετικές συναρτήσεις hash (SHA-256, SHA-512, BLAKE2, κλπ.)
  • Πολλαπλά codecs (Raw, DAG-CBOR, DAG-JSON, κλπ.)
  • Αυτο-περιγραφική μορφή
  • Δεν διακρίνει πεζά-κεφαλαία όταν χρησιμοποιείται Base32

Πότε να χρησιμοποιήσετε CIDv1:

  • Δημιουργία νέων εφαρμογών
  • Ανάγκη για αναγνωριστικά που δεν διακρίνουν πεζά-κεφαλαία
  • Εργασία με δομημένα δεδομένα (JSON, CBOR)
  • Χρήση εναλλακτικών συναρτήσεων hash

Μετατροπή μεταξύ εκδόσεων

Μπορείτε να μετατρέπετε CIDs μεταξύ εκδόσεων διατηρώντας την ίδια αναφορά περιεχομένου:

// CIDv0
const cidv0 = "QmYwAPJzv5CZsnA625s3Xf2nemtYgPpHdWEz79ojWnPbdG";

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

// Both reference the same content!

Πώς λειτουργεί η διευθυνσιοδότηση περιεχομένου

Η διευθυνσιοδότηση περιεχομένου στο IPFS ακολουθεί μια ντετερμινιστική διαδικασία που εξασφαλίζει ότι το ίδιο περιεχόμενο παράγει πάντα το ίδιο CID:

1. Προετοιμασία περιεχομένου

Όταν προσθέτετε περιεχόμενο στο IPFS, σπάει πρώτα:

  • Μικρά αρχεία: Αποθηκεύονται ως μεμονωμένα blocks
  • Μεγάλα αρχεία: Χωρίζονται σε κομμάτια και οργανώνονται σε ένα Merkle DAG (κατευθυνόμενο ακυκλικό γράφημα)
  • Κατάλογοι: Αντιπροσωπεύονται ως δομές DAG που συνδέονται με αρχεία

2. Διαδικασία hashing

Κάθε κομμάτι περιεχομένου περνά από:

  1. Σειριοποίηση: Το περιεχόμενο μορφοποιείται σύμφωνα με το codec του
  2. Hashing: Η κρυπτογραφική συνάρτηση hash επεξεργάζεται τα σειριοποιημένα δεδομένα
  3. Δημιουργία Multihash: Το hash τυλίγεται με πληροφορίες αλγορίθμου και μήκους
  4. Συναρμολόγηση CID: Η έκδοση, το codec και το multihash συνδυάζονται

3. Δομή Merkle DAG

Το IPFS οργανώνει το περιεχόμενο σε ένα Merkle DAG όπου:

  • Κάθε κόμβος έχει ένα CID
  • Οι γονικοί κόμβοι αναφέρονται σε θυγατρικούς κόμβους μέσω CID
  • Οι αλλαγές σε οποιονδήποτε κόμβο διαδίδονται στο δέντρο
  • Ολόκληρες δομές μπορούν να επαληθευτούν κρυπτογραφικά
Root CID: bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
├── file1.txt (QmHash1...)
├── file2.jpg (QmHash2...)
└── subdirectory/
    ├── file3.pdf (QmHash3...)
    └── file4.mp4 (QmHash4...)

Πρακτικά παραδείγματα: Εργασία με CIDs

Ας εξερευνήσουμε πώς να εργαζόμαστε με CIDs στην πράξη χρησιμοποιώντας το API του IPFS Ninja:

Ανέβασμα περιεχομένου και λήψη 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

Καρφίτσωμα υπάρχοντος περιεχομένου με CID

Αν έχετε ήδη ένα CID, μπορείτε να το καρφιτσώσετε για να διασφαλίσετε τη διαθεσιμότητα:

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

Πρόσβαση σε περιεχόμενο μέσω CID

Μόλις έχετε ένα CID, μπορείτε να αποκτήσετε πρόσβαση στο περιεχόμενο μέσω διαφόρων μεθόδων:

// 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 για προγραμματιστές

1. Πάντα να επικυρώνετε τα CIDs

Πριν χρησιμοποιήσετε ένα CID στην εφαρμογή σας, επικυρώστε τη μορφή του:

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. Χειριστείτε και τις δύο εκδόσεις CID

Η εφαρμογή σας πρέπει να λειτουργεί τόσο με CIDv0 όσο και με 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

Αν δημιουργείτε CIDs συχνά, σκεφτείτε την 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. Χρησιμοποιήστε ουσιαστικές περιγραφές

Κατά το ανέβασμα περιεχομένου, συμπεριλάβετε περιγραφικά 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'
      }
    })
  });
};

Κοινές περιπτώσεις χρήσης CID

1. Ανάπτυξη στατικής ιστοσελίδας

Αναπτύξτε ολόκληρες ιστοσελίδες στο IPFS και αναφερθείτε σε αυτές με 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;
};

Για να μάθετε περισσότερα σχετικά με την ανάπτυξη ιστοσελίδων, δείτε τον οδηγό μας σχετικά με το πώς να ανεβάσετε αρχεία στο IPFS.

2. Αποθήκευση metadata NFT

Αποθηκεύστε metadata NFT αμετάβλητα χρησιμοποιώντας 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. Διανομή περιεχομένου

Χρησιμοποιήστε CIDs για κατανεμημένη παράδοση περιεχομένου:

// 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 με CIDs

Τα CIDs είναι προσωρινά από προεπιλογή — πρέπει να «καρφιτσωθούν» για να παραμείνουν διαθέσιμα. Μάθετε περισσότερα για αυτή την κρίσιμη έννοια στον περιεκτικό οδηγό μας σχετικά με το τι είναι το IPFS pinning.

Όταν επιλέγετε μια υπηρεσία IPFS pinning, σκεφτείτε να διαβάσετε τη σύγκρισή μας IPFS Ninja vs Pinata ή εξερευνήστε τη συγκέντρωσή μας των καλύτερων υπηρεσιών IPFS pinning που είναι διαθέσιμες σήμερα.

Δημιουργήστε το πρώτο σας CID σε 30 δευτερόλεπτα

Έτοιμοι να δημιουργήσετε το πρώτο σας CID; Εδώ είναι ένα γρήγορο παράδειγμα χρησιμοποιώντας το 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();

Αυτό θα επιστρέψει κάτι σαν:

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

Για πιο αναλυτικά παραδείγματα API, δείτε το tutorial του IPFS upload API μας.

Συμπέρασμα

Τα CIDs είναι το θεμέλιο του συστήματος διευθυνσιοδότησης περιεχομένου του IPFS, παρέχοντας αμετάβλητη, επαληθεύσιμη και αποκεντρωμένη αναγνώριση περιεχομένου. Η κατανόηση του πώς λειτουργούν — από τις τεχνικές λεπτομέρειες του CIDv0 vs CIDv1 έως τα πρακτικά μοτίβα υλοποίησης — είναι απαραίτητη για την κατασκευή ισχυρών αποκεντρωμένων εφαρμογών.

Βασικά συμπεράσματα:

  • Τα CIDs αναγνωρίζουν περιεχόμενο μοναδικά, όχι τοποθεσίες
  • Το CIDv0 παρέχει μέγιστη συμβατότητα, το CIDv1 προσφέρει ευελιξία
  • Η διευθυνσιοδότηση περιεχομένου επιτρέπει την επαλήθευση και τον αποπολλαπλασιασμό
  • Ο σωστός χειρισμός CID είναι κρίσιμος για εφαρμογές παραγωγής

Είτε αποθηκεύετε metadata NFT, αναπτύσσετε αποκεντρωμένες ιστοσελίδες, είτε χτίζετε συστήματα διανομής περιεχομένου, τα CIDs παρέχουν το αξιόπιστο θεμέλιο που χρειάζεστε για πραγματικά αποκεντρωμένες εφαρμογές.

Έτοιμοι να ξεκινήσετε το pinning; Δημιουργήστε έναν δωρεάν λογαριασμό — 50 αρχεία, 1 GB αποθήκευση, 2 GB εύρος ζώνης/μήνα. Χωρίς πιστωτική κάρτα.

Πίσω στο Blog

Σχετικά Άρθρα

Δείτε Όλα τα Άρθρα »