Blockchain: chì PoC duvemu custruisce?

I vostri ochji anu paura è e vostre mani prughjenu !

In l'articuli precedenti, avemu trattatu di e tecnulugii nantu à quale sò custruiti blockchains (Chì duvemu custruisce una blockchain?) è casi chì ponu esse implementati cù u so aiutu (Perchè duvemu custruisce un casu?). Hè ora di travaglià cù e vostre mani! Per implementà i piloti è PoC (Proof of Concept), preferite aduprà i nuvuli, perchè... si ponu accede da ogni locu in u mondu è, spessu, ùn ci hè bisognu di perde u tempu in una stallazione tediosa di l'ambiente, perchè Ci sò cunfigurazioni preset. Allora, facemu qualcosa simplice, per esempiu, una reta per trasfiriri muniti trà i participanti è chjamemu modestamente Bitcoin. Per questu avemu aduprà u cloud IBM è u bluccatu universale Hyperledger Fabric. Prima, avemu capitu perchè Hyperledger Fabric hè chjamatu blockchain universale?

Blockchain: chì PoC duvemu custruisce?

Hyperledger Fabric - un blockchain universale

In generale, un sistema d'informazione universale hè:

  • Un inseme di servitori è un core di software chì eseguisce a logica cummerciale;
  • Interfacce per l'interazzione cù u sistema;
  • Strumenti per a registrazione, l'autentificazione è l'autorizazione di i dispositi / persone;
  • Database chì almacena dati operativi è archiviali:

Blockchain: chì PoC duvemu custruisce?

A versione ufficiale di ciò chì hè Hyperledger Fabric pò esse leghje à situ, è in corta, Hyperledger Fabric hè una piattaforma opensource chì permette di custruisce blockchains privati ​​​​è eseguisce cuntratti intelligenti arbitrarii scritti in i linguaggi di prugrammazione JS è Go. Fighjemu in dettagliu l'architettura di Hyperledger Fabric è assicuratevi chì questu hè un sistema universale chì hà solu specifichi per almacenà è arregistrà dati. A specificità hè chì i dati, cum'è in tutti i blocchi, sò guardati in blocchi chì sò posti nantu à u bloccu solu s'ellu i participanti ghjunghjenu à un cunsensu è dopu avè registratu i dati ùn ponu esse corretti o sguassati in silenziu.

Architettura di Tessuti Hyperledger

U diagramma mostra l'architettura Hyperledger Fabric:

Blockchain: chì PoC duvemu custruisce?

Chiese - l'urganisazioni cuntenenu i pari, i.e. blockchain esiste per via di u sustegnu di l'urganisazioni. Diversi urganisazioni ponu esse parti di u stessu canali.

Channel - una struttura logica chì unisce i pari in gruppi, i.e. u blockchain hè specificatu. Hyperledger Fabric pò processà simultaneamente parechje blockchains cù una logica cummerciale differente.

Fornitore di servizii di membri (MSP) hè una CA (Autorità di Certificazione) per l'emissione di l'identità è l'assignazione di roli. Per creà un node, avete bisognu di interagisce cù u MSP.

Nodi pari - verificate e transazzione, almacenà a blockchain, eseguite cuntratti intelligenti è interagisce cù l'applicazioni. I pari anu una identità (certificatu digitale), chì hè emessu da u MSP. A cuntrariu di a reta di Bitcoin o Etherium, induve tutti i nodi anu uguali diritti, in Hyperledger Fabric i nodi ghjucanu diversi roli:

  • Peer forse pari d'approvazione (EP) è eseguisce cuntratti intelligenti.
  • Cumpagnia di pari (CP) - solu salvà dati in u blockchain è aghjurnà u "Statu di u mondu".
  • Anchor Peer (AP) - se parechje urganisazioni participanu à a blockchain, allora i pari di ancora sò usati per a cumunicazione trà elli. Ogni urganizazione deve avè unu o più peer d'ancora. Utilizendu AP, ogni peer in una urganizazione pò ottene infurmazioni nantu à tutti i pari in altre urganisazioni. Adupratu per sincronizà l'infurmazioni trà AP protocolu gossip.
  • Leader Peer - se una urganizazione hà parechji pari, allura solu u capu di u peer riceverà blocchi da u serviziu di Ordine è dà à u restu di i pari. U capu pò esse specificatu staticamente o sceltu dinamicamente da i pari in l'urganizazione. U protocolu di gossip hè ancu utilizatu per sincronizà l'infurmazioni nantu à i capi.

