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

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

Τι είναι ένα 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, εμπιστεύεστε ότι:
- Ο ιδιοκτήτης του τομέα δεν έχει αλλάξει το περιεχόμενο
- Ο διακομιστής είναι online και προσβάσιμος
- Το περιεχόμενο δεν έχει παραποιηθεί
Με τη διευθυνσιοδότηση περιεχομένου χρησιμοποιώντας CIDs:
- Αμεταβλητότητα: Το CID εγγυάται ότι το περιεχόμενο δεν έχει αλλάξει
- Αποκέντρωση: Το περιεχόμενο μπορεί να ανακτηθεί από οποιοδήποτε IPFS κόμβο που το έχει
- Επαλήθευση: Μπορείτε να επαληθεύσετε κρυπτογραφικά ότι λάβατε το σωστό περιεχόμενο
- Αποδοτικότητα: Το ίδιο περιεχόμενο αποπολλαπλασιάζεται αυτόματα
Ανατομία ενός 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
Κάθε κομμάτι περιεχομένου περνά από:
- Σειριοποίηση: Το περιεχόμενο μορφοποιείται σύμφωνα με το codec του
- Hashing: Η κρυπτογραφική συνάρτηση hash επεξεργάζεται τα σειριοποιημένα δεδομένα
- Δημιουργία Multihash: Το hash τυλίγεται με πληροφορίες αλγορίθμου και μήκους
- Συναρμολόγηση 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 εύρος ζώνης/μήνα. Χωρίς πιστωτική κάρτα.
