Blockchain: kādu PoC mums vajadzētu izveidot?

Tavas acis baidās un rokas niez!

IepriekŔējos rakstos mēs runājām par tehnoloÄ£ijām, uz kurām tiek veidotas blokķēdes (Ko mums vajadzētu izveidot blokķēdi?) un gadÄ«jumi, kurus var Ä«stenot ar viņu palÄ«dzÄ«bu (Kāpēc mums vajadzētu veidot lietu?). Ir pienācis laiks strādāt ar savām rokām! Pilotu un PoC (Proof of Concept) ievieÅ”anai es dodu priekÅ”roku mākoņiem, jo... tiem var piekļūt no jebkuras vietas pasaulē, un bieži vien nav jātērē laiks nogurdinoÅ”ai vides iekārtoÅ”anai, jo Ir iepriekÅ” iestatÄ«tas konfigurācijas. Tātad, izveidosim kaut ko vienkārÅ”u, piemēram, tÄ«klu monētu pārsÅ«tÄ«Å”anai starp dalÄ«bniekiem un pieticÄ«gi sauksim to par Bitcoin. Å im nolÅ«kam izmantosim IBM mākoni un universālo blokķēdes Hyperledger Fabric. Pirmkārt, izdomāsim, kāpēc Hyperledger Fabric tiek saukts par universālu blokķēdi?

Blockchain: kādu PoC mums vajadzētu izveidot?

Hyperledger Fabric ā€“ universāla blokķēde

Vispārīgi runājot, universāla informācijas sistēma ir:

  • Serveru komplekts un programmatÅ«ras kodols, kas veic biznesa loÄ£iku;
  • Saskarnes mijiedarbÄ«bai ar sistēmu;
  • Ierīču/personu reÄ£istrācijas, autentifikācijas un autorizācijas rÄ«ki;
  • Datu bāze, kurā glabājas operatÄ«vie un arhÄ«va dati:

Blockchain: kādu PoC mums vajadzētu izveidot?

Oficiālo versiju par to, kas ir Hyperledger Fabric, var izlasÄ«t vietnē TieÅ”saistē, un Ä«si sakot, Hyperledger Fabric ir atvērtā pirmkoda platforma, kas ļauj izveidot privātas blokķēdes un izpildÄ«t patvaļīgus viedos lÄ«gumus, kas rakstÄ«ti JS un Go programmÄ“Å”anas valodās. SÄ«kāk apskatÄ«sim Hyperledger Fabric arhitektÅ«ru un pārliecināsimies, ka Ŕī ir universāla sistēma, kurai ir tikai datu uzglabāŔanas un ierakstÄ«Å”anas specifika. KonkrētÄ«ba ir tāda, ka dati, tāpat kā visās blokķēdēs, tiek glabāti blokos, kas tiek ievietoti blokķēdē tikai tad, ja dalÄ«bnieki panāk konsensu un pēc ierakstÄ«Å”anas datus nevar klusi izlabot vai dzēst.

Hyperledger audumu arhitektūra

Diagramma parāda Hyperledger Fabric arhitektūru:

Blockchain: kādu PoC mums vajadzētu izveidot?

Organizācijas ā€” organizācijas satur vienaudžus, t.i. blokķēde pastāv, pateicoties organizāciju atbalstam. Viena kanāla daļa var bÅ«t dažādas organizācijas.

kanāls ā€” loÄ£iska struktÅ«ra, kas apvieno vienaudžus grupās, t.i. ir norādÄ«ta blokķēde. Hyperledger Fabric var vienlaicÄ«gi apstrādāt vairākas blokķēdes ar atŔķirÄ«gu biznesa loÄ£iku.

DalÄ«bas pakalpojumu sniedzējs (MSP) ir CA (sertifikācijas iestāde) identitātes izsniegÅ”anai un lomu pieŔķirÅ”anai. Lai izveidotu mezglu, jums ir jāsadarbojas ar MSP.