Assets - entità chì anu valore è sò almacenati nantu à a blockchain. Più specificamente, si tratta di dati chjave-valore in formatu JSON. Hè questa data chì hè arregistrata in u Blockchain. Hanu una storia, chì hè guardatu in u blockchain, è un statu attuale, chì hè guardatu in a basa di dati "World state". Strutture di dati sò pieni arbitrariamente secondu e attività cummerciale. Ùn ci hè micca campi obbligatori, l'unica raccomandazione hè chì l'assi deve avè un pruprietariu è esse preziosi.

Ledger - hè custituitu da a Blockchain è a basa di dati di u Statu Word, chì guarda u statu attuale di l'assi. U statu mundiale usa LevelDB o CouchDB.

Cuntrattu intelligente - cù cuntratti intelligenti, a logica cummerciale di u sistema hè implementata. In Hyperledger Fabric, i cuntratti intelligenti sò chjamati chaincode. Utilizendu u chaincode, l'assi è e transazzione nantu à elli sò specificati. In termini tecnichi, i cuntratti intelligenti sò moduli di software implementati in i linguaggi di prugrammazione JS o Go.

Pulitica di appruvazioni - per ogni chaincode, pudete stabilisce una pulitica nantu à quante cunfirmazioni per una transazzione deve esse aspittatu è da quale. Se a pulitica ùn hè micca stabilita, u predeterminatu hè: "a transazzione deve esse cunfirmata da qualsiasi membru di qualsiasi urganizazione in u canali". Esempii di pulitiche:

  • A transazzione deve esse appruvata da ogni amministratore di l'urganizazione;
  • Deve esse cunfirmatu da ogni membru o cliente di l'urganizazione;
  • Deve esse cunfirmatu da ogni urganizazione di i pari.

serviziu di ordine - imballa transacciones in blocchi è li manda à i pari in u canali. Garantisce a spedizione di missaghji à tutti i pari in a reta. Adupratu per i sistemi industriali Broker di missaghji Kafka, per u sviluppu è a prova solitaria.

CallFlow

Blockchain: chì PoC duvemu custruisce?

  • L'applicazione cumunicà cù Hyperledger Fabric usendu Go, Node.js o Java SDK;
  • U cliente crea una transazzione tx è l'invia à i pari d'endorsing;
  • U Peer verifica a firma di u cliente, compie a transazzione è rinvia a firma di endorsement à u cliente. Chaincode hè eseguitu solu nantu à u peer endorsing, è u risultatu di a so esecuzione hè mandatu à tutti i pari. Stu algoritmu di travagliu hè chjamatu cunsensu PBFT (Practical Byzantine Fault Tolerant). Differisce da BFT classicu u fattu chì u missaghju hè mandatu è a cunferma hè aspittatu micca da tutti i participanti, ma solu da un certu settore;
  • Dopu chì u cliente hà ricivutu u nùmeru di risposti currispundenti à a pulitica di endorsement, manda a transazzione à u serviziu di Ordine;
  • U serviziu di Ordine genera un bloccu è u manda à tutti i pari impegnati. U serviziu d'ordine assicura a registrazione sequenziale di blocchi, chì elimina a chjamata furchetta di ledger (vede a sezione "Forks");
  • I pari ricevenu un bloccu, verificate a pulitica di endorsement di novu, scrivite u bloccu à u blockchain è cambiate u statu in a DB "World state".

