HBH Educational Token (EL)

Στο προηγούμενο μου άρθρο περιέγραψα τον ορισμό του Blockchain αλλά και τις δυνατότητες αυτής της τεχνολογίας. Είναι σημαντικό να κατανοησουμε ότι τα cryptocurrencies όπως τα bitcoins, ethercoins, litecoins κ.α. δεν είναι blockchain αλλά το blockchain είναι η υποκείμενη τεχνολογία η οποία χρησιμοποιείται απο τα κρυπτονομίσματα ώστε να μπορούν να γίνουν οι συναλλαγές με ασφάλεια, αδιαμφισβήτητα και χωρίς ενδιάμεσους.

Bitcoin != Blockchain

Στην προσπάθεια μας να εξηγήσουμε την τεχνολογία blockchain θα κατασκευάσουμε ένα νέο νόμισμα το οποίο θα το ονομάσουμε hbhCoin (Hellenic Blockchain Hub Coin).

Blockchain

To blockchain είναι είναι ένας ψηφιακά κατανεμημένος δημόσιος ή ιδιωτικός λογιστικός κατάλογος στον οποίο κανείς μπορεί να διαβάσει ή να γράψει ανάλογα με τα δικαιώματα που έχει. Το Blockchain είναι μια γραμμική αλυσίδα απο μπλόκ δεδομένων ενώ υπάρχουν και άλλοι τύποι κατανεμημένων καταλόγων οι οποίοι αποτελούνται απο κατευθυνόμενα ακυκλικά γραφήματα (DAGs) όπως είναι το IOTA.

Types of Distributed Ledgers

Η ιδιαιτερότητα που έχει το Blockchain είναι ότι καθιστά τον κατάλογο του ουσιαστικά αμετάβλητο. Με το που καταχωρηθεί ένα μπλόκ δεδομένων στην αλυσίδα δεν μπορεί να αλλάξει και αυτός είναι ο λόγος για τον οποίο τα κρυπτονομίσματα χρησιμοποιούν την τεχνολογία blockchain ώστε οι συναλλαγές να μην μπορούν να αλλάξουν και να αμφισβητηθούν.

Το κείμενο απο εδώ και κάτω απευθύνεται σε αναγνώστες οι οποίοι έχουν κάποια πρότερη εμπειρία με τον προγραμματισμό σε JavaScript. Για να ολοκληρώσουμε την εργασία μας και να δοκιμάσουμε τον κώδικα θα χρειαστεί να κατεβάσουμε την κατάλληλη έκδοση του Visual Studio Code ανάλογα με το λειτουργικό μας σύστημα ή οποιοδήποτε άλλο πρόγραμμα της αρεσκείας μας.

Δημιουργώντας ένα Block Δεδομένων

Το blockchain αποτελείται απο συνδεδεμένα blocks δεδομένων τα οποία έχουν επιβεβαιωθεί (consensus) με κάποιον αλγόριθμο (Proof of Work ή Proof of Stake) απο το αποκεντροποιημένο δίκτυο δίχως ενδιάμεσους.

Η σύνδεση των μπλόκ δεδομένων μεταξύ τους πραγματοποιείται για την ακεραιότητα των δεδομένων στην αλυσίδα. Πως γίνεται αυτό; Κάθε μπλόκ δεδομένων κρυπτογραφείται με τον αλγόριθμο SHA-256 και περιέχει εκτός των δεδομενων και την πληροφορία hash του προηγούμενου μπλοκ δεδομένων.

Ας φτιάξουμε λοιπόν μια κλάση του μπλοκ σε JavaScript.

Ενσωματώσαμε την βιβλιοθήκη crypto-js-library καθώς η συνάρτηση SHA-256 δεν υποστηρίζεται απευθειας απο την JavaScript.

Ορίζουμε και αρχικοποιούμε τις ιδιότητες του Block δίνοντας ένα αριθμό σε κάθε Block ώστε να γνωρίζουμε την θέση στην αλυσίδα ενσωματώνοντας την ημερομηνία, τα δεδομένα (στην περίπτωση μας την αξία του νομίσματος μας) καθώς και την διεύθυνση στο προηγούμενο block.

const SHA256 = require("crypto-js/sha256"); 
class Block 
{
constructor(index, timestamp, data, previousHash = '')
{
this.index = index;
this.previousHash = previousHash;
this.timestamp = timestamp;
this.data = data;
this.hash = this.calculateHash();
}
    calculateHash() 
{
//Κρυπτογράφηση με τον αλγόριθμο SHA256
return SHA256(this.index + this.previousHash +
this.timestamp +
JSON.stringify(this.data)).toString();
}
}

Φτιάχνοντας την Αλυσίδα Blockchain

Τώρα που φτιάξαμε τα μπλόκ ας φτιάξουμε και την κλάση για την αλυσίδα που ενώνει όλα τα μπλόκ δεδομένων.