Vienādranga mezgli ā€” pārbaudÄ«t darÄ«jumus, uzglabāt blokķēdi, izpildÄ«t viedos lÄ«gumus un mijiedarboties ar lietojumprogrammām. Vienaudžiem ir identitāte (digitālais sertifikāts), ko izsniedz MSP. AtŔķirÄ«bā no Bitcoin vai Etherium tÄ«kla, kur visiem mezgliem ir vienādas tiesÄ«bas, Hyperledger Fabric mezgliem ir dažādas lomas:

  • VarbÅ«t lÄ«dzinieks atbalstot lÄ«dziniekus (EP) un izpildÄ«t viedos lÄ«gumus.
  • ApņēmÄ«gs lÄ«dzinieks (CP) - saglabājiet datus tikai blokķēdē un atjauniniet ā€œPasaules stāvokliā€.
  • Enkura Pērs (AP) - ja blokķēdē piedalās vairākas organizācijas, tad saziņai starp tām tiek izmantoti enkura partneri. Katrai organizācijai ir jābÅ«t vienam vai vairākiem enkura partneriem. Izmantojot AP, jebkurÅ” organizācijas lÄ«dzinieks var iegÅ«t informāciju par visiem vienaudžiem citās organizācijās. Izmanto, lai sinhronizētu informāciju starp AP tenku protokols.
  • LÄ«deris Pērs ā€” ja organizācijai ir vairāki lÄ«dzinieki, tad tikai lÄ«dzinieka vadÄ«tājs saņems blokus no PasÅ«tÄ«Å”anas dienesta un izsniegs pārējiem lÄ«dziniekiem. LÄ«deri var norādÄ«t statiski vai dinamiski atlasÄ«t organizācijas vienaudži. Tenku protokols tiek izmantots arÄ«, lai sinhronizētu informāciju par lÄ«deriem.

AktÄ«vi ā€” entÄ«tijas, kurām ir vērtÄ«ba un kuras tiek glabātas blokķēdē. Konkrētāk, tie ir atslēgas vērtÄ«bas dati JSON formātā. TieÅ”i Å”ie dati tiek ierakstÄ«ti Blockchain. Viņiem ir vēsture, kas tiek saglabāta blokķēdē, un paÅ”reizējais stāvoklis, kas tiek saglabāts datu bāzē ā€œPasaules stāvoklisā€. Datu struktÅ«ras tiek aizpildÄ«tas patvaļīgi atkarÄ«bā no biznesa uzdevumiem. Obligātie lauki nav aizpildÄ«ti, vienÄ«gais ieteikums ir, ka Ä«paÅ”umiem ir jābÅ«t Ä«paÅ”niekam un tiem jābÅ«t vērtÄ«giem.

virsgrāmata ā€” sastāv no Blockchain un Word stāvokļa datu bāzes, kurā tiek glabāts paÅ”reizējais aktÄ«vu stāvoklis. Pasaules valsts izmanto LevelDB vai CouchDB.

Gudrs lÄ«gums ā€” izmantojot viedos lÄ«gumus, tiek realizēta sistēmas biznesa loÄ£ika. Programmā Hyperledger Fabric viedos lÄ«gumus sauc par ķēdes kodu. Izmantojot ķēdes kodu, tiek norādÄ«ti aktÄ«vi un darÄ«jumi ar tiem. Tehniskā ziņā viedie lÄ«gumi ir programmatÅ«ras moduļi, kas ieviesti JS vai Go programmÄ“Å”anas valodās.

ApstiprināŔanas politika ā€” katram ķēdes kodam var iestatÄ«t politiku, cik darÄ«juma apstiprinājumi jāsagaida un no kā. Ja politika nav iestatÄ«ta, noklusējuma vērtÄ«ba ir: ā€œdarÄ«jums ir jāapstiprina jebkuram kanāla organizācijas dalÄ«bniekamā€. Politiku piemēri:

  • DarÄ«jums jāapstiprina jebkuram organizācijas administratoram;
  • Jāapstiprina jebkuram organizācijas biedram vai klientam;
  • Jāapstiprina jebkurai lÄ«dzvērtÄ«gai organizācijai.

PasÅ«tÄ«Å”anas pakalpojums ā€” iesaiņo darÄ«jumus blokos un nosÅ«ta tos kanāla vienaudžiem. Garantē ziņojumu piegādi visiem vienaudžiem tÄ«klā. Izmanto rÅ«pnieciskām sistēmām Kafka ziņojumu brokeris, izstrādei un testÄ“Å”anai Viens.