Quelli. Questu risultatu in una divisione di roli trà i nodi. Questu assicura chì a blockchain hè scalabile è sicura:

  • I cuntratti intelligenti (chaincode) realizanu l'endorsing peers. Questu assicura a cunfidenziale di cuntratti intelligenti, perchè ùn hè micca guardatu da tutti i participanti, ma solu da i pari di endorsing.
  • L'ordine deve travaglià rapidamente. Questu hè assicuratu da u fattu chì l'Ordine forma solu un bloccu è u manda à un inseme fissu di pari di capu.
  • Cumpagnia di i pari solu guardanu u blockchain - ci ponu esse assai di elli è ùn anu micca bisognu di assai putenza è operazione immediata.

Più dettagli nantu à e soluzioni architettoniche di Hyperledger Fabric è perchè travaglia cusì è micca altrimenti ponu esse truvati quì: Origini di l'architettura o quì: Hyperledger Fabric: Un Sistema Operativu Distribuitu per Blockchains Permessi.

Allora, Hyperledger Fabric hè un sistema veramente universale cù quale pudete:

  • Implementa una logica cummerciale arbitraria utilizendu u mecanismu di cuntrattu intelligenti;
  • Registrate è riceve dati da a basa di dati blockchain in formatu JSON;
  • Concede è verificate l'accessu à l'API cù l'Autorità di Certificazione.

Avà chì avemu capitu un pocu nantu à e specificità di Hyperledger Fabric, facemu infine qualcosa d'utile!

Implantazione di blockchain

Formulazione di u prublema

U compitu hè di implementà a reta di Citcoin cù e seguenti funzioni: creà un contu, uttene un equilibriu, rinfriscà u vostru contu, trasfiriri muniti da un contu à l'altru. Disegnu un mudellu d'ughjettu, chì avemu da implementà in più in un cuntrattu intelligente. Allora, avemu avutu cunti chì sò identificati da nomi è cuntenenu un equilibriu, è una lista di cunti. I cunti è una lista di cunti sò, in quantu à l'assi Hyperledger Fabric. Per quessa, anu una storia è un statu attuale. Pruvaraghju di disegnà questu chjaramente:

Blockchain: chì PoC duvemu custruisce?

I primi figuri sò u statu attuale, chì hè guardatu in a basa di dati "Statu di u mondu". Sottu elli sò figuri chì mostranu a storia chì hè guardata in u blockchain. U statu attuale di l'assi hè cambiatu da e transazzione. L'Asset cambia solu cum'è un sanu, per quessa, in u risultatu di a transazzione, un novu ogettu hè creatu, è u valore attuale di l'asset entra in a storia.

IBM Cloud

Creemu un contu in IBM cloud. Per utilizà a piattaforma blockchain, deve esse aghjurnata à Pay-As-You-Go. Stu prucessu pò esse micca rapidu, perchè ... IBM richiede informazioni supplementari e verifica manualmente. In una nota pusitiva, possu dì chì IBM hà boni materiali di furmazione chì permettenu di implementà Hyperledger Fabric in u so nuvulu. Mi piacia a seguente serie di articuli è esempi:

I seguenti sò screenshots di a piattaforma IBM Blockchain. Questa ùn hè micca una struzzione nantu à cumu creà una blockchain, ma solu una dimostrazione di u scopu di u compitu. Dunque, per i nostri scopi, facemu una Organizazione:

Blockchain: chì PoC duvemu custruisce?

Creemu nodi in questu: Orderer CA, Org1 CA, Orderer Peer:

Blockchain: chì PoC duvemu custruisce?

Creemu utilizatori:

Blockchain: chì PoC duvemu custruisce?

Crea un Canale è chjamate citcoin:

Blockchain: chì PoC duvemu custruisce?

Essenzialmente Channel hè una blockchain, cusì principia cù u bloccu zero (bloccu Genesi):

Blockchain: chì PoC duvemu custruisce?

Scrivite un cuntrattu intelligente

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

