Blockchain: zer PoC eraiki behar dugu?

Zure begiak beldur dira eta zure eskuak azkura!

Aurreko artikuluetan, blockchains eraikitzen diren teknologiak jorratu genituen (Zer eraiki behar dugu blockchain bat?) eta haien laguntzarekin gauzatu daitezkeen kasuak (Zergatik eraiki behar dugu kasu bat?). Eskuekin lan egiteko ordua da! Pilotuak eta PoC (Proof of Concept) ezartzeko, nahiago dut hodeiak erabili, izan ere... munduko edozein lekutatik sar daitezke eta, askotan, ez da denborarik galdu behar ingurunearen instalazio neketsuetan, izan ere Aurrez ezarritako konfigurazioak daude. Beraz, egin dezagun zerbait sinplea, adibidez, parte-hartzaileen artean txanponak transferitzeko sarea eta dei diezaiogun xumeki Bitcoin. Horretarako IBM hodeia eta Hyperledger Fabric blockchain unibertsala erabiliko ditugu. Lehenik eta behin, ikus dezagun zergatik Hyperledger Fabric deitzen den bloke unibertsala?

Blockchain: zer PoC eraiki behar dugu?

Hyperledger Fabric - blockchain unibertsala

Orokorrean, informazio sistema unibertsala hau da:

  • Negozio-logika egiten duen zerbitzari multzoa eta software-nukleoa;
  • Sistemarekin interakziorako interfazeak;
  • Gailuak/pertsonak erregistratzeko, autentifikatzeko eta baimentzeko tresnak;
  • Datu operatiboak eta artxiboak gordetzen dituen datu-basea:

Blockchain: zer PoC eraiki behar dugu?

Hyperledger Fabric denaren bertsio ofiziala hemen irakur daiteke Online, eta laburbilduz, Hyperledger Fabric kode irekiko plataforma bat da, bloke pribatuak eraikitzeko eta JS eta Go programazio lengoaietan idatzitako kontratu adimentsu arbitrarioak exekutatzeko aukera ematen duena. Ikus dezagun zehatz-mehatz Hyperledger Fabric-en arkitektura eta ziurtatu datuak gordetzeko eta grabatzeko berezitasunak soilik dituen sistema unibertsala dela. Berezitasuna da datuak, bloke-kate guztietan bezala, bloke-katean jartzen diren blokeetan gordetzen direla parte-hartzaileek adostasuna lortzen badute eta datuak erregistratu ondoren ezin direla isil-isilik zuzendu edo ezabatu.

Hyperledger ehun arkitektura

Diagramak Hyperledger Fabric arkitektura erakusten du:

Blockchain: zer PoC eraiki behar dugu?

Erakundeak β€” erakundeek parekideak dituzte, hau da. blockchain erakundeen laguntza dela eta existitzen da. Erakunde desberdinak kanal bereko parte izan daitezke.

Channel β€” parekoak taldeetan batzen dituen egitura logikoa, hau da. blockchain zehazten da. Hyperledger Fabric-ek hainbat bloke-kate prozesatu ditzake aldi berean negozio-logika ezberdinekin.

Bazkide Zerbitzuen Hornitzailea (MSP) identitatea emateko eta rolak esleitzeko CA (Certificate Authority) bat da. Nodo bat sortzeko, MSP-rekin elkarreragin behar duzu.

Pareko nodoak β€” transakzioak egiaztatu, bloke-katea gorde, kontratu adimendunak gauzatu eta aplikazioekin elkarreragin. Parekideek identitate bat dute (ziurtagiri digitala), MSPk ematen duena. Bitcoin edo Etherium sarean ez bezala, non nodo guztiek eskubide berdinak dituzten, Hyperledger Fabric-en nodoek rol desberdinak betetzen dituzte:

  • Parekidea agian parekidearen onarpena (EP) eta kontratu adimendunak gauzatu.
  • Parekidea konprometituz (CP) - bakarrik gorde datuak bloke-katean eta eguneratu "Munduko egoera".
  • Anchor Peer (AP) - Hainbat erakundek bloke-katean parte hartzen badute, aingura-pareak erabiltzen dira haien arteko komunikaziorako. Erakunde bakoitzak aingura-parekide bat edo gehiago izan behar ditu. AP erabiliz, erakunde bateko edozein kidek beste erakundeetako kide guztiei buruzko informazioa lor dezake. APen arteko informazioa sinkronizatzeko erabiltzen da esamesak protokoloa.
  • Liderra parekidea β€” Erakunde batek hainbat parekide baditu, parekidearen liderrak bakarrik jasoko ditu Agindu zerbitzuaren blokeak eta gainerako kideei emango dizkie. Liderra era estatiko edo dinamikoki hauta dezakete erakundeko kideek. Esamesen protokoloa liderrei buruzko informazioa sinkronizatzeko ere erabiltzen da.