CallFlow

Blockchain: kādu PoC mums vajadzētu izveidot?

  • Lietojumprogramma sazinās ar Hyperledger Fabric, izmantojot Go, Node.js vai Java SDK;
  • Klients izveido tx transakciju un nosÅ«ta to apstiprinoÅ”ajiem vienaudžiem;
  • Peer pārbauda klienta parakstu, pabeidz darÄ«jumu un nosÅ«ta apstiprinājuma parakstu atpakaļ klientam. Ķēdes kods tiek izpildÄ«ts tikai apstiprinoÅ”ajā vienādrangā, un tā izpildes rezultāts tiek nosÅ«tÄ«ts visiem vienaudžiem. Å o darba algoritmu sauc par PBFT (Praktiskā Bizantijas kļūdu izturÄ«gā) konsensu. AtŔķiras no klasiskais BFT tas, ka ziņojums tiek nosÅ«tÄ«ts un apstiprinājums tiek gaidÄ«ts nevis no visiem dalÄ«bniekiem, bet tikai no noteikta kopuma;
  • Pēc tam, kad klients ir saņēmis apstiprinājuma politikai atbilstoÅ”u atbilžu skaitu, viņŔ nosÅ«ta darÄ«jumu PasÅ«tÄ«Å”anas dienestam;
  • PasÅ«tÄ«Å”anas pakalpojums Ä£enerē bloku un nosÅ«ta to visiem apņemÅ”anās partneriem. PasÅ«tÄ«Å”anas pakalpojums nodroÅ”ina secÄ«gu bloku ierakstÄ«Å”anu, kas novērÅ” tā saukto virsgrāmatas dakÅ”iņu (skatÄ«t sadaļu "DakÅ”iņas");
  • Vienaudži saņem bloku, vēlreiz pārbauda apstiprināŔanas politiku, ieraksta bloku blokķēdē un maina stāvokli DB ā€œPasaules stāvoklisā€.

Tie. Tā rezultātā tiek sadalÄ«tas lomas starp mezgliem. Tas nodroÅ”ina, ka blokķēde ir mērogojama un droÅ”a:

  • Viedie lÄ«gumi (ķēdes kods) veic vienaudžu apstiprināŔanu. Tas nodroÅ”ina viedo lÄ«gumu konfidencialitāti, jo to neuzglabā visi dalÄ«bnieki, bet tikai apstiprinoÅ”i vienaudži.
  • PasÅ«tÄ«Å”anai vajadzētu darboties ātri. To nodroÅ”ina fakts, ka PasÅ«tÄ«Å”ana veido tikai bloku un nosÅ«ta to fiksētai lÄ«deru kopai.
  • ApņēmÄ«gie kolēģi glabā tikai blokķēdi - to var bÅ«t daudz, un tiem nav nepiecieÅ”ama liela jauda un tÅ«lÄ«tēja darbÄ«ba.

SÄ«kāku informāciju par Hyperledger Fabric arhitektoniskajiem risinājumiem un to, kāpēc tas darbojas Ŕādi un ne citādi, var atrast Å”eit: ArhitektÅ«ras izcelsme vai Å”eit: Hyperledger Fabric: izplatÄ«ta operētājsistēma atļautajām blokķēdēm.

Tātad Hyperledger Fabric ir patiesi universāla sistēma, ar kuru jūs varat:

  • ÄŖstenot patvaļīgu biznesa loÄ£iku, izmantojot viedo lÄ«gumu mehānismu;
  • IerakstÄ«t un saņemt datus no blokķēdes datu bāzes JSON formātā;
  • PieŔķiriet un pārbaudiet API piekļuvi, izmantojot sertifikācijas iestādi.

Tagad, kad esam mazliet izpratuŔi Hyperledger Fabric specifiku, beidzot darīsim kaut ko noderīgu!

Blokķēdes izvietoÅ”ana

Problēmas paziņojums

