Blockchain: çfarë PoC duhet të ndërtojmë?

Sytë e tu kanë frikë dhe duart të kruhen!

Në artikujt e mëparshëm, ne trajtuam teknologjitë mbi të cilat ndërtohen blockchains (Çfarë duhet të ndërtojmë një blockchain?) dhe rastet që mund të zbatohen me ndihmën e tyre (Pse duhet të ndërtojmë një rast?). Është koha për të punuar me duart tuaja! Për të zbatuar pilotët dhe PoC (Proof of Concept), preferoj të përdor retë, sepse... ato mund të aksesohen nga kudo në botë dhe, shpesh, nuk ka nevojë të humbet kohë për instalimin e lodhshëm të mjedisit, sepse Ka konfigurime të paracaktuara. Pra, le të bëjmë diçka të thjeshtë, për shembull, një rrjet për transferimin e monedhave midis pjesëmarrësve dhe le ta quajmë me modesti Bitcoin. Për këtë ne do të përdorim cloud IBM dhe blockchain universal Hyperledger Fabric. Së pari, le të kuptojmë pse Hyperledger Fabric quhet një blockchain universal?

Blockchain: çfarë PoC duhet të ndërtojmë?

Hyperledger Fabric - një blockchain universal

Në përgjithësi, një sistem informacioni universal është:

  • Një grup serverësh dhe një bërthamë softuerike që kryen logjikën e biznesit;
  • Ndërfaqet për ndërveprim me sistemin;
  • Mjete për regjistrimin, vërtetimin dhe autorizimin e pajisjeve/personave;
  • Baza e të dhënave që ruan të dhëna operative dhe arkivore:

Blockchain: çfarë PoC duhet të ndërtojmë?

Versioni zyrtar i asaj që është Hyperledger Fabric mund të lexohet në Online, dhe me pak fjalë, Hyperledger Fabric është një platformë me burim të hapur që ju lejon të ndërtoni blloqe private dhe të ekzekutoni kontrata të zgjuara arbitrare të shkruara në gjuhët e programimit JS dhe Go. Le të shohim në detaje arkitekturën e Hyperledger Fabric dhe të sigurohemi që ky është një sistem universal që ka vetëm specifika për ruajtjen dhe regjistrimin e të dhënave. Specifikimi është se të dhënat, si në të gjitha blockchain, ruhen në blloqe që vendosen në blockchain vetëm nëse pjesëmarrësit arrijnë një konsensus dhe pas regjistrimit të dhënat nuk mund të korrigjohen ose fshihen në heshtje.

Arkitektura e pëlhurave Hyperledger

Diagrami tregon arkitekturën Hyperledger Fabric:

Blockchain: çfarë PoC duhet të ndërtojmë?

Organizatat — organizatat përmbajnë kolegë, d.m.th. blockchain ekziston për shkak të mbështetjes së organizatave. Organizata të ndryshme mund të jenë pjesë e të njëjtit kanal.

kanal — një strukturë logjike që bashkon bashkëmoshatarët në grupe, d.m.th. është specifikuar blockchain. Hyperledger Fabric mund të përpunojë njëkohësisht zinxhirë të shumtë bllokues me logjikë të ndryshme biznesi.

Ofruesi i Shërbimeve të Anëtarësimit (MSP) është një AK (Autoriteti Certifikues) për lëshimin e identitetit dhe caktimin e roleve. Për të krijuar një nyje, duhet të ndërveproni me MSP.

Nyjet e kolegëve — verifikoni transaksionet, ruani blockchain, ekzekutoni kontrata inteligjente dhe ndërveproni me aplikacionet. Peers kanë një identitet (certifikatë dixhitale), e cila lëshohet nga MSP. Ndryshe nga rrjeti Bitcoin ose Etherium, ku të gjitha nyjet kanë të drejta të barabarta, në Hyperledger nyjet Fabric luajnë role të ndryshme:

  • Bashkëmoshatar ndoshta duke miratuar bashkëmoshatarin (EP) dhe ekzekutoni kontrata inteligjente.
  • Angazhimi i kolegëve (CP) - ruani vetëm të dhënat në blockchain dhe përditësoni "gjendjen botërore".
  • Spirancë Peer (AP) - nëse disa organizata marrin pjesë në blockchain, atëherë kolegët e ankorimit përdoren për komunikim midis tyre. Çdo organizatë duhet të ketë një ose më shumë kolegë ankorues. Duke përdorur AP, çdo koleg në një organizatë mund të marrë informacion për të gjithë kolegët në organizata të tjera. Përdoret për të sinkronizuar informacionin midis AP-ve protokolli i thashethemeve.
  • Lider Peer — nëse një organizatë ka disa kolegë, atëherë vetëm drejtuesi i kolegëve do të marrë blloqe nga shërbimi i porositjes dhe do t'ia japë ato pjesës tjetër të kolegëve. Lideri mund të specifikohet në mënyrë statike ose të zgjidhet në mënyrë dinamike nga kolegët në organizatë. Protokolli i thashethemeve përdoret gjithashtu për të sinkronizuar informacionin rreth udhëheqësve.