Intuitivamente, tuttu deve esse chjaru quì:

  • Ci hè parechje funzioni (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) chì u prugramma demo chjamarà cù l'API Hyperledger Fabric.
  • E funzioni SendFrom è RefillBalance generanu Eventi chì u prugramma demo riceverà.
  • A funzione instantiate hè chjamata una volta quandu un cuntrattu intelligente hè instanziatu. In fatti, hè chjamatu micca solu una volta, ma ogni volta chì a versione di u cuntrattu intelligente cambia. Dunque, l'inizializazione di una lista cù un array viotu hè una mala idea, perchè Avà, quandu cambiamu a versione di u cuntrattu intelligente, perdemu a lista attuale. Ma va bè, sò solu à amparà).
  • I cunti è una lista di cunti sò strutture di dati JSON. JS hè utilizatu per a manipulazione di dati.
  • Pudete ottene u valore attuale di un attivu utilizendu a chjama di a funzione getState, è aghjurnà cù putState.
  • Quandu creanu un Account, a funzione AddAccount hè chjamata, in quale un paragone hè fattu per u massimu di cunti in u blockchain (maxAccounts = 5). E quì ci hè un jamb (avete nutatu?), chì porta à un aumentu infinitu di u numeru di cunti. Tali errori deve esse evitati)

Dopu, carchemu u cuntrattu intelligente in u Canale è l'istanziamu:

Blockchain: chì PoC duvemu custruisce?

Fighjemu a transazzione per installà Smart Contract:

Blockchain: chì PoC duvemu custruisce?

Fighjemu i dettagli nantu à u nostru Canale:

Blockchain: chì PoC duvemu custruisce?

In u risultatu, avemu u schema seguente di una reta di blockchain in u cloud IBM. U diagramma mostra ancu un prugramma demo in esecuzione in u nuvulu Amazon nantu à un servitore virtuale (più nantu à questu in a sezione dopu):

Blockchain: chì PoC duvemu custruisce?

Creazione di una GUI per e chiamate API Hyperledger Fabric

Hyperledger Fabric hà una API chì pò esse usata per:

  • Crea un canale;
  • Cunnessioni peer to channel;
  • Installazione è istanza di cuntratti intelligenti in u canali;
  • transazzione di chjama;
  • Richiede infurmazione nantu à u blockchain.

Sviluppu di l'applicazioni

In u nostru prugramma demo avemu aduprà l'API solu per chjamà transacciones è dumandà infurmazione, perchè Avemu digià cumpletu i passi rimanenti utilizendu a piattaforma IBM blockchain. Scrivemu una GUI cù una pila di tecnulugia standard: Express.js + Vue.js + Node.js. Pudete scrive un articulu separatu nantu à cumu cumincià à creà applicazioni web muderni. Quì lasceraghju un ligame à a serie di cunferenze chì mi piacenu di più: Full Stack Web App utilizendu Vue.js & Express.js. U risultatu hè una applicazione cliente-servitore cù una interfaccia grafica familiar in u stilu di Material Design di Google. L'API REST trà u cliente è u servitore hè custituitu da parechje chjamate:

  • HyperledgerDemo/v1/init - inizializza a blockchain;
  • HyperledgerDemo/v1/accounts/list - uttene una lista di tutti i cunti;
  • HyperledgerDemo/v1/account?name=Bob&balance=100 - crea un contu Bob;
  • HyperledgerDemo/v1/info?account=Bob - uttene infurmazione nantu à u contu Bob;
  • HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 - trasferisce dui muniti da Bob à Alice;
  • HyperledgerDemo/v1/disconnect - chjude a cunnessione à a blockchain.

Descrizzione di l'API cù esempi inclusi in U situ di u postmanu - un prugramma ben cunnisciutu per pruvà l'API HTTP.

Applicazione demo in Amazon cloud

