Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Τα μάτια σου φοβούνται και τα χέρια σου φαγούρα!

Σε προηγούμενα άρθρα, ασχοληθήκαμε με τις τεχνολογίες στις οποίες χτίζονται τα blockchain (Τι πρέπει να φτιάξουμε ένα blockchain;) και περιπτώσεις που μπορούν να υλοποιηθούν με τη βοήθειά τους (Γιατί να φτιάξουμε μια υπόθεση;). Ήρθε η ώρα να δουλέψετε με τα χέρια σας! Για την εφαρμογή πιλότων και PoC (Proof of Concept), προτιμώ να χρησιμοποιώ τα σύννεφα, γιατί... μπορούν να έχουν πρόσβαση από οπουδήποτε στον κόσμο και, συχνά, δεν χρειάζεται να χάνουμε χρόνο σε κουραστική εγκατάσταση του περιβάλλοντος, επειδή Υπάρχουν προκαθορισμένες διαμορφώσεις. Λοιπόν, ας φτιάξουμε κάτι απλό, για παράδειγμα, ένα δίκτυο για τη μεταφορά νομισμάτων μεταξύ των συμμετεχόντων και ας το ονομάσουμε σεμνά Bitcoin. Για αυτό θα χρησιμοποιήσουμε το cloud της IBM και το καθολικό blockchain Hyperledger Fabric. Αρχικά, ας καταλάβουμε γιατί το Hyperledger Fabric ονομάζεται καθολική αλυσίδα μπλοκ;

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Hyperledger Fabric - ένα καθολικό blockchain

Σε γενικές γραμμές, ένα παγκόσμιο σύστημα πληροφοριών είναι:

  • Ένα σύνολο διακομιστών και ένας πυρήνας λογισμικού που εκτελεί επιχειρηματική λογική.
  • Διεπαφές για αλληλεπίδραση με το σύστημα.
  • Εργαλεία για εγγραφή, έλεγχο ταυτότητας και εξουσιοδότηση συσκευών/ανθρώπων.
  • Βάση δεδομένων που αποθηκεύει λειτουργικά και αρχειακά δεδομένα:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Μπορείτε να διαβάσετε την επίσημη έκδοση του τι είναι το Hyperledger Fabric Σε απευθείας σύνδεση, και εν συντομία, το Hyperledger Fabric είναι μια πλατφόρμα ανοιχτού κώδικα που σας επιτρέπει να δημιουργείτε ιδιωτικές αλυσίδες μπλοκ και να εκτελείτε αυθαίρετα έξυπνα συμβόλαια γραμμένα στις γλώσσες προγραμματισμού JS και Go. Ας δούμε λεπτομερώς την αρχιτεκτονική του Hyperledger Fabric και ας βεβαιωθούμε ότι πρόκειται για ένα καθολικό σύστημα που έχει μόνο λεπτομέρειες για την αποθήκευση και την καταγραφή δεδομένων. Η ιδιαιτερότητα είναι ότι τα δεδομένα, όπως σε όλα τα blockchain, αποθηκεύονται σε μπλοκ που τοποθετούνται στο blockchain μόνο εάν οι συμμετέχοντες καταλήξουν σε συναίνεση και μετά την καταγραφή τα δεδομένα δεν μπορούν να διορθωθούν ή να διαγραφούν αθόρυβα.

Hyperledger Fabric Architecture

Το διάγραμμα δείχνει την αρχιτεκτονική Hyperledger Fabric:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Οργανισμοί — οι οργανισμοί περιέχουν ομοτίμους, δηλ. το blockchain υπάρχει λόγω της υποστήριξης των οργανισμών. Διαφορετικοί οργανισμοί μπορούν να είναι μέρος του ίδιου καναλιού.

Κανάλι — μια λογική δομή που ενώνει τους συνομηλίκους σε ομάδες, δηλ. το blockchain καθορίζεται. Η Hyperledger Fabric μπορεί να επεξεργαστεί ταυτόχρονα πολλαπλές αλυσίδες μπλοκ με διαφορετική επιχειρηματική λογική.