Aktibo β€” balioa duten eta bloke-katean gordetzen diren entitateak. Zehazkiago, gako-balioaren datuak dira JSON formatuan. Datu hori da Blockchain-en erregistratzen dena. Historia bat dute, bloke-katean gordetzen dena, eta egungo egoera bat, "Munduko egoera" datu-basean gordetzen dena. Datu-egiturak modu arbitrarioan betetzen dira negozio-zereginen arabera. Ez dago derrigorrezko eremurik, gomendio bakarra aktiboek jabea izan behar dutela eta baliotsuak izan behar dute.

Ledger β€” Blockchain eta Word egoera datu-baseak osatzen dute, aktiboen egungo egoera gordetzen duena. Munduko estatuak LevelDB edo CouchDB erabiltzen ditu.

Kontratu adimenduna β€” kontratu adimendunak erabiliz, sistemaren negozio-logika ezartzen da. Hyperledger Fabric-en, kontratu adimendunak chaincode deitzen dira. Chaincode erabiliz, horien gaineko aktibo eta transakzioak zehazten dira. Termino teknikoetan, smart contracts JS edo Go programazio lengoaietan inplementatutako software moduluak dira.

Onarpen-politika β€” Chaincode bakoitzeko, transakzio baterako zenbat berrespen espero behar diren eta norengandik zehaztutako politika ezar dezakezu. Politika ezartzen ez bada, lehenetsia hau da: "transakzioa kanaleko edozein erakundetako edozein kidek baieztatu behar du". Politiken adibideak:

  • Eragiketak erakundeko edozein administratzailek onartu beharko du;
  • Erakundeko edozein kide edo bezerok baieztatu behar du;
  • Edozein erakunde parekidek baieztatu behar dute.

Eskaera zerbitzua β€” Transakzioak blokeetan biltzen ditu eta kanaleko kideei bidaltzen dizkie. Sareko kide guztiei mezuak bidaltzea bermatzen du. Sistema industrialetarako erabiltzen da Kafka mezu-artekaria, garatzeko eta probatzeko Solo.

CallFlow

Blockchain: zer PoC eraiki behar dugu?

  • Aplikazioa Hyperledger Fabric-ekin komunikatzen da Go, Node.js edo Java SDK erabiliz;
  • Bezeroak tx transakzio bat sortzen du eta parekideei bidaltzen die;
  • Peer-ek bezeroaren sinadura egiaztatzen du, transakzioa osatzen du eta abal-sinadura itzultzen dio bezeroari. Chaincode abalaren parekidean bakarrik exekutatzen da, eta bere exekuzioaren emaitza parekide guztiei bidaltzen zaie. Lan-algoritmo honi PBFT (Practical Byzantine Fault Tolerant) adostasuna deritzo. Ezberdina da BFT klasikoa mezua bidaltzen dela eta berrespena espero dela ez parte-hartzaile guztiengandik, multzo jakin batetik baizik;
  • Bezeroak abal-politikari dagozkion erantzun kopurua jaso ondoren, transakzioa Eskaera zerbitzura bidaltzen du;
  • Eskaera zerbitzuak bloke bat sortzen du eta parekide guztiei bidaltzen die. Eskaera-zerbitzuak blokeen erregistro sekuentziala bermatzen du, eta horrek liburuko sardexka deritzona ezabatzen du (ikusi "Sideak" atala);
  • Ikaskideek bloke bat jasotzen dute, egiaztatu berriro onarpen-politika, idatzi blokea bloke-katean eta aldatu egoera "Munduko egoera" DB-n.

