IPFS CIDs 2026: Οδηγός περιεχομενικής διευθυνσιοδότησης

Πρακτικός οδηγός IPFS CIDs: CIDv0 vs CIDv1, διευθυνσιοδότηση περιεχομένου, δημιουργία CID σε Node.js/Python, επαλήθευση ακεραιότητας. Ενημερωμένο 2026.

Nacho Collαπό Ενημερώθηκε: 11 λεπτά ανάγνωσης
Πρακτικός οδηγός IPFS CIDs: CIDv0 vs CIDv1, διευθυνσιοδότηση περιεχομένου, δημιουργία CID σε Node.js/Python, επαλήθευση ακεραιότητας. Ενημερωμένο 2026.
Σύνοψη
  • Δημιουργήστε ένα αναπαράξιμο CID από τα bytes οποιουδήποτε αρχείου — το ίδιο περιεχόμενο παράγει πάντα το ίδιο hash.
  • Χρησιμοποιήστε CIDv1 για νέα uploads: είναι Base32, πεζό, και λειτουργεί με subdomain gateways· το CIDv0 δεν λειτουργεί.
  • Ένα μόνο byte που αλλάζει σε ένα αρχείο αλλάζει εντελώς το CID του, καθιστώντας την παραποίηση άμεσα ανιχνεύσιμη.
  • Η διευθυνσιοδότηση περιεχομένου σημαίνει ότι τα αρχεία αναγνωρίζονται από το τι είναι, όχι από το πού φιλοξενούνται.

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

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

Δημιουργήστε CID σε 5 γραμμές (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

Αυτό το CID μπορεί να αναπαραχθεί από οποιονδήποτε — εκτελέστε το ξανά με τα ίδια bytes οπουδήποτε στη Γη και θα πάρετε την ίδια συμβολοσειρά. Αυτό είναι η διευθυνσιοδότηση περιεχομένου.

Αντίστοιχο σε Node.js:

import { sha256 } from 'multiformats/hashes/sha2';
import { CID } from 'multiformats/cid';

const bytes = new TextEncoder().encode('hello world');
const hash = await sha256.digest(bytes);
const cid = CID.create(1, 0x55, hash); // version 1, raw codec
console.log(cid.toString());
// bafkreif7l7mvyofhyo6fgs6mjf5gguvm5jcahzgvfb3o7t5lmhz3...
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 εύρος ζώνης/μήνα. Χωρίς πιστωτική κάρτα.

Nacho Coll

Σχετικά με τον συγγραφέα

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.

Πίσω στο Blog

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