Πάροχος Υπηρεσιών Μέλους (MSP) είναι CA (Certificate Authority) για την έκδοση ταυτότητας και την ανάθεση ρόλων. Για να δημιουργήσετε έναν κόμβο, πρέπει να αλληλεπιδράσετε με το MSP.

Ομότιμοι κόμβοι — επαληθεύστε τις συναλλαγές, αποθηκεύστε το blockchain, εκτελέστε έξυπνες συμβάσεις και αλληλεπιδράστε με εφαρμογές. Οι Peers διαθέτουν ταυτότητα (ψηφιακό πιστοποιητικό), το οποίο εκδίδεται από τον MSP. Σε αντίθεση με το δίκτυο Bitcoin ή Etherium, όπου όλοι οι κόμβοι έχουν ίσα δικαιώματα, στο Hyperledger Fabric οι κόμβοι παίζουν διαφορετικούς ρόλους:

  • Ομότιμος ίσως επιδοκιμάζοντας συνομήλικους (EP) και να εκτελούν έξυπνα συμβόλαια.
  • Δέσμευση συνομήλικου (CP) - αποθηκεύστε μόνο δεδομένα στο blockchain και ενημερώστε την "Παγκόσμια κατάσταση".
  • Άγκυρα Περ (AP) - εάν πολλοί οργανισμοί συμμετέχουν στο blockchain, τότε χρησιμοποιούνται anchor peers για την επικοινωνία μεταξύ τους. Κάθε οργανισμός πρέπει να έχει έναν ή περισσότερους συνομηλίκους άγκυρας. Χρησιμοποιώντας το AP, οποιοσδήποτε ομότιμος σε έναν οργανισμό μπορεί να λάβει πληροφορίες για όλους τους ομοτίμους σε άλλους οργανισμούς. Χρησιμοποιείται για το συγχρονισμό πληροφοριών μεταξύ AP πρωτόκολλο κουτσομπολιού.
  • Leader Peer — εάν ένας οργανισμός έχει πολλούς ομότιμους, τότε μόνο ο αρχηγός του ομότιμου θα λάβει μπλοκ από την υπηρεσία Παραγγελίας και θα τα δώσει στους υπόλοιπους ομότιμους. Ο ηγέτης μπορεί είτε να καθοριστεί στατικά είτε να επιλεγεί δυναμικά από συναδέλφους στον οργανισμό. Το πρωτόκολλο κουτσομπολιού χρησιμοποιείται επίσης για τον συγχρονισμό πληροφοριών σχετικά με τους ηγέτες.

Ενεργητικό — οντότητες που έχουν αξία και είναι αποθηκευμένες στο blockchain. Πιο συγκεκριμένα, πρόκειται για δεδομένα κλειδιού-τιμής σε μορφή JSON. Αυτά τα δεδομένα είναι που καταγράφονται στο Blockchain. Έχουν ένα ιστορικό, το οποίο είναι αποθηκευμένο στο blockchain, και μια τρέχουσα κατάσταση, η οποία αποθηκεύεται στη βάση δεδομένων «World State». Οι δομές δεδομένων συμπληρώνονται αυθαίρετα ανάλογα με τις επιχειρηματικές εργασίες. Δεν υπάρχουν υποχρεωτικά πεδία, η μόνη σύσταση είναι ότι τα στοιχεία πρέπει να έχουν ιδιοκτήτη και να είναι πολύτιμα.

Καθολικό — αποτελείται από τη βάση δεδομένων Blockchain και κατάσταση του Word, η οποία αποθηκεύει την τρέχουσα κατάσταση των περιουσιακών στοιχείων. Το παγκόσμιο κράτος χρησιμοποιεί LevelDB ή CouchDB.

Έξυπνη σύμβαση — χρησιμοποιώντας έξυπνα συμβόλαια, υλοποιείται η επιχειρηματική λογική του συστήματος. Στο Hyperledger Fabric, τα έξυπνα συμβόλαια ονομάζονται chaincode. Χρησιμοποιώντας τον αλυσιδωτό κώδικα, καθορίζονται τα περιουσιακά στοιχεία και οι συναλλαγές πάνω τους. Από τεχνική άποψη, τα έξυπνα συμβόλαια είναι ενότητες λογισμικού που υλοποιούνται στις γλώσσες προγραμματισμού JS ή Go.