Horiek. Horrek nodoen arteko rolak banatzea eragiten du. Horrek bloke-katea eskalagarria eta segurua dela ziurtatzen du:

  • Kontratu adimendunek (chaincode) parekideak onartzen dituzte. Horrek kontratu adimendunen konfidentzialtasuna bermatzen du, zeren parte-hartzaile guztiek ez dute gordetzen, kideen abalak bakarrik baizik.
  • Eskaerak azkar funtzionatu behar du. Hori bermatzen du Ordenatzeak bloke bat osatzen duela eta lider pareko multzo finko batera bidaltzen duelako.
  • Parekideek blokeo-katea soilik gordetzen dute; horietako asko egon daitezke eta ez dute potentzia eta berehalako funtzionamendu handirik behar.

Hyperledger Fabric-en soluzio arkitektonikoei buruzko xehetasun gehiago eta zergatik funtzionatzen duen horrela eta ez bestela hemen aurki daitezke: Arkitektura Jatorria edo hemen: Hyperledger Fabric: Baimendutako Blockchainsentzako sistema eragile banatua.

Beraz, Hyperledger Fabric benetan sistema unibertsala da eta honekin:

  • Negozio logika arbitrarioa ezartzea smart contract mekanismoa erabiliz;
  • Grabatu eta jaso blockchain datu-baseko datuak JSON formatuan;
  • Eman eta egiaztatu API sarbidea Autoritate Ziurtagiriaren bidez.

Orain Hyperledger Fabric-en zehaztasunei buruz pixka bat ulertzen dugunean, egin dezagun azkenean zerbait erabilgarria!

Blockchain-a zabaltzea

Arazoaren formulazioa

Eginkizuna Citcoin sarea ezartzea da funtzio hauekin: kontu bat sortu, saldo bat lortu, zure kontua kargatu, txanponak kontu batetik bestera transferitu. Marraz dezagun objektu-eredu bat, kontratu adimendun batean gehiago ezarriko duguna. Beraz, izenekin identifikatu eta balantzea duten kontuak eta kontuen zerrenda bat izango ditugu. Kontuak eta kontuen zerrenda Hyperledger Fabric aktiboak dira. Horren arabera, historia eta egungo egoera dute. Hau argi marrazten saiatuko naiz:

Blockchain: zer PoC eraiki behar dugu?

Goiko zifrak egungo egoera dira, "Munduko egoera" datu-basean gordetzen dena. Horien azpian bloke-katean gordetzen den historia erakusten duten irudiak daude. Aktiboen egungo egoera transakzioen arabera aldatzen da. Aktiboa osotasunean bakarrik aldatzen da, beraz, transakzioaren ondorioz, objektu berri bat sortzen da eta aktiboaren egungo balioa historian sartzen da.

IBM Cloud

Kontu bat sortzen dugu IBM hodeia. Blockchain plataforma erabiltzeko, Pay-As-You-Go-ra berritu behar da. Prozesu hau ez da azkarra izango, izan ere... IBMk informazio gehigarria eskatzen du eta eskuz egiaztatzen du. Ohar positiboan, esan dezaket IBMk prestakuntza-material onak dituela bere hodeian Hyperledger Fabric zabaltzea ahalbidetzen dizutena. Honako artikulu eta adibide sorta hau gustatu zait:

Honako hauek IBM Blockchain plataformaren pantaila-argazkiak dira. Hau ez da blockchain bat sortzeko argibide bat, zereginaren irismenaren erakustaldia baizik. Beraz, gure helburuetarako, Erakunde bat egiten dugu:

Blockchain: zer PoC eraiki behar dugu?

Nodoak sortzen ditugu bertan: Orderer CA, Org1 CA, Orderer Peer:

Blockchain: zer PoC eraiki behar dugu?

Erabiltzaileak sortzen ditugu:

Blockchain: zer PoC eraiki behar dugu?

Sortu kanal bat eta deitu citcoin:

Blockchain: zer PoC eraiki behar dugu?

Funtsean Channel bloke-kate bat da, beraz, zero blokearekin hasten da (Genesis blokea):

Blockchain: zer PoC eraiki behar dugu?

Smart Contract bat idaztea

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

