Blockchain: què hem de construir un PoC?

Els ulls tenen por i les mans piquen!

En articles anteriors, vam tractar les tecnologies sobre les quals es construeixen les cadenes de blocs (Què hem de construir una cadena de blocs?) i casos que es poden implementar amb la seva ajuda (Què ens costa construir un cas?). És hora de treballar amb les mans! Per a la implementació de pilots i PoC (Prova de concepte), prefereixo utilitzar núvols, perquè. tenen accés des de qualsevol part del món i, sovint, no cal dedicar temps a la tediosa instal·lació de l'entorn, perquè. Hi ha configuracions predeterminades. Per tant, fem una cosa senzilla, com una xarxa per transferir monedes entre participants i anomenem-ho modestament Citcoin. Per fer-ho, utilitzarem el núvol IBM i la cadena de blocs universal Hyperledger Fabric. Primer, anem a esbrinar per què Hyperledger Fabric s'anomena cadena de blocs universal?

Blockchain: què hem de construir un PoC?

Hyperledger Fabric - Blockchain universal

En termes generals, un sistema d'informació universal és:

  • Un conjunt de servidors i un nucli de programari que realitza la lògica empresarial;
  • Interfícies per a la interacció amb el sistema;
  • Mitjans de registre, autenticació i autorització de dispositius/persones;
  • Base de dades que emmagatzema dades operatives i arxivades:

Blockchain: què hem de construir un PoC?

La versió oficial de què és Hyperledger Fabric es pot llegir a Online, i en resum, Hyperledger Fabric és una plataforma de codi obert que permet construir blockchains privades i executar contractes intel·ligents arbitraris escrits en llenguatges de programació JS i Go. Fem una ullada més de prop a l'arquitectura Hyperledger Fabric i assegurem-nos que es tracta d'un sistema universal que només té especificitats per emmagatzemar i gravar dades. L'especificitat rau en el fet que les dades, com en totes les cadenes de blocs, s'emmagatzemen en blocs que es col·loquen a la cadena de blocs només si els participants han arribat a un consens i, després de la gravació, les dades no es poden corregir ni esborrar en silenci.

Hyperledger Fabric Architecture

El diagrama mostra l'arquitectura Hyperledger Fabric:

Blockchain: què hem de construir un PoC?

Organitzacions - les organitzacions contenen iguals, per tant blockchain existeix gràcies al suport de les organitzacions. Diferents organitzacions poden formar part del mateix canal.

Canal - una estructura lògica que uneix els companys en grups, per tant. blockchain està configurat. Hyperledger Fabric pot processar simultàniament diverses cadenes de blocs amb una lògica empresarial diferent.

Proveïdor de serveis de membres (MSP) és una CA (Autoritat de certificació) per emetre identitat i assignar rols. Per crear un node, cal interactuar amb el MSP.

Nodes iguals — verificar transaccions, emmagatzemar la cadena de blocs, executar contractes intel·ligents i interactuar amb aplicacions. Els companys tenen una identitat (certificat digital) emès pel MSP. A diferència de la xarxa Bitcoin o Etherium, on tots els nodes són iguals, els nodes tenen diferents papers a Hyperledger Fabric:

  • Peer pot ser avalant el mateix (EP) i executar contractes intel·ligents.
  • Compromís entre iguals (CP): només deseu dades a la cadena de blocs i actualitzeu l'"Estat mundial".
  • Àncora Peer (AP): si diverses organitzacions participen a la cadena de blocs, s'utilitzen companys d'ancoratge per comunicar-se entre elles. Cada organització ha de tenir un o més companys d'ancoratge. Amb l'ajuda de l'AP, qualsevol company d'una organització pot obtenir informació sobre tots els companys d'altres organitzacions. S'utilitza per sincronitzar informació entre AP. protocol de xafarderies.
  • Líder Peer - si l'organització té diversos companys, llavors només el líder del peer rebrà blocs del servei d'Ordenacions i els donarà a la resta de companys. El líder es pot establir de forma estàtica o dinàmica pels companys de l'organització. El protocol de xafarderies també s'utilitza per sincronitzar la informació del líder.

Béns — entitats de valor que s'emmagatzemen a la cadena de blocs. Més concretament, es tracta de dades clau-valor en format JSON. Són aquestes dades les que es registren a la cadena de blocs Blockchain. Tenen un historial que s'emmagatzema a la cadena de blocs i un estat actual que s'emmagatzema a la base de dades "Estat mundial". Les estructures de dades s'omplen arbitràriament en funció de les tasques empresarials. No hi ha camps obligatoris, l'única recomanació és que els actius han de tenir un propietari i tenir valor.