Πολιτική έγκρισης — για κάθε αλυσιδωτό κωδικό, μπορείτε να ορίσετε μια πολιτική για το πόσες επιβεβαιώσεις θα πρέπει να αναμένονται για μια συναλλαγή και από ποιον. Εάν η πολιτική δεν έχει οριστεί, τότε η προεπιλογή είναι: "η συναλλαγή πρέπει να επιβεβαιωθεί από οποιοδήποτε μέλος οποιουδήποτε οργανισμού στο κανάλι." Παραδείγματα πολιτικών:

  • Η συναλλαγή πρέπει να εγκριθεί από οποιονδήποτε διαχειριστή του οργανισμού.
  • Πρέπει να επιβεβαιωθεί από οποιοδήποτε μέλος ή πελάτη του οργανισμού.
  • Πρέπει να επιβεβαιωθεί από οποιονδήποτε ομότιμο οργανισμό.

Υπηρεσία παραγγελίας — συσκευάζει τις συναλλαγές σε μπλοκ και τις στέλνει σε ομότιμους στο κανάλι. Εγγυάται την παράδοση μηνυμάτων σε όλους τους ομοτίμους στο δίκτυο. Χρησιμοποιείται για βιομηχανικά συστήματα Μεσίτης μηνυμάτων Κάφκα, για ανάπτυξη και δοκιμή Solo.

CallFlow

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

  • Η εφαρμογή επικοινωνεί με το Hyperledger Fabric χρησιμοποιώντας Go, Node.js ή Java SDK.
  • Ο πελάτης δημιουργεί μια συναλλαγή tx και τη στέλνει σε ομότιμους που υποστηρίζουν.
  • Το Peer επαληθεύει την υπογραφή του πελάτη, ολοκληρώνει τη συναλλαγή και στέλνει την υπογραφή έγκρισης πίσω στον πελάτη. Ο αλυσιδωτός κώδικας εκτελείται μόνο στον ομότιμο υποστηρικτή και το αποτέλεσμα της εκτέλεσής του αποστέλλεται σε όλους τους ομοτίμους. Αυτός ο αλγόριθμος εργασίας ονομάζεται συναίνεση PBFT (Practical Byzantine Fault Tolerant). Διαφέρει από κλασικό BFT το γεγονός ότι το μήνυμα αποστέλλεται και η επιβεβαίωση αναμένεται όχι από όλους τους συμμετέχοντες, αλλά μόνο από ένα συγκεκριμένο σύνολο.
  • Αφού ο πελάτης λάβει τον αριθμό των απαντήσεων που αντιστοιχούν στην πολιτική έγκρισης, στέλνει τη συναλλαγή στην υπηρεσία Παραγγελίας.
  • Η υπηρεσία Παραγγελίας δημιουργεί ένα μπλοκ και το στέλνει σε όλους τους ομοτίμους που δεσμεύουν. Η υπηρεσία παραγγελιών διασφαλίζει τη διαδοχική καταγραφή των μπλοκ, η οποία εξαλείφει το λεγόμενο ledger fork (δείτε την ενότητα "Πιρούνια");
  • Οι ομότιμοι λαμβάνουν ένα μπλοκ, ελέγχουν ξανά την πολιτική έγκρισης, γράφουν το μπλοκ στο blockchain και αλλάζουν την κατάσταση στο DB "World State".