Intuitiboki, dena argi egon behar da hemen:

  • Hainbat funtzio daude (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) demo programak Hyperledger Fabric APIa erabiliz deituko dituena.
  • SendFrom eta RefillBalance funtzioek demo programak jasoko dituen Gertaerak sortzen dituzte.
  • Instantziazio funtzioari behin deitzen zaio kontratu adimendun bat instantziatzean. Izan ere, behin bakarrik ez, kontratu adimendunaren bertsioa aldatzen den bakoitzean deitzen da. Hori dela eta, matrize huts batekin zerrenda bat hasieratzea ideia txarra da, zeren Orain, kontratu adimendunaren bertsioa aldatzen dugunean, uneko zerrenda galduko dugu. Baina ondo dago, ikasten ari naiz).
  • Kontuak eta kontuen zerrenda JSON datu-egiturak dira. JS datuak manipulatzeko erabiltzen da.
  • Aktibo baten egungo balioa getState funtzio-deia erabiliz lor dezakezu eta putState erabiliz eguneratu.
  • Kontu bat sortzean, AddAccount funtzioa deitzen da, eta bertan konparazio bat egiten da bloke-katearen gehienezko kontu kopuruarekin (maxAccounts = 5). Eta hemen bada jaba bat (konturatu al zara?), kontuen kopurua amaigabea handitzea dakar. Horrelako akatsak saihestu behar dira)

Ondoren, kontratu adimenduna kanalean kargatzen dugu eta instantziatuko dugu:

Blockchain: zer PoC eraiki behar dugu?

Ikus dezagun Smart Contract instalatzeko transakzioa:

Blockchain: zer PoC eraiki behar dugu?

Ikus ditzagun gure kanalari buruzko xehetasunak:

Blockchain: zer PoC eraiki behar dugu?

Ondorioz, IBM hodeian blockchain sare baten hurrengo diagrama lortuko dugu. Diagramak Amazon hodeian exekutatzen den demo programa bat ere erakusten du zerbitzari birtualean (horri buruz gehiago hurrengo atalean):

Blockchain: zer PoC eraiki behar dugu?

Hyperledger Fabric API deietarako GUI bat sortzea

Hyperledger Fabric-ek API bat du, hau egiteko erabil daitekeen:

  • Sortu kanala;
  • Konexioak kanalera;
  • Kontratu adimendunen instalazioa eta instantziazioa kanalean;
  • Dei-transakzioak;
  • Eskatu informazioa blockchain-en.

Aplikazioen garapena

Gure demo programan APIa transakzioetara deitzeko eta informazioa eskatzeko soilik erabiliko dugu, zeren Dagoeneko amaitu ditugu gainerako urratsak IBM blockchain plataforma erabiliz. GUI bat idazten dugu teknologia pila estandarra erabiliz: Express.js + Vue.js + Node.js. Aparteko artikulu bat idatzi dezakezu web aplikazio modernoak sortzen hasteko. Hemen utziko dut gehien gustatu zaidan hitzaldi sortaren esteka: Full Stack Web App Vue.js eta Express.js erabiliz. Emaitza bezero-zerbitzariko aplikazio bat da, Google-ren Material Design estiloko interfaze grafiko ezaguna duena. Bezeroaren eta zerbitzariaren arteko REST APIak hainbat dei ditu:

  • HyperledgerDemo/v1/init - hasieratu bloke-katea;
  • HyperledgerDemo/v1/accounts/list β€” lortu kontu guztien zerrenda;
  • HyperledgerDemo/v1/account?name=Bob&balance=100 β€” sortu Bob kontua;
  • HyperledgerDemo/v1/info?account=Bob β€” lortu Bob kontuari buruzko informazioa;
  • HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 β€” transferitu bi txanpon Bob-etik Alicera;
  • HyperledgerDemo/v1/disconnect - itxi bloke-katearen konexioa.

APIaren deskribapena, adibideekin Postari webgunea - HTTP APIa probatzeko programa ezaguna.

Demo aplikazioa Amazon hodeian