Στον δομητή (constructor) αρχικοποιούμε την αλυσίδα δημιουργώντας το αρχικό μπλοκ (genesis block). Το συγκεκριμένο μπλοκ αυτό έχει την ιδιότητα ότι δεν δείχνει σε κανένα προηγούμενο μπλοκ.

Δημιουργήσαμε τις παρακάτω μεθόδους ώστε να βρίσκουμε ποιό είναι το τελευταίο μπλοκ δεδομένων αλλά και να προσθέτουμε ένα μπλόκ στην αλυσίδα.

  • getLatestBlock() επιστρέφει το τελευταίο μπλοκ στην αλυσίδα
  • addBlock() προσθέτει ένα νέο μπλοκ στην αλυσίδα. για να το κάνουμε αυτό προσθέτουμε την ταυτότητα του τελευταίου μπλοκ (hash) στo μπλοκ που θέλουμε να προσθέσουμε διατηρώντας την ακεραιότητα της αλυσίδας.
  • isChainValid() τέλος για να ελέγξουμε την ακεραιότητα της αλυσίδας ελέγχουμε κάθε μπλοκ αν το hash του κάθε μπλόκ είναι το ίδιο με το hash του προηγούμενου μέχρι να φτάσουμε στο αρχικό μπλοκ συγκρίνοντας το με το previousHash.
class Blockchain{
    constructor() {
this.chain = [this.createInitialBlock()];
}
    createInitialBlock() {
return new Block(0, "01/10/2018", "Starting Block", "0");
}
    getLatestBlock() {
return this.chain[this.chain.length - 1];
}
    addBlock(newBlock) {
newBlock.previousHash = this.getLatestBlock().hash;
newBlock.hash = newBlock.calculateHash();
this.chain.push(newBlock);
}
    isChainValid() {
for (let i = 1; i < this.chain.length; i++)
{
const currentBlock = this.chain[i];
const previousBlock = this.chain[i - 1];
            if (currentBlock.hash !== currentBlock.calculateHash())
{ return false; }
            if (currentBlock.previousHash !== previousBlock.hash) 
{ return false; }
}
return true;
}
}

Χρησιμοποιώντας το Blockchain και προσθέτωντας hbhCoins

Αρχικοποιώ την κλάση Blockchain ονομάζοντας την hbhCoin και προσθέτω 3 μπλοκ στην αλυσίδα. Τα δεδομένα που περιέχονται στα μπλοκ μπορούν να είναι οτιδήποτε θέλουμε, στην περίπτωση μας όμως προσθέσαμε ένα αντικείμενο amount προσθέτωντας 10, 20 και 30 hbhCoins σε κάθε μπλοκ αντίστοιχα.

let hbhCoin = new Blockchain(); //Αρχικοποίηση του Blockchain
hbhCoin.addBlock(new Block(1, "01/10/2018", { amount: 10 }));
console.log('Added 10 hbh Coins in block no1');
hbhCoin.addBlock(new Block(2, "01/10/2018", { amount: 20 }));
console.log('Added 20 hbh Coins in block no2');
hbhCoin.addBlock(new Block(3, "01/10/2018", { amount: 30 }));
console.log('Added 30 hbh Coins in block no3');

Επιβεβαιώνοντας την αλυσίδα Blockchain

Έχοντας προσθέσει τα 3 μπλοκ στην αλυσίδα, τρέχουμε την μέθοδο isChainValid() για να ελέγξουμε την ακεραιότητα της.

// Check if chain is valid (will return true)
console.log('Blockchain valid? ' + hbhCoin.isChainValid());

καθώς τα δεδομένα δεν έχουν αλλάξει η μέθοδος θα επιστρέψει True δηλαδή ότι η αλυσίδα είναι ακέραιη.

Ας υποθέσουμε ότι κάποιος κακόβουλος προσπαθεί να αλλάξει τα δεδομένα στο μπλοκ 2 αλλάζοντας το ποσό στα 1000 hbhCoins.

// Amount change attempt to block no2
hbhCoin.chain[2].data = { amount: 1000 };
// Check our chain again (will now return false)
console.log("Blockchain valid? " + hbhCoin.isChainValid());

Το αλλαγμένο μπλοκ δεν μπορεί να επιβεβαιωθεί καθώς έχει αλλάξει το hash του αφού αλλάξανε τα δεδομένα έτσι το δίκτυο δεν θα επιβεβαιώσει την αλλαγή και αυτή δεν θα πραγματοποιηθεί.


Συμπεράσματα και Περιορισμοί

Η συγκεκριμένη υλοποίηση του hbhCoin δημιουργήθηκε αποκλειστικά για εκπαιδευτικούς σκοπούς δεν αποτελεί τρόπο ανταλαγής κρυπτονομισμάτων και δεν υλοποιεί κάποιον consensus αλγόριθμο αλλά ούτε και την επικαιροποίηση των κατανεμημένων καταλόγων σε ένα P2P δίκτυο.

Κατεβάστε τον κώδικα του αρχείου εδώ