Εκείνοι. Αυτό οδηγεί σε μια κατανομή ρόλων μεταξύ των κόμβων. Αυτό διασφαλίζει ότι το blockchain είναι επεκτάσιμο και ασφαλές:

  • Τα έξυπνα συμβόλαια (αλυσιδωτός κώδικας) εκτελούν έγκριση ομοτίμων. Αυτό διασφαλίζει την εμπιστευτικότητα των έξυπνων συμβολαίων, επειδή δεν αποθηκεύεται από όλους τους συμμετέχοντες, αλλά μόνο από την έγκριση των ομοτίμων.
  • Η παραγγελία πρέπει να λειτουργεί γρήγορα. Αυτό διασφαλίζεται από το γεγονός ότι η Παραγγελία σχηματίζει μόνο ένα μπλοκ και το στέλνει σε ένα σταθερό σύνολο ομότιμων αρχηγών.
  • Η δέσμευση ομοτίμων αποθηκεύει μόνο το blockchain - μπορεί να υπάρχουν πολλά από αυτά και δεν απαιτούν πολλή ισχύ και άμεση λειτουργία.

Περισσότερες λεπτομέρειες για τις αρχιτεκτονικές λύσεις του Hyperledger Fabric και γιατί λειτουργεί με αυτόν τον τρόπο και όχι διαφορετικά, μπορείτε να βρείτε εδώ: Architecture Origins ή εδώ: Hyperledger Fabric: Ένα κατανεμημένο λειτουργικό σύστημα για εξουσιοδοτημένες αλυσίδες μπλοκ.

Έτσι, το Hyperledger Fabric είναι ένα πραγματικά καθολικό σύστημα με το οποίο μπορείτε:

  • Εφαρμογή αυθαίρετης επιχειρηματικής λογικής χρησιμοποιώντας τον μηχανισμό έξυπνων συμβολαίων.
  • Καταγραφή και λήψη δεδομένων από τη βάση δεδομένων blockchain σε μορφή JSON.
  • Παραχωρήστε και επαληθεύστε την πρόσβαση στο API χρησιμοποιώντας την Αρχή έκδοσης πιστοποιητικών.

Τώρα που καταλάβαμε λίγο τις ιδιαιτερότητες του Hyperledger Fabric, ας κάνουμε επιτέλους κάτι χρήσιμο!

Ανάπτυξη blockchain

Δήλωση προβλήματος

Ο στόχος είναι να υλοποιήσετε το δίκτυο Citcoin με τις ακόλουθες λειτουργίες: δημιουργία λογαριασμού, λήψη υπολοίπου, συμπλήρωση του λογαριασμού σας, μεταφορά νομισμάτων από τον έναν λογαριασμό στον άλλο. Ας σχεδιάσουμε ένα μοντέλο αντικειμένου, το οποίο θα εφαρμόσουμε περαιτέρω σε ένα έξυπνο συμβόλαιο. Έτσι, θα έχουμε λογαριασμούς που προσδιορίζονται με ονόματα και περιέχουν ένα υπόλοιπο και μια λίστα λογαριασμών. Οι λογαριασμοί και μια λίστα λογαριασμών είναι, όσον αφορά τα περιουσιακά στοιχεία Hyperledger Fabric. Αντίστοιχα, έχουν ιστορία και τρέχουσα κατάσταση. Θα προσπαθήσω να το σχεδιάσω ξεκάθαρα:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Τα κορυφαία στοιχεία είναι η τρέχουσα κατάσταση, η οποία είναι αποθηκευμένη στη βάση δεδομένων "World State". Κάτω από αυτά υπάρχουν στοιχεία που δείχνουν το ιστορικό που είναι αποθηκευμένο στο blockchain. Η τρέχουσα κατάσταση των περιουσιακών στοιχείων αλλάζει από τις συναλλαγές. Το Στοιχείο αλλάζει μόνο στο σύνολό του, επομένως ως αποτέλεσμα της συναλλαγής, δημιουργείται ένα νέο αντικείμενο και η τρέχουσα αξία του περιουσιακού στοιχείου πηγαίνει στο ιστορικό.

IBM Cloud

Δημιουργούμε λογαριασμό σε IBM cloud. Για να χρησιμοποιήσετε την πλατφόρμα blockchain, πρέπει να αναβαθμιστεί σε Pay-As-You-Go. Αυτή η διαδικασία μπορεί να μην είναι γρήγορη, γιατί... Η IBM ζητά πρόσθετες πληροφορίες και τις επαληθεύει με μη αυτόματο τρόπο. Σε μια θετική σημείωση, μπορώ να πω ότι η IBM διαθέτει καλό εκπαιδευτικό υλικό που σας επιτρέπει να αναπτύξετε το Hyperledger Fabric στο σύννεφο της. Μου άρεσαν οι ακόλουθες σειρές άρθρων και παραδειγμάτων:

Ακολουθούν στιγμιότυπα οθόνης της πλατφόρμας Blockchain της IBM. Αυτή δεν είναι μια οδηγία για το πώς να δημιουργήσετε μια αλυσίδα μπλοκ, αλλά απλώς μια επίδειξη του εύρους της εργασίας. Έτσι, για τους σκοπούς μας, κάνουμε έναν Οργανισμό:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Δημιουργούμε κόμβους σε αυτό: Orderer CA, Org1 CA, Orderer Peer:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Δημιουργούμε χρήστες:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Δημιουργήστε ένα κανάλι και ονομάστε το citcoin:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Ουσιαστικά το Channel είναι μια αλυσίδα μπλοκ, επομένως ξεκινά με το μπλοκ μηδέν (μπλοκ Genesis):

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Σύνταξη έξυπνου συμβολαίου

/*
 * Citcoin smart-contract v1.5 for Hyperledger Fabric
 * (c) Alexey Sushkov, 2019
 */
 
'use strict';
 
const { Contract } = require('fabric-contract-api');
const maxAccounts = 5;
 
class CitcoinEvents extends Contract {
 
    async instantiate(ctx) {
        console.info('instantiate');
        let emptyList = [];
        await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(emptyList)));
    }
    // Get all accounts
    async GetAccounts(ctx) {
        // Get account list:
        let accounts = '{}'
        let accountsData = await ctx.stub.getState('accounts');
        if (accountsData) {
            accounts = JSON.parse(accountsData.toString());
        } else {
            throw new Error('accounts not found');
        }
        return accountsData.toString()
    }
     // add a account object to the blockchain state identifited by their name
    async AddAccount(ctx, name, balance) {
        // this is account data:
        let account = {
            name: name,
            balance: Number(balance),       
            type: 'account',
        };
        // create account:
        await ctx.stub.putState(name, Buffer.from(JSON.stringify(account)));
 
        // Add account to list:
        let accountsData = await ctx.stub.getState('accounts');
        if (accountsData) {
            let accounts = JSON.parse(accountsData.toString());
            if (accounts.length < maxAccounts)
            {
                accounts.push(name);
                await ctx.stub.putState('accounts', Buffer.from(JSON.stringify(accounts)));
            } else {
                throw new Error('Max accounts number reached');
            }
        } else {
            throw new Error('accounts not found');
        }
        // return  object
        return JSON.stringify(account);
    }
    // Sends money from Account to Account
    async SendFrom(ctx, fromAccount, toAccount, value) {
        // get Account from
        let fromData = await ctx.stub.getState(fromAccount);
        let from;
        if (fromData) {
            from = JSON.parse(fromData.toString());
            if (from.type !== 'account') {
                throw new Error('wrong from type');
            }   
        } else {
            throw new Error('Accout from not found');
        }
        // get Account to
        let toData = await ctx.stub.getState(toAccount);
        let to;
        if (toData) {
            to = JSON.parse(toData.toString());
            if (to.type !== 'account') {
                throw new Error('wrong to type');
            }  
        } else {
            throw new Error('Accout to not found');
        }
 
        // update the balances
        if ((from.balance - Number(value)) >= 0 ) {
            from.balance -= Number(value);
            to.balance += Number(value);
        } else {
            throw new Error('From Account: not enought balance');          
        }
 
        await ctx.stub.putState(from.name, Buffer.from(JSON.stringify(from)));
        await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to)));
                 
        // define and set Event
        let Event = {
            type: "SendFrom",
            from: from.name,
            to: to.name,
            balanceFrom: from.balance,
            balanceTo: to.balance,
            value: value
        };
        await ctx.stub.setEvent('SendFrom', Buffer.from(JSON.stringify(Event)));
 
        // return to object
        return JSON.stringify(from);
    }
 
    // get the state from key
    async GetState(ctx, key) {
        let data = await ctx.stub.getState(key);
        let jsonData = JSON.parse(data.toString());
        return JSON.stringify(jsonData);
    }
    // GetBalance   
    async GetBalance(ctx, accountName) {
        let data = await ctx.stub.getState(accountName);
        let jsonData = JSON.parse(data.toString());
        return JSON.stringify(jsonData);
    }
     
    // Refill own balance
    async RefillBalance(ctx, toAccount, value) {
        // get Account to
        let toData = await ctx.stub.getState(toAccount);
        let to;
        if (toData) {
            to = JSON.parse(toData.toString());
            if (to.type !== 'account') {
                throw new Error('wrong to type');
            }  
        } else {
            throw new Error('Accout to not found');
        }
 
        // update the balance
        to.balance += Number(value);
        await ctx.stub.putState(to.name, Buffer.from(JSON.stringify(to)));
                 
        // define and set Event
        let Event = {
            type: "RefillBalance",
            to: to.name,
            balanceTo: to.balance,
            value: value
        };
        await ctx.stub.setEvent('RefillBalance', Buffer.from(JSON.stringify(Event)));
 
        // return to object
        return JSON.stringify(from);
    }
}
module.exports = CitcoinEvents;