Aplikazioa Amazonera igo dut zeren... IBMk oraindik ezin izan du nire kontua berritu eta zerbitzari birtualak sortzeko baimena eman dit. Nola gehitu gerezi bat domeinuari: www.citcoin.info. Zerbitzaria pixka bat piztuta edukiko dut, gero itzali, zeren... Alokairuko zentimoak tantaka ari dira, eta citcoin txanponak oraindik ez daude burtsan kotizatzen) Demoaren pantaila-argazkiak sartzen ari naiz artikuluan, lanaren logika argia izan dadin. Demo aplikazioak honako hauek egin ditzake:

  • Hasieratu blockchain-a;
  • Sortu Kontu bat (baina orain ezin duzu Kontu berririk sortu, kontratu adimendunean zehaztutako gehienezko kontu kopurura iritsi delako bloke-katean);
  • Jaso Kontuen zerrenda;
  • Transferitu citcoin txanponak Alice, Bob eta Alexen artean;
  • Gertaerak jaso (baina orain ez dago gertaerak erakusteko modurik, beraz, sinpletasunerako, interfazeak dio gertaerak ez direla onartzen);
  • Erregistratu ekintzak.

Lehenik eta behin blockchain-a abiarazten dugu:

Blockchain: zer PoC eraiki behar dugu?

Ondoren, gure kontua sortzen dugu, ez galdu denbora saldoarekin:

Blockchain: zer PoC eraiki behar dugu?

Eskuragarri dauden kontu guztien zerrenda jasoko dugu:

Blockchain: zer PoC eraiki behar dugu?

Bidaltzailea eta hartzailea hautatzen ditugu, eta haien saldoak lortzen ditugu. Bidaltzailea eta hartzailea berdinak badira, bere kontua beteko da:

Blockchain: zer PoC eraiki behar dugu?

Erregistroan transakzioen exekuzioa kontrolatzen dugu:

Blockchain: zer PoC eraiki behar dugu?

Egia esan, hori guztia demo programarekin. Jarraian gure transakzioa ikus dezakezu blockchain-en:

Blockchain: zer PoC eraiki behar dugu?

Eta transakzioen zerrenda orokorra:

Blockchain: zer PoC eraiki behar dugu?

Honekin, Citcoin sarea sortzeko PoC-aren ezarpena arrakastaz amaitu dugu. Zer gehiago egin behar da Citcoin txanponak transferitzeko sare osoa bihur dadin? Oso gutxi:

  • Kontua sortzeko fasean, inplementatu gako pribatu/publiko baten sorrera. Gako pribatua kontuaren erabiltzailearekin gorde behar da, gako publikoa blokean gorde behar da.
  • Txanpon-transferentzia bat egin eta bertan gako publiko bat erabiltzen den, izen bat baino, erabiltzailea identifikatzeko.
  • Erabiltzailetik zerbitzarira doazen transakzioak bere gako pribatuarekin enkriptatu.

Ondorioa

Funtzio hauekin ezarri dugu Citcoin sarea: kontu bat gehitu, saldo bat lortu, zure kontua kargatu, txanponak kontu batetik bestera transferitu. Beraz, zer kostatu zitzaigun PoC bat eraikitzea?

  • Blockchain orokorrean eta Hyperledger Fabric bereziki aztertu behar dituzu;
  • Ikasi IBM edo Amazon hodeiak erabiltzen;
  • Ikasi JS programazio-lengoaia eta web-esparru batzuk;
  • Datu batzuk ez blokeo-katean gorde behar badira, datu-base bereizi batean baizik, ikasi, adibidez, PostgreSQL-rekin integratzen;
  • Eta azkenik, ezin da mundu modernoan bizi Linux-en ezagutzarik gabe!)

Noski, ez da kohete zientzia, baina gogor lan egin beharko duzu!

GitHub-eko iturriak

Iturriak jarri GitHub. Biltegiaren deskribapen laburra:
Katalogoa Β«zerbitzariaΒ» β€” Node.js zerbitzaria
Katalogoa Β«bezeroaΒ» β€” Node.js bezeroa
Katalogoa Β«blockchain"(Parametroen balioak eta gakoak, noski, ez dira funtzionatzen eta adibide gisa soilik ematen dira):

  • kontratua β€” smart contract iturburu kodea
  • zorroa - Hyperledger Fabric APIa erabiltzeko erabiltzailearen gakoak.
  • *.cds - kontratu adimendunen bertsio konpilatuak
  • *.json fitxategiak - Hyperledger Fabric APIa erabiltzeko konfigurazio fitxategien adibideak

Hasiera besterik ez da!

Iturria: www.habr.com

Gehitu iruzkin berria