llibre major - consta de la cadena de blocs Blockchain i la base de dades d'estat de Word, que emmagatzema l'estat actual dels actius. L'estat mundial utilitza LevelDB o CouchDB.

Contracte intel·ligent — amb l'ajuda de contractes intel·ligents, s'implementa la lògica empresarial del sistema. A Hyperledger Fabric, els contractes intel·ligents s'anomenen codi de cadena. Amb l'ajuda del codi en cadena, s'especifiquen els actius i les transaccions sobre ells. En llenguatge tècnic, els contractes intel·ligents són mòduls de programari implementats en llenguatges de programació JS o Go.

Política d'aprovació - Per a cada codi de cadena, podeu establir polítiques de quants i de qui necessiteu esperar confirmacions de la transacció. Si no s'estableix la política, el valor predeterminat és: "la transacció ha de ser confirmada per qualsevol membre de qualsevol organització del canal". Exemples de polítiques:

  • La transacció ha de ser confirmada per qualsevol administrador de l'organització;
  • Ha de ser confirmat per qualsevol membre o client de l'organització;
  • Ha de confirmar qualsevol company de l'organització.

Servei de comandes - empaqueta transaccions en blocs i les envia als companys del canal. Assegura el lliurament de missatges a tots els companys de la xarxa. S'utilitza per a sistemes industrials Agent de missatges Kafka, per al desenvolupament i proves Només.

flux de trucades

Blockchain: què hem de construir un PoC?

  • L'aplicació interactua amb Hyperledger Fabric mitjançant Go, Node.js o Java SDK;
  • El client crea una transacció tx i l'envia als companys de suport;
  • El peer verifica la signatura del client, completa la transacció i envia la signatura d'aprovació al client. El codi en cadena només s'executa al parell d'aprovació i el resultat de la seva execució s'envia a tots els iguals. Aquest algorisme de treball s'anomena - PBFT (Practical Byzantine Fault Tolerant) consens. Difereix de BFT clàssic el fet que el missatge s'enviï i s'espera la confirmació no de tots els participants, sinó només d'un determinat conjunt;
  • Després que el client hagi rebut el nombre de respostes corresponents a la política d'avals, envia la transacció al servei de Comandes;
  • El servei de comandes forma un bloc i l'envia a tots els companys compromesos. El servei de comanda assegura que els blocs s'escriuen seqüencialment, la qual cosa elimina l'anomenada bifurcació de llibres majors (veure la secció "Forquilles");
  • Els companys reben el bloc, tornen a comprovar la política d'aprovació, escriuen el bloc a la cadena de blocs i canvien l'estat a la base de dades "Estat mundial".

Aquells. resulta la divisió de rols entre nodes. Això garanteix l'escalabilitat i la seguretat de la cadena de blocs:

  • Els contractes intel·ligents (codi de cadena) realitzen un aval de companys. Això garanteix la confidencialitat dels contractes intel·ligents, com no l'emmagatzemen tots els participants, sinó només els companys que avalen.
  • La comanda hauria de funcionar ràpidament. Això està garantit pel fet que Ordering només forma un bloc i l'envia a un conjunt fix de companys líders.
  • Els companys compromesos només emmagatzemen la cadena de blocs: n'hi poden haver molts i no requereixen molta potència i treball instantani.

Podeu trobar més solucions arquitectòniques d'Hyperledger Fabric i per què funciona d'aquesta manera i no d'una altra manera aquí: Orígens de l'Arquitectura o aquí: Hyperledger Fabric: un sistema operatiu distribuït per a cadenes de blocs autoritzades.

Per tant, Hyperledger Fabric és un sistema realment universal amb el qual podeu:

  • Implementar lògica empresarial arbitrària mitjançant el mecanisme de contracte intel·ligent;
  • Escriure i rebre dades de la base de dades blockchain en format JSON;
  • Concediu i valideu l'accés a l'API mitjançant una autoritat de certificació.

Ara que tenim una mica de les especificitats de Hyperledger Fabric fora del camí, per fi fem alguna cosa útil!

Implantació de la cadena de blocs

Declaració de problemes

La tasca és implementar la xarxa Citcoin amb les següents funcions: crear un compte, obtenir un saldo, reposar un compte, transferir monedes d'un compte a un altre. Dibuixem un model d'objectes, que implementarem en un contracte intel·ligent. Així, tindrem comptes identificats per noms (nom) i que contenen un saldo (saldo) i una llista de comptes. Els comptes i una llista de comptes són en termes d'actius d'Hyperledger Fabric. En conseqüència, tenen una història i un estat actual. Intentaré dibuixar-lo visualment:

Blockchain: què hem de construir un PoC?

Les xifres superiors són l'estat actual, que s'emmagatzema a la base de dades "Estat mundial". A sota hi ha figures que mostren l'historial que s'emmagatzema a la cadena de blocs. L'estat actual dels actius es modifica per les transaccions. L'actiu només canvia en la seva totalitat, de manera que com a resultat de la transacció, es crea un objecte nou i el valor actual de l'actiu passa a l'historial.

IBM Cloud

Creem un compte a núvol d'IBM. Per utilitzar la plataforma blockchain, s'ha d'actualitzar a Pay-As-You-Go. Aquest procés pot no ser ràpid, perquè IBM sol·licita informació addicional i la verifica manualment. En el costat positiu, puc dir que IBM té bons materials de formació que us permeten desplegar Hyperledger Fabric al seu núvol. M'ha agradat la següent sèrie d'articles i exemples:

A continuació es mostren captures de pantalla de la plataforma IBM Blockchain. Aquesta no és una instrucció per crear una cadena de blocs, sinó simplement una demostració de l'abast de la tasca. Per tant, per als nostres propòsits, fem una organització:

Blockchain: què hem de construir un PoC?

Hi creem nodes: Orderer CA, Org1 CA, Orderer Peer:

Blockchain: què hem de construir un PoC?

Comencem usuaris:

Blockchain: què hem de construir un PoC?

Creeu un canal i anomeneu-lo citcoin:

Blockchain: què hem de construir un PoC?

En essència, Channel és una cadena de blocs, de manera que comença des del bloc zero (bloc Genesis):

Blockchain: què hem de construir un PoC?

Redacció d'un contracte intel·ligent