Διαισθητικά, όλα πρέπει να είναι ξεκάθαρα εδώ:

  • Υπάρχουν πολλές λειτουργίες (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) που θα καλέσει το πρόγραμμα επίδειξης χρησιμοποιώντας το Hyperledger Fabric API.
  • Οι συναρτήσεις SendFrom και RefillBalance δημιουργούν συμβάντα που θα λάβει το πρόγραμμα επίδειξης.
  • Η συνάρτηση instantiate καλείται μία φορά όταν δημιουργηθεί ένα έξυπνο συμβόλαιο. Στην πραγματικότητα, δεν ονομάζεται μόνο μία φορά, αλλά κάθε φορά που αλλάζει η έκδοση του έξυπνου συμβολαίου. Επομένως, η προετοιμασία μιας λίστας με έναν κενό πίνακα είναι κακή ιδέα, γιατί Τώρα, όταν αλλάξουμε την έκδοση του έξυπνου συμβολαίου, θα χάσουμε την τρέχουσα λίστα. Αλλά δεν πειράζει, μόλις μαθαίνω).
  • Οι λογαριασμοί και μια λίστα λογαριασμών είναι δομές δεδομένων JSON. Το JS χρησιμοποιείται για χειρισμό δεδομένων.
  • Μπορείτε να λάβετε την τρέχουσα αξία ενός στοιχείου χρησιμοποιώντας την κλήση της συνάρτησης getState και να την ενημερώσετε χρησιμοποιώντας το putState.
  • Κατά τη δημιουργία ενός Λογαριασμού, καλείται η συνάρτηση AddAccount, στην οποία γίνεται σύγκριση για τον μέγιστο αριθμό λογαριασμών στο blockchain (maxAccounts = 5). Και εδώ υπάρχει ένα τζάμπα (το έχετε προσέξει;), που οδηγεί σε ατελείωτη αύξηση του αριθμού των λογαριασμών. Τέτοια λάθη πρέπει να αποφεύγονται)

Στη συνέχεια, φορτώνουμε το έξυπνο συμβόλαιο στο κανάλι και το εγκαινιάζουμε:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Ας δούμε τη συναλλαγή για την εγκατάσταση Smart Contract:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Ας δούμε τις λεπτομέρειες για το κανάλι μας:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Ως αποτέλεσμα, παίρνουμε το ακόλουθο διάγραμμα ενός δικτύου blockchain στο cloud της IBM. Το διάγραμμα δείχνει επίσης ένα πρόγραμμα επίδειξης που εκτελείται στο cloud του Amazon σε έναν εικονικό διακομιστή (περισσότερα για αυτό στην επόμενη ενότητα):

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Δημιουργία GUI για κλήσεις API Hyperledger Fabric