Aghju caricatu l'applicazione in Amazon perchè ... IBM ùn hà ancu pussutu aghjurnà u mo contu è permette di creà servitori virtuali. Cumu aghjunghje una cirasa à u duminiu: www.citcoin.info. Manteneraghju u servitore per un pocu tempu, poi spegneraghju, perchè... centesimi in affittu sò dripping, è e muniti di citcoin ùn sò ancu listati nantu à a borsa) Aghju cumpresu screenshots di a demo in l'articulu per chì a logica di u travagliu hè chjaru. L'applicazione demo pò:

  • Inizializà u blockchain;
  • Crea un Account (ma avà ùn pudete micca creà un novu Account, perchè u numeru massimu di cunti specificati in u cuntrattu intelligente hè statu righjuntu in u blockchain);
  • Riceve una lista di cunti;
  • Trasferite muniti citcoin trà Alice, Bob è Alex;
  • Riceve l'avvenimenti (ma avà ùn ci hè micca manera di mustrà l'avvenimenti, cusì per simplicità l'interfaccia dice chì l'avvenimenti ùn sò micca supportati);
  • Azzioni di log.

Prima avemu inizializatu a blockchain:

Blockchain: chì PoC duvemu custruisce?

Dopu, creemu u nostru contu, ùn perde micca u tempu cù u saldu:

Blockchain: chì PoC duvemu custruisce?

Avemu una lista di tutti i cunti dispunibili:

Blockchain: chì PoC duvemu custruisce?

Selezziemu u mittente è u destinatariu, è uttene u so saldi. Se u mittente è u destinatariu sò listessi, u so contu serà rimbursatu:

Blockchain: chì PoC duvemu custruisce?

In u logu monitoremu l'esekzione di e transazzione:

Blockchain: chì PoC duvemu custruisce?

In verità, questu hè tuttu cù u prugramma demo. Quì sottu pudete vede a nostra transazzione in u blockchain:

Blockchain: chì PoC duvemu custruisce?

È a lista generale di transacciones:

Blockchain: chì PoC duvemu custruisce?

Cù questu, avemu finitu successu l'implementazione di u PoC per creà a reta Citcoin. Chì altru ci vole à fà per Citcoin per diventà una reta cumpleta per u trasferimentu di muniti? Assai pocu:

  • In u stadiu di creazione di u contu, implementà a generazione di una chjave privata / publica. A chjave privata deve esse guardata cù l'utilizatore di u contu, a chjave publica deve esse guardata in u blockchain.
  • Fate un trasferimentu di munita in quale una chjave publica, invece di un nome, hè utilizata per identificà l'utilizatore.
  • Cifrate e transacciones chì passanu da l'utilizatore à u servitore cù a so chjave privata.

cunchiusioni

Avemu implementatu a reta di Citcoin cù e seguenti funzioni: aghjunghje un contu, uttene un equilibriu, rinfriscà u vostru contu, trasferisce muniti da un contu à l'altru. Allora, chì ci hà costu per custruisce un PoC?

  • Avete bisognu di studià blockchain in generale è Hyperledger Fabric in particulare;
  • Amparate à utilizà IBM o Amazon clouds;
  • Amparate a lingua di prugrammazione JS è qualchì framework web;
  • Se certi dati deve esse guardatu micca in u blockchain, ma in una basa di dati separata, allora amparà à integrà, per esempiu, cù PostgreSQL;
  • È l'ultimu ma micca menu - ùn pudete micca campà in u mondu mudernu senza cunniscenze di Linux!)

Di sicuru, ùn hè micca a scienza rocket, ma avete da travaglià dura!

Fonti nantu à GitHub

I fonti messi nantu GitHub. Breve descrizzione di u repository:
catalogu «servore» — Servitore Node.js
catalogu «cliente» — Client Node.js
catalogu «blockchain"(I valori di i paràmetri è i chjavi, sicuru, ùn sò micca funzionanti è sò dati solu cum'è un esempiu):

  • cuntrattu - codice surghjente smart contract
  • wallet - chjavi d'utilizatore per aduprà l'API Hyperledger Fabric.
  • *.cds - versioni compilati di cuntratti intelligenti
  • *.json files - esempi di schedarii di cunfigurazione per utilizà l'API Hyperledger Fabric

Hè solu u principiu !

Source: www.habr.com

Add a comment