Uzdevums ir ieviest Citcoin tÄ«klu ar Ŕādām funkcijām: izveidot kontu, iegÅ«t bilanci, papildināt savu kontu, pārskaitÄ«t monētas no viena konta uz citu. UzzÄ«mēsim objekta modeli, kuru tālāk ieviesÄ«sim viedā lÄ«gumā. Tātad mums bÅ«s konti, kas ir identificēti pēc nosaukumiem un satur atlikumu, kā arÄ« kontu saraksts. Konti un kontu saraksts ir Hyperledger Fabric aktÄ«vu izteiksmē. AttiecÄ«gi tiem ir vēsture un paÅ”reizējais stāvoklis. Es mēģināŔu to skaidri uzzÄ«mēt:

Blockchain: kādu PoC mums vajadzētu izveidot?

Augstākie skaitļi ir paÅ”reizējais stāvoklis, kas tiek saglabāts datu bāzē ā€œPasaules stāvoklisā€. Zem tiem ir skaitļi, kas parāda vēsturi, kas tiek glabāta blokķēdē. AktÄ«vu paÅ”reizējo stāvokli maina darÄ«jumi. AktÄ«vs mainās tikai kopumā, tāpēc darÄ«juma rezultātā tiek izveidots jauns objekts, un lÄ«dzekļa paÅ”reizējā vērtÄ«ba ieiet vēsturē.

IBM mākonis

Mēs izveidojam kontu IBM mākonis. Lai izmantotu blokķēdes platformu, tā ir jājaunina uz Pay-As-You-Go. Å is process var nebÅ«t ātrs, jo... IBM pieprasa papildu informāciju un pārbauda to manuāli. PozitÄ«vi varu teikt, ka IBM ir labi mācÄ«bu materiāli, kas ļauj izvietot Hyperledger Fabric viņu mākonÄ«. Man patika Ŕādas rakstu un piemēru sērijas:

Tālāk ir sniegti IBM Blockchain platformas ekrānuzņēmumi. Å Ä« nav instrukcija par blokķēdes izveidi, bet gan vienkārÅ”i uzdevuma apjoma demonstrācija. Tātad mÅ«su mērÄ·iem mēs izveidojam vienu organizāciju:

Blockchain: kādu PoC mums vajadzētu izveidot?

Mēs tajā izveidojam mezglus: Pasūtītājs CA, Org1 CA, Orderer Peer:

Blockchain: kādu PoC mums vajadzētu izveidot?

Mēs veidojam lietotājus:

Blockchain: kādu PoC mums vajadzētu izveidot?

Izveidojiet kanālu un nosauciet to par citcoin:

Blockchain: kādu PoC mums vajadzētu izveidot?

Būtībā kanāls ir blokķēde, tāpēc tas sākas ar nulles bloku (Genesis bloks):

Blockchain: kādu PoC mums vajadzētu izveidot?

Gudra līguma rakstīŔana

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

Intuitīvi visam Ŕeit jābūt skaidram:

  • Ir vairākas funkcijas (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance), kuras demonstrācijas programma izsauks, izmantojot Hyperledger Fabric API.
  • Funkcijas SendFrom un RefillBalance Ä£enerē notikumus, ko saņems demonstrācijas programma.
  • Instantiācijas funkcija tiek izsaukta vienreiz, kad tiek izveidots viedlÄ«gums. Faktiski to sauc ne tikai vienu reizi, bet katru reizi, kad mainās viedā lÄ«guma versija. Tāpēc saraksta inicializācija ar tukÅ”u masÄ«vu ir slikta ideja, jo Tagad, mainot viedā lÄ«guma versiju, mēs zaudēsim paÅ”reizējo sarakstu. Bet tas ir labi, es tikai mācos).
  • Konti un kontu saraksts ir JSON datu struktÅ«ras. JS tiek izmantots datu manipulācijām.
  • AktÄ«va paÅ”reizējo vērtÄ«bu var iegÅ«t, izmantojot funkcijas getState izsaukumu, un atjaunināt to, izmantojot putState.
  • Veidojot kontu, tiek izsaukta funkcija AddAccount, kurā tiek veikts salÄ«dzinājums maksimālajam kontu skaitam blokķēdē (maxAccounts = 5). Un Å”eit ir jamb (vai esat pamanÄ«juÅ”i?), kas noved pie bezgalÄ«gas kontu skaita palielināŔanās. No Ŕādām kļūdām ir jāizvairās)