Το Hyperledger Fabric διαθέτει ένα API που μπορεί να χρησιμοποιηθεί για:

  • Δημιουργία καναλιού.
  • Συνδέσεις peer to channel.
  • Εγκατάσταση και εγκατάσταση έξυπνων συμβολαίων στο κανάλι.
  • Κλήση συναλλαγών?
  • Ζητήστε πληροφορίες για το blockchain.

Ανάπτυξη εφαρμογής

Στο πρόγραμμα επίδειξης θα χρησιμοποιήσουμε το API μόνο για να καλέσουμε συναλλαγές και να ζητήσουμε πληροφορίες, επειδή Έχουμε ήδη ολοκληρώσει τα υπόλοιπα βήματα χρησιμοποιώντας την πλατφόρμα blockchain της IBM. Γράφουμε ένα GUI χρησιμοποιώντας μια τυπική στοίβα τεχνολογίας: Express.js + Vue.js + Node.js. Μπορείτε να γράψετε ένα ξεχωριστό άρθρο για το πώς να ξεκινήσετε τη δημιουργία σύγχρονων εφαρμογών web. Εδώ θα αφήσω έναν σύνδεσμο για τη σειρά διαλέξεων που μου άρεσε περισσότερο: Εφαρμογή Web Full Stack χρησιμοποιώντας Vue.js & Express.js. Το αποτέλεσμα είναι μια εφαρμογή πελάτη-διακομιστή με οικεία γραφική διεπαφή στο στυλ Σχεδιασμού Υλικού της Google. Το REST API μεταξύ πελάτη και διακομιστή αποτελείται από πολλές κλήσεις:

  • HyperledgerDemo/v1/init - αρχικοποίηση της αλυσίδας μπλοκ.
  • HyperledgerDemo/v1/accounts/list — λάβετε μια λίστα με όλους τους λογαριασμούς.
  • HyperledgerDemo/v1/account?name=Bob&balance=100 — δημιουργία λογαριασμού Bob.
  • HyperledgerDemo/v1/info?account=Bob — λάβετε πληροφορίες σχετικά με τον λογαριασμό Bob.
  • HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 - μεταφορά δύο νομισμάτων από τον Bob στην Alice.
  • HyperledgerDemo/v1/disconnect - κλείστε τη σύνδεση με το blockchain.

Περιγραφή του API με παραδείγματα που περιλαμβάνονται στο Ιστοσελίδα ταχυδρόμων - ένα πολύ γνωστό πρόγραμμα για τη δοκιμή HTTP API.

Επίδειξη εφαρμογής στο Amazon cloud

Ανέβασα την εφαρμογή στο Amazon γιατί... Η IBM δεν μπόρεσε ακόμα να αναβαθμίσει τον λογαριασμό μου και να μου επιτρέψει να δημιουργήσω εικονικούς διακομιστές. Πώς να προσθέσετε ένα cherry στον τομέα: www.citcoin.info. Θα κρατήσω τον διακομιστή ανοιχτό για λίγο και μετά θα τον απενεργοποιήσω, γιατί... τα σεντς για ενοικίαση στάζουν και τα νομίσματα citcoin δεν είναι ακόμη εισηγμένα στο χρηματιστήριο) Συμπεριλαμβάνω στιγμιότυπα οθόνης του demo στο άρθρο για να είναι ξεκάθαρη η λογική της δουλειάς. Η εφαρμογή επίδειξης μπορεί:

  • Αρχικοποιήστε το blockchain.
  • Δημιουργία λογαριασμού (αλλά τώρα δεν μπορείτε να δημιουργήσετε νέο λογαριασμό, επειδή ο μέγιστος αριθμός λογαριασμών που καθορίζεται στο έξυπνο συμβόλαιο έχει συμπληρωθεί στο blockchain).
  • Λήψη λίστας λογαριασμών.
  • Μεταφέρετε νομίσματα citcoin μεταξύ της Alice, του Bob και του Alex.
  • Λήψη συμβάντων (αλλά τώρα δεν υπάρχει τρόπος εμφάνισης συμβάντων, επομένως για απλότητα, η διεπαφή λέει ότι τα συμβάντα δεν υποστηρίζονται).
  • Καταγραφή ενεργειών.