Aktive — subjektet që kanë vlerë dhe ruhen në blockchain. Më konkretisht, këto janë të dhëna me vlerë kyçe në formatin JSON. Janë këto të dhëna që regjistrohen në Blockchain. Ata kanë një histori, e cila ruhet në blockchain, dhe një gjendje aktuale, e cila ruhet në bazën e të dhënave “World State”. Strukturat e të dhënave plotësohen në mënyrë arbitrare në varësi të detyrave të biznesit. Nuk ka fusha të detyrueshme, rekomandimi i vetëm është që asetet duhet të kenë një pronar dhe të jenë të vlefshme.

libër i llogarive — përbëhet nga baza e të dhënave Blockchain dhe e gjendjes Word, e cila ruan gjendjen aktuale të aseteve. Shteti botëror përdor LevelDB ose CouchDB.

Kontratë inteligjente — duke përdorur kontratat inteligjente, zbatohet logjika e biznesit të sistemit. Në Hyperledger Fabric, kontratat inteligjente quhen kodi zinxhir. Duke përdorur kodin zinxhir, specifikohen asetet dhe transaksionet mbi to. Në terma teknikë, kontratat inteligjente janë module softuerike të implementuara në gjuhët e programimit JS ose Go.

Politika e miratimit — për secilin kod zinxhir, mund të vendosni një politikë se sa konfirmime duhet të priten për një transaksion dhe nga kush. Nëse politika nuk është caktuar, atëherë parazgjedhja është: "transaksioni duhet të konfirmohet nga çdo anëtar i çdo organizate në kanal". Shembuj të politikave:

  • Transaksioni duhet të miratohet nga çdo administrator i organizatës;
  • Duhet të konfirmohet nga çdo anëtar ose klient i organizatës;
  • Duhet të konfirmohet nga çdo organizatë homologe.

Shërbimi i porositjes — paketon transaksionet në blloqe dhe ua dërgon ato kolegëve në kanal. Garanton dërgimin e mesazheve për të gjithë kolegët në rrjet. Përdoret për sisteme industriale Ndërmjetësi i mesazheve të Kafkës, për zhvillim dhe testim I vetëm.

CallFlow

Blockchain: çfarë PoC duhet të ndërtojmë?

  • Aplikacioni komunikon me Hyperledger Fabric duke përdorur Go, Node.js ose Java SDK;
  • Klienti krijon një transaksion tx dhe ia dërgon atë kolegëve miratues;
  • Peer verifikon nënshkrimin e klientit, përfundon transaksionin dhe ia dërgon nënshkrimin e miratimit përsëri klientit. Kodi i zinxhirit ekzekutohet vetëm në kolegun mbështetës dhe rezultati i ekzekutimit të tij u dërgohet të gjithë kolegëve. Ky algoritëm i punës quhet konsensus PBFT (Practical Byzantine Fault Tolerant). Ndryshon nga BFT klasik fakti që mesazhi dërgohet dhe konfirmimi pritet jo nga të gjithë pjesëmarrësit, por vetëm nga një grup i caktuar;
  • Pasi klienti të ketë marrë numrin e përgjigjeve që korrespondojnë me politikën e miratimit, ai e dërgon transaksionin në shërbimin e porositjes;
  • Shërbimi i porositjes gjeneron një bllok dhe ia dërgon të gjithë kolegëve që angazhohen. Shërbimi i porositjes siguron regjistrimin vijues të blloqeve, i cili eliminon të ashtuquajturën pirun të librit (shih seksionin "Punët");
  • Bashkëmoshatarët marrin një bllok, kontrollojnë përsëri politikën e miratimit, shkruajnë bllokun në zinxhirin e bllokut dhe ndryshojnë gjendjen në DB "World State".