Pēc tam mēs ielādējam viedo līgumu kanālā un izveidojam to:

Blockchain: kādu PoC mums vajadzētu izveidot?

Apskatīsim Smart Contract instalēŔanas darījumu:

Blockchain: kādu PoC mums vajadzētu izveidot?

Apskatīsim sīkāku informāciju par mūsu kanālu:

Blockchain: kādu PoC mums vajadzētu izveidot?

Rezultātā mēs iegÅ«stam Ŕādu blokķēdes tÄ«kla diagrammu IBM mākonÄ«. Diagrammā parādÄ«ta arÄ« demonstrācijas programma, kas darbojas Amazon mākonÄ« virtuālajā serverÄ« (vairāk par to nākamajā sadaļā):

Blockchain: kādu PoC mums vajadzētu izveidot?

GUI izveide Hyperledger Fabric API izsaukumiem

Hyperledger Fabric ir API, ko var izmantot, lai:

  • Izveidot kanālu;
  • Savienojumi vienādranga kanālā;
  • Viedo lÄ«gumu uzstādÄ«Å”ana un instantiācija kanālā;
  • Zvanu darÄ«jumi;
  • PieprasÄ«t informāciju par blokķēdi.

Lietojumprogrammu izstrāde

Savā demonstrācijas programmā API izmantosim tikai, lai izsauktu darÄ«jumus un pieprasÄ«tu informāciju, jo Mēs jau esam pabeiguÅ”i atlikuŔās darbÄ«bas, izmantojot IBM blokķēdes platformu. Mēs rakstām GUI, izmantojot standarta tehnoloÄ£iju steku: Express.js + Vue.js + Node.js. Par to, kā sākt veidot modernas tÄ«mekļa lietojumprogrammas, varat uzrakstÄ«t atseviŔķu rakstu. Å eit atstāŔu saiti uz lekciju ciklu, kas man patika visvairāk: Full Stack Web App, izmantojot Vue.js un Express.js. Rezultāts ir klienta-servera lietojumprogramma ar pazÄ«stamu grafisko interfeisu Google materiāla dizaina stilā. REST API starp klientu un serveri sastāv no vairākiem izsaukumiem:

  • HyperledgerDemo/v1/init ā€” inicializē blokķēdi;
  • HyperledgerDemo/v1/accounts/list ā€” iegÅ«stiet visu kontu sarakstu;
  • HyperledgerDemo/v1/account?name=Bob&balance=100 ā€” izveidojiet Boba kontu;
  • HyperledgerDemo/v1/info?account=Bob ā€” iegÅ«stiet informāciju par Boba kontu;
  • HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 ā€” pārsÅ«tiet divas monētas no Boba Alisei;
  • HyperledgerDemo/v1/disconnect ā€” aizveriet savienojumu ar blokķēdi.

API apraksts ar iekļautajiem piemēriem Pastnieka vietne - plaÅ”i pazÄ«stama programma HTTP API testÄ“Å”anai.

Demo lietojumprogramma Amazon mākonī

Es augÅ”upielādēju lietojumprogrammu Amazon, jo... IBM joprojām nav varējis jaunināt manu kontu un ļaut izveidot virtuālos serverus. Kā domēnam pievienot Ä·irÅ”u: www.citcoin.info. Es kādu laiku paturÄ“Å”u serveri ieslēgtu, tad izslēgÅ”u, jo... Ä«res centi pil, un citcoin monētas vēl nav kotētas biržā) Rakstā iekļauju demonstrācijas ekrānŔāviņus, lai darba loÄ£ika bÅ«tu skaidra. Demonstrācijas lietojumprogramma var:

  • Inicializējiet blokķēdi;
  • Izveidot Kontu (bet tagad nevar izveidot jaunu Kontu, jo blokķēdē ir sasniegts maksimālais viedlÄ«gumā norādÄ«tais kontu skaits);
  • Saņemt kontu sarakstu;
  • PārsÅ«tiet citcoin monētas starp Alisi, Bobu un Aleksu;
  • Saņem notikumus (taču tagad nav iespējas parādÄ«t notikumus, tāpēc vienkārŔības labad interfeiss saka, ka pasākumi netiek atbalstÄ«ti);
  • Žurnāla darbÄ«bas.