/*
 * 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;

Intuïtivament, tot hauria de quedar clar aquí:

  • Hi ha diverses funcions (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) que el programa de demostració cridarà mitjançant l'API Hyperledger Fabric.
  • Les funcions SendFrom i RefillBalance generen esdeveniments (Event) que rebrà el programa de demostració.
  • La funció d'instanciació es crida una vegada quan s'instancia el contracte intel·ligent. De fet, no es diu una vegada, sinó cada vegada que canvia la versió del contracte intel·ligent. Per tant, inicialitzar una llista amb una matriu buida és una mala idea, perquè ara quan canviem la versió del contracte intel·ligent, perdrem la llista actual. Però res, només estic aprenent).
  • Els comptes i la llista de comptes (comptes) són estructures de dades JSON. JS s'utilitza per a la manipulació de dades.
  • Podeu obtenir el valor actual d'un actiu trucant a la funció getState i actualitzar-lo amb putState.
  • Quan es crea un compte, es crida a la funció AddAccount, en la qual es fa una comparació del nombre màxim de comptes de la cadena de blocs (maxAccounts = 5). I hi ha un brancal (notat?), que porta a un augment infinit del nombre de comptes. S'han d'evitar errors com aquest

A continuació, carreguem el contracte intel·ligent al canal i l'instanciem:

Blockchain: què hem de construir un PoC?

Mirem la transacció per instal·lar l'Smart Contract:

Blockchain: què hem de construir un PoC?

Consulta els detalls del nostre canal:

Blockchain: què hem de construir un PoC?

Com a resultat, obtenim el següent esquema de la xarxa blockchain al núvol d'IBM. També al diagrama hi ha un programa de demostració que s'executa al núvol d'Amazon en un servidor virtual (els detalls al respecte es trobaran a la següent secció):

Blockchain: què hem de construir un PoC?

Creació d'una GUI per a les trucades a l'API d'Hyperledger Fabric

Hyperledger Fabric té una API que es pot utilitzar per:

  • Crear un canal;
  • Connexions entre iguals al canal;
  • Instal·lació i instanciació de contractes intel·ligents al canal;
  • Transaccions de trucades;
  • Sol·licita informació sobre la cadena de blocs.

Desenvolupament d'aplicacions

En el nostre programa de demostració, utilitzarem l'API només per trucar a transaccions i sol·licitar informació, perquè. ja hem fet la resta de passos utilitzant la plataforma blockchain d'IBM. Escrivim una GUI utilitzant la pila de tecnologia estàndard: Express.js + Vue.js + Node.js. Podeu escriure un article separat sobre com començar a crear aplicacions web modernes. Aquí us deixo un enllaç a una sèrie de conferències que més m'han agradat: Aplicació web Full Stack amb Vue.js i Express.js. El resultat és una aplicació client-servidor amb una interfície gràfica familiar a l'estil de Material Design de Google. L'API REST entre client i servidor consta de diverses trucades:

  • HyperledgerDemo/v1/init: inicialitza la cadena de blocs;
  • HyperledgerDemo/v1/accounts/list: obteniu una llista de tots els comptes;
  • HyperledgerDemo/v1/account?name=Bob&balance=100 - crea un compte de Bob;
  • HyperledgerDemo/v1/info?account=Bob - obtenir informació sobre el compte de Bob;
  • HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 - transfereix dues monedes de Bob a Alice;
  • HyperledgerDemo/v1/disconnect: tanqueu la connexió a la cadena de blocs.

Descripció de l'API amb exemples posats Lloc web del carter és un programa conegut per provar l'API HTTP.

Aplicació de demostració al núvol d'Amazon

L'aplicació es va penjar a Amazon, perquè IBM encara no ha pogut actualitzar el meu compte i permetre'm crear servidors virtuals. Com es va adjuntar el domini a la cirera: www.citcoin.info. Mantindré el servidor encès una mica i després l'apagaré, perquè els centaus de lloguer estan degotant i les monedes de citcoin encara no apareixen a la borsa) He posat captures de pantalla de demostració a l'article perquè la lògica del treball sigui clara. L'aplicació de demostració pot:

  • Inicialitzar la cadena de blocs;
  • Creeu un compte (però ara no es pot crear un compte nou, perquè s'ha arribat al nombre màxim de comptes especificat al contracte intel·ligent a la cadena de blocs);
  • Obteniu una llista de comptes;
  • Transfereix monedes citcoin entre Alice, Bob i Alex;
  • Rebre esdeveniments (però ara no hi ha manera de mostrar esdeveniments, així que per senzillesa està escrit a la interfície que els esdeveniments no són compatibles);
  • Registra les accions.

Primer, inicialitzem la cadena de blocs:

Blockchain: què hem de construir un PoC?

A continuació, comencem el nostre compte, no et perdis el saldo:

Blockchain: què hem de construir un PoC?

Tenim una llista de tots els comptes disponibles:

Blockchain: què hem de construir un PoC?

Seleccionem el remitent i el destinatari, obtenim els seus saldos. Si el remitent i el destinatari són els mateixos, el seu compte es reomplirà:

Blockchain: què hem de construir un PoC?

Al registre, controlem l'execució de les transaccions:

Blockchain: què hem de construir un PoC?

De fet, amb un programa de demostració, això és tot. A continuació, podeu veure la nostra transacció a la cadena de blocs:

Blockchain: què hem de construir un PoC?

I la llista general de transaccions:

Blockchain: què hem de construir un PoC?

Amb això, hem completat amb èxit la implementació del PoC per crear la xarxa Citcoin. Què més cal fer per fer de Citcoin una xarxa de transferència de monedes completa? Molt petit:

  • En l'etapa de creació d'un compte, implementeu la generació d'una clau privada / pública. La clau privada l'ha d'emmagatzemar el compte d'usuari, que és públic a la cadena de blocs.
  • Feu una transferència de monedes, en la qual no s'utilitzi un nom, sinó una clau pública per identificar l'usuari.
  • Xifra les transaccions que van de l'usuari al servidor amb la seva clau privada.

Conclusió

Hem implementat la xarxa Citcoin amb les següents funcions: afegir un compte, obtenir un saldo, reposar el vostre compte, transferir monedes d'un compte a un altre. Llavors, què ens va costar construir un PoC?

  • Cal estudiar el blockchain en general i Hyperledger Fabric en particular;
  • Apreneu a utilitzar els núvols d'IBM o d'Amazon;
  • Aprendre el llenguatge de programació JS i algun framework web;
  • Si s'han d'emmagatzemar algunes dades no a la cadena de blocs, sinó en una base de dades separada, apreneu a integrar-vos, per exemple, amb PostgreSQL;
  • I, finalment, però no menys important, sense coneixements de Linux al món modern, enlloc!)

Per descomptat, no ciència de coets, però cal suar!

Fonts a GitHub

Fonts posades GitHub. Breu descripció del repositori:
Catàleg «servidor» - Servidor Node.js
Catàleg «client» - Client Node.js
Catàleg «blockchain» (els valors dels paràmetres i les claus, per descomptat, no funcionen i es donen només per exemple):

  • contracte: font de contracte intel·ligent
  • cartera: claus d'usuari per utilitzar l'API Hyperledger Fabric.
  • *.cds - versions compilades de contractes intel·ligents
  • Fitxers *.json: exemples de fitxers de configuració per utilitzar l'API Hyperledger Fabric

Només és el principi!

Font: www.habr.com

Afegeix comentari