Ato. Kjo rezulton në një ndarje të roleve midis nyjeve. Kjo siguron që blockchain të jetë i shkallëzueshëm dhe i sigurt:

  • Kontratat inteligjente (chaincode) kryejnë miratimin e kolegëve. Kjo siguron konfidencialitetin e kontratave inteligjente, sepse ai nuk ruhet nga të gjithë pjesëmarrësit, por vetëm duke miratuar kolegët.
  • Porositja duhet të funksionojë shpejt. Kjo sigurohet nga fakti se Renditja formon vetëm një bllok dhe ia dërgon atë një grupi fiks kolegësh drejtues.
  • Angazhimi i kolegëve ruan vetëm blockchain - mund të ketë shumë prej tyre dhe nuk kërkojnë shumë energji dhe funksionim të menjëhershëm.

Më shumë detaje mbi zgjidhjet arkitekturore të Hyperledger Fabric dhe pse funksionon në këtë mënyrë dhe jo ndryshe mund të gjenden këtu: Origjina e Arkitekturës ose këtu: Pëlhurë Hyperledger: Një Sistem Operativ i Shpërndarë për Blockchains të lejuara.

Pra, Hyperledger Fabric është një sistem vërtet universal me të cilin mund të:

  • Zbatoni logjikën arbitrare të biznesit duke përdorur mekanizmin e kontratës inteligjente;
  • Regjistroni dhe merrni të dhëna nga baza e të dhënave blockchain në formatin JSON;
  • Jepni dhe verifikoni qasjen në API duke përdorur Autoritetin e Certifikatës.

Tani që kuptojmë pak për specifikat e Hyperledger Fabric, le të bëjmë më në fund diçka të dobishme!

Vendosja e blockchain

Formulimi i problemit

Detyra është të zbatoni rrjetin Citcoin me funksionet e mëposhtme: krijoni një llogari, merrni një bilanc, mbushni llogarinë tuaj, transferoni monedha nga një llogari në tjetrën. Le të vizatojmë një model objekti, të cilin do ta zbatojmë më tej në një kontratë inteligjente. Pra, do të kemi llogari që identifikohen me emra dhe përmbajnë një bilanc dhe një listë llogarish. Llogaritë dhe një listë llogarish janë, për sa i përket aseteve Hyperledger Fabric. Prandaj, ata kanë një histori dhe një gjendje aktuale. Do të përpiqem ta vizatoj qartë këtë:

Blockchain: çfarë PoC duhet të ndërtojmë?

Shifrat kryesore janë gjendja aktuale, e cila ruhet në bazën e të dhënave “World State”. Më poshtë janë figurat që tregojnë historinë që ruhet në blockchain. Gjendja aktuale e aktiveve ndryshon nga transaksionet. Aseti ndryshon vetëm në tërësi, kështu që si rezultat i transaksionit, krijohet një objekt i ri dhe vlera aktuale e aktivit shkon në histori.

IBM Cloud

Ne krijojmë një llogari në re IBM. Për të përdorur platformën blockchain, ajo duhet të përmirësohet në Pay-As-You-Go. Ky proces mund të mos jetë i shpejtë, sepse... IBM kërkon informacion shtesë dhe e verifikon atë manualisht. Në një shënim pozitiv, mund të them se IBM ka materiale të mira trajnimi që ju lejojnë të vendosni Hyperledger Fabric në renë e tyre. Më pëlqeu seria e mëposhtme e artikujve dhe shembujve:

Më poshtë janë pamjet e ekranit të platformës IBM Blockchain. Ky nuk është një udhëzim se si të krijoni një blockchain, por thjesht një demonstrim i fushës së detyrës. Pra, për qëllimet tona, ne bëjmë një Organizatë:

Blockchain: çfarë PoC duhet të ndërtojmë?

Ne krijojmë nyje në të: Orderer CA, Org1 CA, Orderer Peer:

Blockchain: çfarë PoC duhet të ndërtojmë?

Ne krijojmë përdorues:

Blockchain: çfarë PoC duhet të ndërtojmë?

Krijoni një kanal dhe quani atë citcoin:

Blockchain: çfarë PoC duhet të ndërtojmë?

Në thelb Channel është një blockchain, kështu që fillon me bllokun zero (blloku i Zanafillës):

Blockchain: çfarë PoC duhet të ndërtojmë?

Shkrimi i një kontrate të zgjuar

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

Intuitivisht, gjithçka duhet të jetë e qartë këtu:

  • Ka disa funksione (AddAccount, GetAccounts, SendFrom, GetBalance, RefillBalance) që programi demo do t'i thërrasë duke përdorur Hyperledger Fabric API.
  • Funksionet SendFrom dhe RefillBalance gjenerojnë Ngjarje që do të marrë programi demo.
  • Funksioni i çastit thirret një herë kur instantohet një kontratë inteligjente. Në fakt, quhet jo vetëm një herë, por çdo herë që ndryshon versioni i kontratës inteligjente. Prandaj, inicializimi i një liste me një grup bosh është një ide e keqe, sepse Tani, kur ndryshojmë versionin e kontratës inteligjente, do të humbasim listën aktuale. Por është në rregull, thjesht po mësoj).
  • Llogaritë dhe një listë llogarish janë struktura të të dhënave JSON. JS përdoret për manipulimin e të dhënave.
  • Mund të merrni vlerën aktuale të një aktivi duke përdorur thirrjen e funksionit getState dhe ta përditësoni atë duke përdorur putState.
  • Kur krijoni një Llogari, thirret funksioni AddAccount, në të cilin bëhet një krahasim për numrin maksimal të llogarive në blockchain (maxAccounts = 5). Dhe këtu ka një bllokim (e keni vënë re?), i cili çon në një rritje të pafund të numrit të llogarive. Gabimet e tilla duhen shmangur)

Më pas, ngarkojmë kontratën inteligjente në Kanal dhe e instantojmë atë:

Blockchain: çfarë PoC duhet të ndërtojmë?

Le të shohim transaksionin për instalimin e Kontratës Smart:

Blockchain: çfarë PoC duhet të ndërtojmë?

Le të shohim detajet rreth kanalit tonë:

Blockchain: çfarë PoC duhet të ndërtojmë?

Si rezultat, marrim diagramin e mëposhtëm të një rrjeti blockchain në renë IBM. Diagrami tregon gjithashtu një program demo që funksionon në cloud Amazon në një server virtual (më shumë rreth tij në seksionin vijues):

Blockchain: çfarë PoC duhet të ndërtojmë?

Krijimi i një GUI për thirrjet Hyperledger Fabric API

Hyperledger Fabric ka një API që mund të përdoret për:

  • Krijo kanal;
  • Lidhje nga kolegët në kanal;
  • Instalimi dhe instancimi i kontratave smart në kanal;
  • Transaksionet e thirrjes;
  • Kërkoni informacion mbi blockchain.

Zhvillimi i aplikacionit

Në programin tonë demo ne do të përdorim API-në vetëm për të thirrur transaksione dhe për të kërkuar informacion, sepse Ne kemi përfunduar tashmë hapat e mbetur duke përdorur platformën blockchain IBM. Ne shkruajmë një GUI duke përdorur një grup standard teknologjie: Express.js + Vue.js + Node.js. Ju mund të shkruani një artikull të veçantë se si të filloni të krijoni aplikacione moderne në internet. Këtu do të lë një lidhje me serinë e leksioneve që më pëlqeu më shumë: Aplikacioni Ueb i Full Stack duke përdorur Vue.js & Express.js. Rezultati është një aplikacion klient-server me një ndërfaqe grafike të njohur në stilin Material Design të Google. API REST midis klientit dhe serverit përbëhet nga disa thirrje:

  • HyperledgerDemo/v1/init - inicializoni blockchain;
  • HyperledgerDemo/v1/accounts/list — merrni një listë të të gjitha llogarive;
  • HyperledgerDemo/v1/account?name=Bob&balance=100 — krijoni llogarinë Bob;
  • HyperledgerDemo/v1/info?account=Bob — merrni informacion rreth llogarisë Bob;
  • HyperledgerDemo/v1/transaction?from=Bob&to=Alice&volume=2 — transferoni dy monedha nga Bob tek Alice;
  • HyperledgerDemo/v1/disconnect - mbyllni lidhjen me blockchain.

Përshkrimi i API-së me shembuj të përfshirë në Uebsajti i postierit - një program i njohur për testimin e HTTP API.

Aplikim demo në cloud Amazon

E ngarkova aplikacionin në Amazon sepse... IBM ende nuk ka qenë në gjendje të përmirësojë llogarinë time dhe të më lejojë të krijoj serverë virtualë. Si të shtoni një qershi në domen: www.citcoin.info. Do ta mbaj serverin të ndezur për një kohë, pastaj do ta fik, sepse... cent për qira po pikon, dhe monedhat citcoin nuk janë ende të listuara në bursë) Unë po përfshij pamjet e ekranit të demonstrimit në artikull në mënyrë që logjika e punës të jetë e qartë. Aplikacioni demo mund të:

  • Inicializoni blockchain;
  • Krijoni një llogari (por tani nuk mund të krijoni një llogari të re, sepse numri maksimal i llogarive të specifikuara në kontratën inteligjente është arritur në blockchain);
  • Merrni një listë të llogarive;
  • Transferoni monedha citcoin midis Alice, Bob dhe Alex;
  • Merrni ngjarje (por tani nuk ka asnjë mënyrë për të shfaqur ngjarjet, kështu që për thjeshtësi ndërfaqja thotë që ngjarjet nuk mbështeten);
  • Veprimet e regjistrit.

Së pari ne inicializojmë blockchain:

Blockchain: çfarë PoC duhet të ndërtojmë?

Tjetra, ne krijojmë llogarinë tonë, mos humbni kohë me bilancin:

Blockchain: çfarë PoC duhet të ndërtojmë?

Ne marrim një listë të të gjitha llogarive të disponueshme:

Blockchain: çfarë PoC duhet të ndërtojmë?

Ne zgjedhim dërguesin dhe marrësin dhe marrim bilancet e tyre. Nëse dërguesi dhe marrësi janë të njëjtë, atëherë llogaria e tij do të rimbushet:

Blockchain: çfarë PoC duhet të ndërtojmë?

Në regjistër ne monitorojmë ekzekutimin e transaksioneve:

Blockchain: çfarë PoC duhet të ndërtojmë?

Në fakt, kjo është e gjitha me programin demo. Më poshtë mund të shihni transaksionin tonë në blockchain:

Blockchain: çfarë PoC duhet të ndërtojmë?

Dhe lista e përgjithshme e transaksioneve:

Blockchain: çfarë PoC duhet të ndërtojmë?

Me këtë, ne kemi përfunduar me sukses zbatimin e PoC për të krijuar rrjetin Citcoin. Çfarë tjetër duhet bërë që Citcoin të bëhet një rrjet i plotë për transferimin e monedhave? Shume pak:

  • Në fazën e krijimit të llogarisë, zbatoni gjenerimin e një çelësi privat / publik. Çelësi privat duhet të ruhet me përdoruesin e llogarisë, çelësi publik duhet të ruhet në blockchain.
  • Bëni një transferim të monedhës në të cilin një çelës publik, në vend të një emri, përdoret për të identifikuar përdoruesin.
  • Enkriptoni transaksionet që shkojnë nga përdoruesi në server me çelësin e tij privat.

Përfundim

Ne kemi implementuar rrjetin Citcoin me funksionet e mëposhtme: shtoni një llogari, merrni një bilanc, mbushni llogarinë tuaj, transferoni monedha nga një llogari në tjetrën. Pra, çfarë na kushtoi për të ndërtuar një PoC?

  • Ju duhet të studioni blockchain në përgjithësi dhe Hyperledger Fabric në veçanti;
  • Mësoni të përdorni retë IBM ose Amazon;
  • Mësoni gjuhën e programimit JS dhe disa kornizë web;
  • Nëse disa të dhëna duhet të ruhen jo në blockchain, por në një bazë të dhënash të veçantë, atëherë mësoni të integroheni, për shembull, me PostgreSQL;
  • Dhe e fundit por jo më pak e rëndësishme - nuk mund të jetoni në botën moderne pa njohuri për Linux!)

Sigurisht, nuk është shkencë raketash, por do të duhet të punoni shumë!

Burimet në GitHub

Burimet vënë në GitHub. Përshkrim i shkurtër i depove:
Katalog «server» — Serveri Node.js
Katalog «klient» — Klienti Node.js
Katalog «Blockchain"(vlerat dhe çelësat e parametrave, natyrisht, nuk funksionojnë dhe jepen vetëm si shembull):

  • kontratë - kodi burim i kontratës inteligjente
  • portofol - çelësat e përdoruesit për përdorimin e Hyperledger Fabric API.
  • *.cds - versione të përpiluara të kontratave inteligjente
  • Skedarët *.json - shembuj të skedarëve të konfigurimit për përdorimin e Hyperledger Fabric API

Është vetëm fillimi!

Burimi: www.habr.com

Shto një koment