Vispirms inicializējam blokķēdi:

Blockchain: kādu PoC mums vajadzētu izveidot?

Tālāk mēs izveidojam savu kontu, netērējot laiku ar bilanci:

Blockchain: kādu PoC mums vajadzētu izveidot?

Mēs saņemam visu pieejamo kontu sarakstu:

Blockchain: kādu PoC mums vajadzētu izveidot?

Mēs izvēlamies sūtītāju un saņēmēju un iegūstam viņu atlikumus. Ja sūtītājs un saņēmējs ir viens un tas pats, tad viņa konts tiks papildināts:

Blockchain: kādu PoC mums vajadzētu izveidot?

Žurnālā mēs uzraugām darījumu izpildi:

Blockchain: kādu PoC mums vajadzētu izveidot?

Patiesībā tas viss ir ar demonstrācijas programmu. Zemāk varat redzēt mūsu darījumu blokķēdē:

Blockchain: kādu PoC mums vajadzētu izveidot?

Un vispārējais darījumu saraksts:

Blockchain: kādu PoC mums vajadzētu izveidot?

LÄ«dz ar to mēs esam veiksmÄ«gi pabeiguÅ”i PoC ievieÅ”anu, lai izveidotu Citcoin tÄ«klu. Kas vēl jādara, lai Citcoin kļūtu par pilnvērtÄ«gu monētu pārsÅ«tÄ«Å”anas tÄ«klu? Ä»oti mazs:

  • Konta izveides posmā ieviesiet privātās/publiskās atslēgas Ä£enerÄ“Å”anu. Privātā atslēga ir jāglabā pie konta lietotāja, publiskā atslēga ir jāglabā blokķēdē.
  • Veiciet monētu pārskaitÄ«jumu, kurā lietotāja identificÄ“Å”anai tiek izmantota publiskā atslēga, nevis vārds.
  • Å ifrējiet darÄ«jumus, kas tiek nosÅ«tÄ«ti no lietotāja uz serveri, izmantojot viņa privāto atslēgu.

Secinājums

Esam ieviesuÅ”i Citcoin tÄ«klu ar Ŕādām funkcijām: pievienot kontu, iegÅ«t atlikumu, papildināt savu kontu, pārskaitÄ«t monētas no viena konta uz citu. Tātad, cik mums izmaksāja PoC izveidoÅ”ana?

  • Jums ir jāizpēta blokķēde kopumā un jo Ä«paÅ”i Hyperledger Fabric;
  • IemācÄ«ties izmantot IBM vai Amazon mākoņus;
  • ApgÅ«stiet JS programmÄ“Å”anas valodu un kādu tÄ«mekļa ietvaru;
  • Ja daži dati ir jāuzglabā nevis blokķēdē, bet atseviŔķā datu bāzē, tad iemācieties integrēt, piemēram, ar PostgreSQL;
  • Un visbeidzot, bet ne mazāk svarÄ«gi ā€” jÅ«s nevarat dzÄ«vot mÅ«sdienu pasaulē bez zināŔanām par Linux!)

Protams, tā nav raķeŔu zinātne, bet jums būs smagi jāstrādā!

Avoti vietnē GitHub

Uzlikti avoti GitHub. ÄŖss repozitorija apraksts:
Katalogs Ā«serverisĀ» ā€” Node.js serveris
Katalogs Ā«klientsĀ» ā€” Node.js klients
Katalogs Ā«blockchain"(parametru vērtÄ«bas un atslēgas, protams, nedarbojas un ir norādÄ«tas tikai kā piemērs):

  • lÄ«gums ā€” viedā lÄ«guma avota kods
  • maku ā€” lietotāja atslēgas Hyperledger Fabric API lietoÅ”anai.
  • *.cds ā€” viedo lÄ«gumu apkopotās versijas
  • *.json faili ā€” konfigurācijas failu piemēri Hyperledger Fabric API lietoÅ”anai

Tas ir tikai sākums!

Avots: www.habr.com

Pievieno komentāru