Αρχικά αρχικοποιούμε το blockchain:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Στη συνέχεια, δημιουργούμε τον λογαριασμό μας, μην χάνετε χρόνο με το υπόλοιπο:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Λαμβάνουμε μια λίστα με όλους τους διαθέσιμους λογαριασμούς:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

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

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Στο αρχείο καταγραφής παρακολουθούμε την εκτέλεση των συναλλαγών:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Στην πραγματικότητα, αυτό είναι όλο με το πρόγραμμα επίδειξης. Παρακάτω μπορείτε να δείτε τη συναλλαγή μας στο blockchain:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Και η γενική λίστα συναλλαγών:

Blockchain: τι PoC πρέπει να δημιουργήσουμε;

Με αυτό, ολοκληρώσαμε με επιτυχία την υλοποίηση του PoC για τη δημιουργία του δικτύου Citcoin. Τι άλλο πρέπει να γίνει για να γίνει το Citcoin ένα πλήρες δίκτυο μεταφοράς νομισμάτων; Πολύ λίγο:

  • Στο στάδιο της δημιουργίας λογαριασμού, εφαρμόστε τη δημιουργία ενός ιδιωτικού / δημόσιου κλειδιού. Το ιδιωτικό κλειδί πρέπει να αποθηκευτεί με τον χρήστη του λογαριασμού, το δημόσιο κλειδί πρέπει να αποθηκευτεί στο blockchain.
  • Κάντε μια μεταφορά νομισμάτων στην οποία χρησιμοποιείται ένα δημόσιο κλειδί, αντί για ένα όνομα, για την αναγνώριση του χρήστη.
  • Κρυπτογραφήστε τις συναλλαγές που πηγαίνουν από τον χρήστη στον διακομιστή με το ιδιωτικό του κλειδί.

Συμπέρασμα

Έχουμε υλοποιήσει το δίκτυο Citcoin με τις ακόλουθες λειτουργίες: προσθήκη λογαριασμού, λήψη υπολοίπου, συμπλήρωση του λογαριασμού σας, μεταφορά νομισμάτων από τον έναν λογαριασμό στον άλλο. Λοιπόν, τι μας κόστισε η κατασκευή ενός PoC;

  • Πρέπει να μελετήσετε το blockchain γενικά και το Hyperledger Fabric ειδικότερα.
  • Μάθετε να χρησιμοποιείτε τα σύννεφα IBM ή Amazon.
  • Μάθετε τη γλώσσα προγραμματισμού JS και κάποιο πλαίσιο web.
  • Εάν ορισμένα δεδομένα πρέπει να αποθηκευτούν όχι στο blockchain, αλλά σε μια ξεχωριστή βάση δεδομένων, τότε μάθετε να ενσωματώνετε, για παράδειγμα, με την PostgreSQL.
  • Και τελευταίο αλλά εξίσου σημαντικό - δεν μπορείτε να ζήσετε στον σύγχρονο κόσμο χωρίς γνώση του Linux!)

Φυσικά, δεν είναι επιστήμη πυραύλων, αλλά θα πρέπει να εργαστείτε σκληρά!

Πηγές στο GitHub

Βάλθηκαν πηγές GitHub. Σύντομη περιγραφή του αποθετηρίου:
Κατάλογος «διακομιστής» — Διακομιστής Node.js
Κατάλογος «πελάτης» — πελάτης Node.js
Κατάλογος «blockchain"(οι τιμές και τα κλειδιά παραμέτρων, φυσικά, δεν λειτουργούν και δίνονται μόνο ως παράδειγμα):

  • σύμβαση — πηγαίος κώδικας έξυπνου συμβολαίου
  • πορτοφόλι — κλειδιά χρήστη για τη χρήση του Hyperledger Fabric API.
  • *.cds - μεταγλωττισμένες εκδόσεις έξυπνων συμβολαίων
  • Αρχεία *.json - παραδείγματα αρχείων διαμόρφωσης για τη χρήση του Hyperledger Fabric API

Είναι μόνο η αρχή!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο